6面向对象高级特性
java.lang.object包
- oblect类是所有类的根父类
-
根父类
一个类不管是否显示声明extends Object,它都是Object的子类。数组也是。
-
继承特性
根据继承特性,则所有派生类具有object的属性和方法。
-
多态特性
1、Object类型的引用变量可以接收任何类型的对象 2、Object类型的形参可以接收任何类型的实参
-
- Object 类中的主要方法
-
"=="与equals的区别?
1、==用于比较基本数据,是否相等,相等则为true 用于比较引用数据时,比较的是对象的地址,同一个对象时返回true 2、equals()用于比较对象时 如果没有重写equals()则和==效果一样,比较地址。 重写该方法,则根据自己定义的规则比较。
-
hashcode()
用于计算对象的hash值。 特点:1、如果两个对象的hashCode值不相等,那么这两个对象一定不相等 2、如果两个对象的hashCode值相等,那么这两个对象可能相等,可能不相等 3、如果两个对象调用==或equals相等,那么这两个对象的hashCode值一定相等。
-
toString()方法
1、object类中的toString return getClass().getName() + '@' + Integer.toHexString(hashCode()) 2、在进行String与其它类型数据的连接操作时,自动调用toString()方法 3、可以根据需要在用户自定义类型中重写toString()方法 System.out.println(s1); //相当于System.out.println(s1.toString());
-
finalize()
1、此方法不是程序员手动调用的,而是gc调用的,当一个对象被gc回收之前会调用finalize()(留临终遗言)。 2、每一个对象的该方法只能被调用一次。如果某个对象被重写的finalize()中有一个变量再次引用了this当前对象,那么当前对象就活了,这次gc就不回收此对象。不过,下次再变成垃圾后,gc直接回收它,不在调用finalize(). 3、一般情况下不会重写该方法,只有这个类表示某种连接资源时,FileInputStream或FileOutputStream,可能需要重写,为了该类的对象被gc回收前,释放系统资源。
-
static
-
为什么有static
中国人实例,都有国际属性,每个实例此属性的值一致,因此不必每个实例都存此值,只需要保留一份。
-
static的修饰范围
属性、方法、代码块、内部类
- 静态变量的特点
- 随着类的初始化而初始化,优先于实例对象的创建
- 修饰的成员,被所有对象所共享
- 访问权限允许时,可不创建对象,直接“类名.xx”调用
- 类变量的值存储在方法区
- 类变量的get/set方法也是静态的
- 静态方法也叫类方法,特点
- static修饰的方法,只有访问权限允许,可以通过"类名.方法"访问,因此static的方法也称为类方法。
- 在static方法内部只能访问类变量与类方法(static属性和方法),不能访问类的实例变量和成员方法(非static属性和方法)。
- static方法内部不能有this和super。
- 如果在静态方法中有局部变量与类变量重名,可以使用“本类名.xxx”
- 如果在静态方法中想要访问父类的静态成员,可以使用“父类名.xxx”
- static修饰的方法不能被重写,或者说不会被覆盖
- 静态变量的特点
重写只适用于可见的实例方法,不能用于static、final、private修饰的方法
代码块
-
静态代码块
(1)可以为类变量(静态的属性)初始化 (2)随着类的初始化而初始化,只执行一次 (3)如果子类初始化时,它的父类没有初始化会先初始化父类 (4)在静态代码块中不能访问非静态成员(属性、方法、内部类) (5)在静态代码块中不能使用this和super关键字 如果有重名问题,需要访问本类或父类的静态成员,那么可以使用“本类名.xx”、“父类名.xx” 如果没有重名问题,直接访问即可。
-
非静态代码块
(1)可以为实例变量(非静态的属性)初始化 (2)随着对象的创建而初始化,每创建一个对象,就执行一次 (3)创建子类对象时,需要先为从父类继承的属性进行初始化,所以会导致父类的构造块和构造器先执行 (4)本类的非静态代码块优先于构造器执行
-
初始化顺序
-
类初始化(不创建对象,仅仅初始化类)
第一步,声明类变量的默认值 第二步,类变量显示初始化/静态代码块初始化(这俩同级别,按顺序执行)
-
创建对象
第一步,先类初始化(如上所示) 第二步,声明实例变量(成员变量)默认值 第三步,显示实例变量赋值/非静态代码块赋值(这俩同级别,按顺序执行) 第四步,构造器(有父类的,先就先调用父类的构造器)
-