9.3 继承
注意:在Java中不支持类之间的多重继承(注:Java支持接口之间的多重继承),即不允许一个子类继承多个父类
继承的实现通过在类的声明中加入extends语句来创建一个类的子类:
class SubClass extends SuperClass
{...}
9.4 方法重写
方法重写也称为方法覆盖,指在子类中重新定义父类已有的方法
方法重写的条件:
- 方法名、参数列表和返回值完全相同
- 访问控制范围(public、protected、private、default)不能被缩小
- 抛出的异常不能被扩大
9.5 this()和super()的使用
9.5.1 this()
- this()方法代表的是一个构造方法对其他构造方法的调用
- this()必须放在构造方法的第一行
9.5.2 super()
super()有两种通用形式
- 第一种是调用超类的构造方法
- 当一个子类调用super()时,它调用它的直接超类的构造方法
- 第二种是用来访问被子类的成员隐藏的超类成员
- super()可用来引用父类中的方法、变量及构造方法
9.6 finalize()方法的使用
在对对象进行垃圾收集前,Java运行时系统会自动调用对象的finalize方法()来释放系统资源
该方法必须按以下方式声明:
protected void finalize() throws throwable
{...}
finalize()方法是在java.lang.Object中实现的,在用户自定义的类中,它可以被覆盖,但一般在最后要调用父类的finalize()方法来清除对象所使用的所有资源
protected void finalize() throws throwable
{
... //释放本类中使用的资源
super.finalize();
}
注意:
在Java中对象执行完毕并不显示撤销对象,而是在没有任何引用的时候,将对象标识为不再使用
因此,程序员无法确切知道何时何地调用finalize(),甚至执行垃圾回收时,也不保证立即执行finalize()方法
9.7 多态
多态实现有以下三个条件
- 继承和方法重写
- 子类对象声明超类类型
- 运行时类型识别
多态的代码实现
package sample;
class Super {
public void method() {
System.out.println("Super调用");
}
}
class Sub1 extends Super {
public void method() {
System.out.println("Sub1调用");
}
}
class Sub2 extends Super {
public void method() {
System.out.println("Sub2调用");
}
}
class Sub3 extends Super {
public void method() {
System.out.println("Sub3调用");
}
}
public class DuoTai {
public static void main(String[] args) {
Super arr[] = {
new Sub1(), new Sub2(), new Sub3()
};
for (Super ele : arr)
ele.method();
}
}
运行结果
Sub1调用
Sub2调用
Sub3调用
10. 面向对象高级特性
10.1 静态变量(类变量)、方法和初始化块
静态变量:用static修饰的成员变量即为静态变量,静态变量是一种全局变量,它属于某个类,不属于某个对象实例,在各对象实例之间共享。如果想访问静态变量可直接通过类名来访问,可以不通过实例化访问它们
静态方法:用static修饰的成员方法即为静态方法,调用静态方法可以通过类名来调用,即不用实例化对象
-
实例变量或者类变量在定义初始化时,都不能超前引用
-
实例方法既可以使用实例变量,又可以使用静态变量;而静态方法只能使用静态变量,不能直接使用实例变量(比如先创建一个类的实例,再用该实例调用实例变量)
例如:
System.out.println(new test().str);