目录
一、父子类成员访问顺序
1、子类中访问父类的成员变量
2、子类中访问父类的成员方法
2.1 成员方法名字不同
2.1 成员方法名字相同
3、带super、this 的执行举例
二、父子类构造访问顺序
一、父子类成员访问顺序
1、子类中访问父类的成员变量
代码示例:
class Animal {int age = 0;double weight = 5.0;
}
class Cat extends Animal {double weight = 9.5;String color = "Black";String name = "花花";public void display() {String name = "小黑";System.out.println(age); //0System.out.println(weight); //9.5System.out.println(color); //BlackSystem.out.println(name); //小黑}
}
总结:1、父类有子类没有的,访问从父类继承的成员变量
2、父类有子类也有的,访问子类自己的成员变量
3、父类没有子类有的,访问子类自己的成员变量
4、子类父类都没有的,编译报错
5、局部变量访问优先级高于成员变量
成员变量访问就近原则:自己有先访问自己的,自己没有再去父类中找
2、子类中访问父类的成员方法
2.1 成员方法名字不同
代码示例:
class Animal {public void methodA() {System.out.println("Animal————A");}
}
class Cat extends Animal {public void methodB() {System.out.println("Cat————B");}public void method() {methodA(); //Animal————AmethodB(); //Cat————B //methodC();//编译报错}
}
总结:成员方法名不同时,在子类方法中或通过子类对象访问时,优先访问自己的,自己没有的时候再到父类中找,如果父类中也没有,则报错。
2.1 成员方法名字相同
代码示例:
class Animal {public void methodA() {System.out.println("Animal————A");}public void methodB() {System.out.println("Animal————B");}
}
class Cat extends Animal {public void methodA(int num) {System.out.println("Cat————A");}public void methodB() {System.out.println("Cat————B");}public void method() {methodA(); //Animal————AmethodA(1); //Cat————AmethodB(); //Cat————B}
}
总结:1、方法同名时,如果参数列表相同,则就近访问
2、如果参数列表不同,则根据参数选择合适的方法访问(方法的重载)
3、如果没有该方法就报错
3、带super、this 的执行举例
class Parent {public void printMe() {System.out.println("Parent_print");}
}class Child extends Parent {public void printMe() {System.out.println("Child_print");}public void printAll() {super.printMe();this.printMe();printMe();}
}public class Main{public static void main(String[] args) {Child child = new Child();child.printAll();}
}
执行结果为:
由此可知:当成员方法同名时,带super前缀,执行父类方法;带this前缀的,执行本类方法;不带前缀的,就近执行。
二、父子类构造访问顺序
父子即先有父,后有子。子类对象构造时,需先调用父类的构造方法。
代码示例:
class Base {public Base() {System.out.println("Base构造方法");}}class Child extends Base {public Child() {//super();//没写时编译器会自动添加 且一定是方法中的第一条语句System.out.println("Child构造方法");}
}
所以当我们要实例化一个Child类的对象时,会先后输出:
因为在Child类的构造方法中,会自动添加super()在第一条语句,调用父类的构造方法。
所以我们可以知道,在我们构造子类对象时,先执行父类的构造方法,再执行子类的构造方法。
注意:
1、若父类定义无参或默认的构造方法,则在子类构造方法的第一条默认会有隐含的super()调用。
2、如果父类定义的是有参的构造方法,则在子类中一定要显示定义构造方法,并在子类构造方法中选择合适的父类构造方法调用,否则编译失败。
3、在子类构造方法中,super(…)调用父类构造时,必须为方法中第一条语句。
4、super(…)只能在子类构造中出现一次,不能与this(…)同时出现。
以上就是 Java:继承——父子类成员、构造访问顺序超详解(代码举例详解)的全部内容了,希望能对您有所帮助!您的点赞收藏就是对我最大的支持!