继承
现实世界中,父母都是无私的,子辈可以继承父辈的财产。而在程序中,继承这一特性被描述的更加具体,类与类之间可以单继承,接口和接口之间可以多继承。子类可以调用父类所有非private修饰的属性和方法,而子类也可以拓展出父类所没有的方法和属性。
类与类之间的继承
我们就拿"树"作为例子
树都有树龄,也都可以成长,这是所有树的共性。而苹果树继承自树,它不但拥有树的所有特征,还拓展出了独特的方法,就是结苹果。接着代码实现
public class Tree {
/**
* 树的年龄
*/
private int age;
/**
* 树的名字
*/
public String name;
//无参构造方法
public Tree() {
super();
}
//有参构造方法
public Tree(int age, String name) {
super();
this.age = age;
this.name = name;
}
/**
* 树的生长行为
*/
public void grow(){
System.out.println(age+"岁的"
+name+"正在生长");
}
}
public class AppleTree extends Tree {
/**
* AppleTree子类构造方法显式调用父类有参构造
* @param age 年龄
* @param name 名字
*/
public AppleTree(int age,String name){
super(age,name);
}
/**
* AppleTree独有的结苹果行为
*/
public void fruit(){
System.out.println(super.name+"结果实了!");
}
public static void main(String[] args) {
AppleTree appleTree = new AppleTree(1,"苹果树");
appleTree .grow();
appleTree .fruit();
}
}
AppleTree继承Tree,所以它可以调用父类的非私有方法,即可以调用grow()方法,细心点可以看到,Tree中的age属性是private修饰的,name是public修饰的,来测试一下
appleTree.name = "苹果树";//编译通过,因为父类name是public修饰的,子类可以调用
appleTree.age = 1;//编译报错,age是private修饰,父类私有,子类不可调用
在上面的代码中也可以看到,我的AppleTree子类的构造方法中,有这样一行代码 super(age,name); 这行代码的作用是:调用父类构造方法,后面的参数列表,决定着调用的是父类的哪个构造方法,当前我们后面跟了两个参数age和name,所以它调用的是父类有参构造,如果是super(); 那么调用的就是父类无参构造。此时我们也了解到了"super"关键字,super译文为 超级,而父类的另一名称叫"超类" 而super关键字正是用来调用父类的属性、方法。
我写上这样的代码
//父类
public class Father {
public Father(){
System.out.println("父类无参构造方法");
}
public void fatherMethod(){
System.out.println("父类成员方法");
}
}
//子类
public class Son extends Father{
public Son(){
System.out.println("子类无参构造方法");
}
public void sonMethod(){
super.fatherMethod();
System.out.println("子类成员方法");
}
public static void main(String[] args) {
Son son = new Son();
son.sonMethod();
}
}
运行结果为:
父类无参构造方法
子类无参构造方法
父类成员方法
子类成员方法
可见,子类构造方法中默认调用父类无参构造,我又在子类的成员方法中,使用super关键字调用了父类成员方法,所以输出以上结果
总结
Java是单继承语言,这句话不太准确。在Java中,类与类之间只能够单继承,但是接口与接口之间可以多继承。继承使得类与类之间的层次更加分明,也使得代码的复用性大大提高,继承更是多态的一个重要前提。