简单粗暴的讲,你继承了你爸,你爸的电脑、汽车、手机你都可以用,而你自己又有自行车、柜子、洗衣机,你儿子又继承了你,你儿子不仅能用你的自行车、柜子、洗衣机,还能用他爷爷的电脑、汽车、手机。
java中的继承也类似,使用extends关键字。假设有A、B、C三个类,A类有a属性a方法,B类有b属性b方法、C类有c属性c方法,如果这些属性跟方法都是public的,B继承A的情况下,B可以直接使用A的属性和方法,C继承B的情况下,C可以使用B的属性和方法。
//定义ClassA作为父类
public class ClassA {
String a = "a";
private String aa = "aa";
public void a() {
}
private void aa() {
}
}
//定义ClassA作为子类继承ClassA
class ClassB extends ClassA {
String b = "b";
private String bb = "bb";
public void b() {
}
private void bb() {
}
public void bbb() {
System.out.println(a); //直接使用父类的属性
System.out.println(aa); //父类的属性是私有的,使用会报错
a(); //直接使用父类的方法
aa(); //父类的方法是私有的,使用会报错
}
}
下图展示了java中的继承方式
如上图所示,在java中一个子类只能继承一个父类,不可以同时继承多个父类。
继承有什么用?其实在实际开发中基本上不会让一个类继承某个类,但是继承又无处不在。比如在API中搜Integer,可以看到这个类继承了Number类,Number类又继承了Object类。(图1)
(图1)
实际上所有的类都继承了Object类,Object是所有类的父类。就例如我们上面这个代码,虽然没有写extends Object,但是默认是继承Objecrt的。
(图2)
如上图,ClassA中并没有左边红框的方法,但是我们却能点出来,右面的红框说明了该方法来自Object类。
还有一种情况,假如父类和子类的方法名一样,我们可以在子类中通过super关键字调用父类的方法。
定义两个类:
public class ClassA {
public void p() {
System.out.println("我是ClassA");
}
}
public class ClassB extends ClassA{
public void p() {
System.out.println("我是 ClassB");
}
public void test() {
p(); //调用自身的方法
super.p(); //调用父类的方法
}
public static void main(String[] args) {
ClassB classB = new ClassB();
classB.test();
}
}
运行:
这种子类跟父类定义成一样的方法名的做法叫方法的重写。
以上,就是本节课的内容。