1 Java语言特点
Java语言是面向对象的语言,一切皆对象。
面向对象语言的三大特征:封装、继承、多态
- 封装:将数据隐藏,只提供操作数据的方法
- 继承:子类继承父类的属性及方法
- 多态:分为编译时多态和运行时多态,编译时多态指函数重载,运行时多态指父类引用执行子类对象。父类作为参数,可以传入多种子类对象,只有运行时才知道调用的是具体哪个子类中的方法。
还有一个特征是抽象,将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象,抽象出属性和行为。
2 函数重载
Java允许同一个类中出现同名的方法,但是要求参数列表不同。
参数列表指参数类型、参数个数。
返回值不同不能视为函数重载
3 基本数据类型
Java中有8中基本数据类型
- 整型(4种):byte,short,int,long。分别占1,2,4,8个字节
- 浮点型(2种):float,double。分别占4,8个字节
- 字符型(1种):char。占2字节
- 布尔型(1种):boolean。占1字节
Java中的整型都是有符号类型的
字面值赋值时,整型默认为int类型,浮点型默认为double类型,注意溢出。可以加后缀定义float和long这些
4 常量
使用final修饰,只能一次赋值,后续不能赋值。
5 instanceof
只能用于判断对象是否属于该类,不能用于基本数据类型
public static void main(String[] args) {
int i = 10;
System.out.println(i instanceof Object);
}
编译报错
public static void main(String[] args) {
String str = "";
System.out.println(str instanceof Object);
}
返回true
public static void main(String[] args) {
System.out.println(null instanceof Object);
}
null返回的是false
6 包装类
基本数据类型的包装类存在自动装箱和自动拆箱
Integer integer = 30;
int i = integer;
第一行将基本类型自动装箱成包装类,第二行将包装类对象自动拆箱成基本数据类型。
java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
反编译字节码文件,装箱时使用的是valueOf方法。
java/lang/Integer.intValue:()I
自动拆箱使用的是initValue方法
每个包装类有其对应的方法实现自动装箱和自动装箱。
7 为什么设计包装类
Java是面向对象设计语言,包装类的设计就是为了解决基本数据类型具备面向对象特性。有了包装类之后,基本数据类型可以构造成包装类,从而调用对象的方法,作为对象传递等。
除此之外,还有其他的功能,其一就是可以通过包装类的方法将string字符串转换成对应的基本数据类型,其二就是使得可以实现泛型编程,像集合中就用到了很多包装类。因为集合的泛型参数是Object,要包含各种对象,就得使用包装类而不能使用基本数据类型。
总之,包装类是为了更好的面向对象编程而设计的。
8 Integer的缓存区
public static void main(String[] args) {
Integer i1 = 127;
Integer i2 = 127;
Integer i3 = 128;
Integer i4 = 128;
System.out.println(i1 == i2);
System.out.println(i3 == i4);
}
输出
true
false
自动装箱时,调用valueOf方法,这个方法会存在一个缓冲区,-128-127的对象只会存在一个,如果还有则直接将引用指向缓存区的对象。
超过这个范围,则会创建新对象
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
9 重载和重新
重载是指一个类中的同名方法,参数列表不同,这表示不同的方法。不能通过返回值类型来判断重载。通常称为编译时多态。
重写是指拥有继承关系的父类和子类中,子类重写父类的同名方法。重写有两同两小一大的规则
- 方法名相同
- 参数列表相同
- 抛出的异常小于等于父类中的方法
- 返回值类型小于等于父类中方法的返回值(基本数据类型和void类型必须相同)
- 访问权限大于等于父类方法的访问权限
10 equals和==
==比较的是内存中的地址,判断是不是同一个对象。
- 比较的是操作数两边是不是同一个对象
- 两边必须是同一类型才能编译过(可以是父子类型)
- 比较的是地址,基本数据类型比较的是值
equals比较两个内容的对象是否相等,是Object中的方法,Object中默认是==号比较。很多类都重写了equals方法,用于比较内容是否相等。
如果有常量,则将常量放在前面,否则调用equals可能的是null对象,会报空指针异常