Java:继承——父子类成员、构造访问顺序超详解(代码举例详解)

本文详细解释了Java中子类访问父类成员变量、不同名称的成员方法以及构造函数的执行顺序规则,包括super和this关键字的使用,以及构造方法调用的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、父子类成员访问顺序

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);    //0
        System.out.println(weight);     //9.5
        System.out.println(color);      //Black
        System.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————A
        methodB();  //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————A
        methodA(1);     //Cat————A
        methodB();      //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:继承——父子类成员、构造访问顺序超详解(代码举例详解)的全部内容了,希望能对您有所帮助!您的点赞收藏就是对我最大的支持!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值