面向对象三大特征
一、封装
通过使用访问控制符
1、将对象的的成员变量和实现细节隐藏起来,不允许外部直接访问。
2、把方法暴露出来,让方法来控制对这些成员变量进行安全的访问和操作。
二、继承
Java的继承是单继承,通过继承来实现对父类的扩展。
三、多态
同样的事物在不同情况下表现出不同的状态。具体到Java,就是相同类型的变量、调用同一个方法时呈现出多种不同的行为特征。
对象初始化顺序
父类静态初始化块-〉子类静态初始化块-〉父类普通初始化快-〉父类构造器-〉子类普通初始化块-〉子类构造器
自动装箱与自动拆箱
是基本数据类型和其包装类型的相互转化。
查看Integer类源码,-128-127之间的整数自动装箱为Integer实例,并放入一个名为cache的数组中缓存起来。以后-128-127自动装箱成一个Integer实例时,实际上是直接指向对应的数组元素,而把一个不在-128-127范围内的整数自动装箱成Integer实例时,需要重新创建一个实例。
不可变类
1、private和final修饰符来修饰该类的成员变量
2、提供带参构造器,用于根据传入参数初始化成员变量
3、仅提供getter方法
4、有必要的话重写equals()和hashCode()方法
接口和内部类
接口体现的是一种规范,规定了实现者可以向外提供哪些服务。抽象类体现的是一种模板方法模式,根据需求完善父类抽象方法。在用法上二者也有区别:
1、接口只能包含抽象方法、静态方法、默认方法,而抽象类还可以有普通方法。
2、接口只能定义静态常量,而抽象方法还可以定义普通成员变量。
3、接口不包含初始化块,抽象类里可以包含。
重写equals()和hashCode()方法
class A{
int a;
int b;
public int hashCode(){
final int prime=31;
int result=1;
result=prime*result+a;
result=prime*result+b;
return result;
}
public boolean equals(Object obj) {
if(this==obj)
return true;
if(obj==null)
return false;
if(obj.getClass()!=A.class)
return false;
if(this.a!=obj.a || this.b!=obj.b)
return false;
return true;
}
}