一、基础语法

163 阅读4分钟

java基础学习的文章目录

一、注释

  • 每一条语句都必须以;结尾
  • java中的方法,就是其他语言中的函数
  • 程序的入口是main方法
  • 方法必须包含在class内部,现有class,再有方法

关于左大括号{ 的位置

推荐放在函数名后面

疑问

如果java项目中有两个不同的class,他们都有自己的main方法,那岂不是又两个java程序入口?

只能选择其中一个入口开始执行程序

注释

  • java的注释有三种格式
  • 单行注释
  • 多行注释
  • 文档注释
  • 多行注释不能嵌套

二、数据类型

java的主要数据类型为2大类

  • 基本类型
    • byte 8bit
    • short
    • int
    • long
    • float
    • double
    • boolean
    • char 16bit
  • 引用类型 引用类型变量存储的值是对象的地址值。

变量的初始化

  1. 任何变量在使用之前都必须初始化(赋值)
  2. 局部变量需要程序员手动初始化
  3. 非局部变量、类变量:编译器会自动给未初始化的变量设置一个值
类型默认初始值
byte
short
int
long
float
double
char'\u0000'
booleanfalse
对象null

三、运算符

运算符优先级
后缀expr++, expr--
一元++expr --expr +expr -expr ~ !
乘除模* %
加减+ -
位移<< >> >>>
关系< > <= >= instanceof
等价== !=
按位与&
按位异或^
按位""
逻辑与&&
逻辑或||
三元?:
赋值=

字符串拼接

可以使用+号进行拼接

位运算

  • >> >>>
    • >> 有符号右移: 最左用符号位补齐
    • >>> 有符号右移: 最左边用0补齐
    • 对于正数来说两者没有区别
  • &、|、^ 也能用在boolean类型上 对比&&、|| 少了短路

四、类型转换(Type Conversion)

  • widening Primitive Conversion
    • 数据范围小的转换为数据范围大的,自动转换【隐式转】
  • Narrowing Primitive Conversion
    • 数据范围大的转换为数据范围小的,可能会丢失精度和范围,需要强制转换

一元数字提升 Unary Numeric Promotion

一元数字提升: 将byte 、short、 char 类型的一元数字自动提升为int类型 (拓宽基本类型转换)

  • 数组的索引
  • 一元运算符+
  • 一元运算符-
  • 按位取反 ~
public static void main(String[] args) {
    int array = {11, 22, 33, 44}
    char index = 10;
    array[]
}
	public static void main(String[] args) {
		char c = 'A';
		System.out.println(c); //A , A的ascii码是65
		System.out.println(+c); // 65 说明转换为了int
	}

二元数字提升 Binary Numeric Promotion

二元数字提升:提升一个或两个数字(拓宽基本类型转换)

  • 如果其中一个数字位double类型,另外一个就会被转化为double类型,实际上就是转换为大的那个。
  • 否则,如果一个数字是float类型,那么另外一个被转换为float类型
  • 否则,如果任意一个数字是long类型,那么另一个就会被转换为long类型
  • 否则两个都被转换为int类型

五、关键字

  • 虽然goto、const 未被使用,但也属于关键字
  • true、false、null 不是关键字,是字面量

标识符

  • java字母

  • java数字

  • 必须由字母开头

  • 命名建议:小驼峰

  • 类名命名建议:大驼峰

  • 全局常量:全部大写

  • java字母: Character.isJavaIdentifierStart();方法返回true的字符

  • Character.isJavaIdentifierPart('h'); 是否是java标识符的一部分

六、数组

public static void main(String[] args) {
		int [] arr1;
		int [] arr2 = {};
		int arr3[] = {};
		
		//定义的时候指定数组元素
		int [] arr4 = new int [] {11,22,33,44};
		int [] arr5 = {11,22,33,44};
		
		//定义数组的时候指定数组的长度
		int [] arr6 = new int [4];
		arr6[0] = 1;
	}

java中,字符数组!= 字符串

  • 字符数组 : char []
  • 字符串: String

java堆空间的内存申请回自动初始化

数组的遍历

		int [] arr6 = new int [4];
		arr6[0] = 1;
		for (int e = 0; e < arr6.length; e++) {
			System.out.println(arr6[e]);
		}
		// 1 0 0 0
		
		for (int e : arr6) {
			System.out.println(e);
		}

七、方法

可变参数

	public static void main(String[] args) {
		System.out.println(sum()); //0
		System.out.println(sum(10, 20)); //30
		
	}
	
	static public int sum(int ... elements) {
		int sum = 0;
		for (int i : elements) {
			sum += i;
		}
		return sum;
	}

eclipse中关联JDK源码

右击jar -> Properties -> java Source Attach -> apply

参数传递

  • 基本类型作为参数是值传递
  • 引用类型作为参数是引用传递,地址传递

八、方法签名(Method Signature)

方法签名由两部分组成: 方法名、参数类型

	//该方法的方法签名为:sum(int , long , double)
	public static double sum(int i, long l, double d) {
		return i + l + d;
	}
  • 在同一个类中,不能定义两个方法签名一样的方法

方法重载(overLoad)

方法名相同,签名不同

九、栈帧(Frame)

栈帧随着方法的调用而创建,随着方法结束而销毁,存储了方法的局部变量信息

递归调用

  • 如果递归调用没有终止,将会一直消耗栈空间
  • 最终导致栈内存溢出 Stack Overflow
  • 所以必须要有一个明确的结束递归的条件
    • 也叫做边界条件、递归基
	public static void main(String[] args) {
		System.out.println(sum(4)); //10
	}
	
	public static int sum(int n) {
		if (n <= 1) {
			return n;
		}
		return n + sum(n-1);
	}