Java中继承的机制:
-
子类实例化的过程中父类的构造器先被调用,然后再调用子类的构造器
-
子类实例化时要调用父类的默认构造器,是隐含的调用了super()这个方法,但是如果子类构造器调用了父类含参构造器(super(x,y,z)),那么默认构造器就不会被调用了
/** * 父类 */ class Father{ String name; int age; //默认构造器 public Father(){ System.out.println("父类构造器被调用"); } } /** * 子类 */ class Son extends Father{ /*构造器*/ public Son(){ super();//被隐藏了的方法(调用父类默认构造器) System.out.println("子类构造器被调用"); } } class ExtendsDemo2{ public static void main(String[] args){ //实例化 Son son = new Son(); } }
结果:
父类构造器被调用
子类构造器被调用
3.如果父类带有含参构造器,并没有显式定义默认构造器,则运行super()会报错,解决方案是将父类中的默认构造器显式定义出来
class Father{
String name;
int age;
/*含参构造器*/
public Father(String name ,int age){
System.out.println("父类构造器被调用");
}
/*显式定义默认构造器*/
public Father(){
System.out.println("父类构造器被调用");
}
}
class Son extends Father{
/*构造器*/
public Son(){
/*调用父类含参*/
super("女儿",6);//被隐藏了的方法(调用父类默认构造器)
/*调用父类默认*/
//super();
System.out.println("子类构造器被调用");
}
}
- super可以表示父类的引用,我们可以使用super和this来区分父类和子类中同名的属性。
/**
* 父类
*/
class Father{
String name = "赵云";
int age;
}
/**
* 子类
*/
class Son extends Father{
String name ;
/*构造器*/
public Son(String name){
this.name = name ;
System.out.println("子类构造器被调用");
}
public void play(){
System.out.println(super.name+"的儿子"+this.name+"正在玩耍");
}
}
class ExtendsDemo2{
public static void main(String[] args){
Son son = new Son("小乔");
son.play();
}
}
解释:
在子类中访问属性的查找顺序首先在子类中查找指定的属性名字,如果在子类中没有该属性,那么就去父类中去查找该属性
方法也是一样的当子类和父类有同样的方法时通过子类调用的这个相同的方法时调用的是子类的方法。但是我们可以通过super对父类的引用来调用父类的方法。