类的继承
继承
1.1 继承的概念
继承是指在一个现有类的基础上构建一个新的类,新构建的类被称作子类,现有类被称作父类,子类会自动拥有父类所有可以继承的属性和方法。
1.2 继承的特征
在类的继承中,需要注意:
(1)一个类只能有一个父类(直接父类),不允许继承多个父类;
(2)多个类可以继承同一个父类;
(3)可以多层继承,即若类C继承类B,类B继承类A,这时,类C也可以称作类A的子类;
(4)子类父类是类与类的相对关系,一个类既可以是某个类的父类,又可以是另一个类的子类。
1.3 extends实现类的继承关系
在Java中,继承是通过extends关键字实现的,如class Dog extends Animal,Animal是Dog的父类,Dog是Animal的子类。
1.3.1 数据成员的继承
子类可以继承父类所有非私有的数据成员。
在类Test01中的私有成员变量a没有被类Test继承,只能调用父类中没有被private修饰的变量b。
1.3.2 成员方法的继承
子类可以继承父类所有非私有的成员方法。
在类Test01中的私有成员方法没有被类Test继承,只能调用父类中没有被private修饰的sum()成员方法。
1.3.3 成员方法的覆盖
子类可以重新定义与父类同名的成员方法,实现对父类方法的覆盖。
需要注意的是:子类在重新定义父类已有的方法时,需要保持与父类完全相同的方法名、返回值类型和参数列表,否则就不是对父类方法的覆盖,而是定义了一个子类特有的方法,与父类方法无关。
1.4 关键字 this与super
1.4.1 this的使用
this:指向当前对象的引用,可以理解为对象的名字;
this的使用方法:
(1)访问当前对象的数据成员 this.数据成员
(2)访问当前对象的成员方法 this.成员方法(参数)
(3)当有重载的构造方法时,用来引用同类的其他构造方法。 this(参数)
1.4.2 super的使用
super:实现对父类的访问,引用当前对象的父类。
super的使用方法:
(1)用来访问直接父类隐藏的数据成员 super.数据成员
(2)用来调用直接父类中被覆盖的成员方法 super.成员方法(参数)
(3)用来调用直接父类的构造方法 super(参数)
1.5 构造方法的重载与继承
1.5.1 构造方法的重载
构造方法的重载与普通方法一样,需要每个构造方法的参数类型或参数个数不同。
传入的参数不同,调用不同的构造方法,第一个构造方法只对name属性进行赋值,age属性的值默认为0。
1.5.2 构造方法的继承
子类可以继承父类的构造方法,构造方法的继承遵循以下原则:
(1)子类无条件继承父类不含参数的构造方法
(2)如果子类自身没有构造方法,则子类继承父类的构造方法,并将此方法作为自己的构造方法;如果子类自身定义了构造方法,则在创建新对象时,先执行继承父类的无参构造方法,再执行自身定义的构造方法
(3)对于父类的含参构造方法,子类可以通过在自己的构造方法中使用super关键字进行调用,但super调用语句必须是子类构造方法的第一条可执行语句。
class Demo01 {
int x = 0,y = 0,z = 0;
Demo01(int x) {
this.x = x;
}
Demo01(int x,int y) {
this.x = x;
this.y = y;
}
Demo01(int x,int y,int z) {
this.x = x;
this.y = y;
this.z = z;
}
public int sum() {
return x + y + z;
}
}
public class Test extends Demo01{
int a = 1,b = 1,c = 1;
Test(int x){
super(x);
a = x + 10;
}
Test(int x,int y) {
super(x,y);
a = x + 100;
b = y + 100;
}
Test(int x,int y,int z) {
super(x,y,z);
a = x + 1000;
b = y + 1000;
c = z + 1000;
}
public int sum() {
System.out.println("super:x + y + z=" + super.sum());
return a + b + c;
}
public static void main(String[] args) {
Test test1 = new Test(1,2,3);
Test test2 = new Test(10,20);
Test test3 = new Test(100);
System.out.println("a + b + c = " + test1.sum());
System.out.println("a + b = " + test2.sum());
System.out.println("a = " + test3.sum());
}
}
运行结果:
super:x + y + z=6
a + b + c = 3006
super:x + y + z=30
a + b = 231
super:x + y + z=100
a = 112
Process finished with exit code 0