类的继承基本思想是基于某个父类进行扩展,得到一个新的子类,子类可以继承父类的原有属性和方法,也可以增加原来父类所不具备的属性和方法,或者重写父类中的方法;
【重写】也可以称为【覆盖】,就是在子类中奖父类的成员方法名保留,重写成员方法的实现内容或更改方法的权限或修改方法的返回值类型,重写父类方法时,修改方法的修饰权限只能从小的范围修改为大的范围改变。
【重构】是一种特殊的重写方式,与父类的成员方法唯一不同点是方法的【实现内容】部分,其余的返回值、方法名称、参数类型及个数完全相同。
子类中没有权限调用父类中【private】权限修饰符修饰的方法,只能调用父类中修饰为【public】和【protected】的成员方法。
Java中通过【extends】关键字来标识两个类的继承关系。
通过【super】关键字来调用父类的构造方法和成员方法。
- package classExtends;
-
- public class Test {
- public Test() { //构造方法
- //SomeSentence
- }
-
- protected void doSomething() { //成员方法
- //SomeSentence
- }
-
- protected Test doIt() { //方法返回值类型为Test类型
- return new Test();
- }
- }
-
- class Test2 extends Test { //继承父类Test
- public Test2() {
- super.doSomething(); //调用父类方法
- }
-
- public void doSomthing2() { //新增方法
- //SomeSentence
- }
-
- public void doSomething() { //重写父类方法
- //SomeNewSentence
- }
-
- public Test2 doIt() { //重写父类方法,返回Test2类型
- return new Test2();
- }
-
- }
当实例化子类对象时,父类对象也会相应被实例化,原因是在实例化子类对象时,Java编译器会在子类的构造方法中自动调用父类的无参构造方法,有参构造方法不能被自动调用,只能通过super关键字显示地调用。
- package classExtends;
-
- class Parent {
- public Parent() {
- System.out.println("调用了父类的Parent的构造方法~");
- }
- }
-
- class subParent extends Parent { //继承Parent类
- public subParent() {
- System.out.println("调用了父类的subParent的构造方法~");
- }
- }
-
- public class subRoutine extends subParent { //继承subParent类
- public subRoutine() {
- System.out.println("调用了父类的subRoutine的构造方法~");
- }
-
- public static void main(String[] args) {
- subRoutine sr = new subRoutine(); //实例化子类对象
- }
- }
-
- 输出:
- 调用了父类的Parent的构造方法~
- 调用了父类的subParent的构造方法~
- 调用了父类的subRoutine的构造方法~
如果使用finalize()方法对对象进行清理,要确保子类finalize()方法最后一个动作是调用父类finalize()方法,以保证对象的所有部分都能被正常终止。