java的继承通过extends关键字实现,在英文中extends关键字被翻译成扩展,相对于继承来说翻译成扩展其实更能说明问题。当一个子类继承了某个父类时,首先它会获得除过父类的构造器方法外的其他方法和数据域,同时他还会有所扩展,也就是说他还可能会增加一些属性或者方法。
这里对继承中相对重要的几点问题进行讨论:
(1)super限定(super关键字的作用):所谓super限定就是说使用super关键字时,其访问空间会被限定到父类资源中。其应用场景主要有:①当子类覆盖了父类的数据域或者方法时,要想访问父类被覆盖的资源就可以使用super关键字进行访问,类似这样super.fly();②在子类的构造器中需要调用父类的构造器方法,使用super关键字就可以调用父类的构造器方法。
(2)继承关系中子类构造器和父类构造器之间的问题:
①首先应该注意的是子类在继承中不能继承父类的构造器方法的
②在子类的构造器方法的第一行必须显示调用父类的构造器方法,如果程序员不显示的编写调用语句时,java机制会默认调用父类的无参构造器(这里需要保证父类是存在无参构造方法的,否则就会编译不通过)。
③这是一个相对重要的问题:从②中我们可以知道子类必须存在调用父类构造器的途径,并且调用时必须在子类的第一行显示调用,所以在这里存在两个问题:当父类中定义了有参构造器但是没有定义无参构造器是时,此时父类是没有无参构造器的,因此在一个子类中为了建立调用父类构造器的途径就必须编写有参构造器,负责就会报错,如下:
Plant.java
public class Plant {
String color;
String height;
public Plant(String color,String height){
this.color=color;
this.height=height;
}
}
Tree.java
public class Tree extends Plant{
public Tree(String color, String height) {
super(color, height);
this.color=color;
this.height=height;
}
}
说道这里可能会有人发现这样的问题,如下这样的代码我没有在子类中编写有参构造方法,但还是编译通过:
Plant.java
public class Plant {
String color;
String height;
public Plant(){
}
public Plant(String color,String height){
this.color=color;
this.height=height;
}
}
Tree.java
public class Tree extends Plant{
public String caseApple(){
return "a apple";
}
}
注意这里和上边有所不同的是在Plant类中我显示的编写了无参构造器方法,所以说在子类Tree中没有定义构造器方法时,java机制会默认存在一个无参构造器,而在无参构造器方法中如果不去显示的调用父类的构造器方法时java机制就会默认调用父类的无参构造器方法,所以说这种情况下在子类中是存在调用父类构造器方法的途径的,编译通过。