继承的注意事项2

发布于:2022-12-23 ⋅ 阅读:(416) ⋅ 点赞:(0)

注意一:继承的内存布局

在这里插入图片描述

即使父类当中的成员变量被private修饰,但是也会被子类继承下来,在子类对象的堆中开辟空间,但是不可以被访问

如果子类与父类中都有重名的变量,那么子类对象的堆上有两个重名的变量。子类方法中会默认访问子类中的崇明变量,若非要访问父

类中的重名变量,那么就用super关键字。

注意二:继承中的重载

public class Animal {
    public String name;
    public int age;

    public Animal(String name , int age){
        this.name = name;
        this.age = age;
    }
    
    public void func(int a){
        
    }
}

public class Dog extends Animal{
    boolean silly;
    String name;
    public Dog(String name, int age, boolean silly){
        super(name , age);
        this.silly = silly;
    }

    public void func(){
        System.out.println(this.name+" "+this.age+" "+this.silly);
    }
}

public void func(int a){
        
}

 public void func(){
        System.out.println(this.name+" "+this.age+" "+this.silly);
 }
// 这两个func函数构成重载
// 啥叫重载:
//如果一个类的两个方法(无论是在同一个类中声明,还是都由一个类继承,或者一个声明一个继承)具有相同的名称但签名不是覆盖等效的,则该方法名称被称为重载

注意三:super与this 在内存中的表现形式

public class Animal {
    public String name;
    public int age;

    public Animal(String name , int age){
        this.name = name;
        this.age = age;
    }

    public void func(int a){

    }
}

public class Dog extends Animal{
    boolean silly;
    String name;
    public Dog(String name, int age, boolean silly){
        super(name , age);
        this.silly = silly;
    }

    public void func(){
        System.out.println(this.name+" "+this.age+" "+this.silly);
    }
}

public class Test {
    public static void main(String[] args) {
        Dog dog = new Dog("wangcai",1,false);
        dog.func();
    }
}

在这里插入图片描述

this 会优先访问自己的 ,如果自己的没有就访问父类当中继承下来的,

super 只是一个关键字在代码层面上好理解 ,就是用来访问父类当中 方法 与 变量 ,有些书中讲:super是父类的引用这是错误的,

我们只创建了子类对象,根本就没有创建父类对象,哪来父类引用一说。

注意四:super的用途

1 super . 普通成员变量 调用父类的成员变量

2 super . 普通成员方法 调用父类的成员方法

3 super ( ) 调用父类的构造方法

// super . 静态成员变量/方法 调用父类的静态成员变量与方法 可以但不建议

​ 可以直接父类类名. 静态成员变量/方法 来调用父类的静态成员变量与方法

注意五:先构造父类后构造子类

public class Animal {
    public String name;
    public int age;

    public Animal(String name , int age){
        this.name = name;
        this.age = age;
    }
}

public class Dog extends Animal{
    boolean silly;
    String name;
    public Dog(String name, int age, boolean silly){
        super(name , age);   // 先构造父类后构造子类  必须放在第一行
        this.silly = silly;  
    }
}

public class Test {
    public static void main(String[] args) {
        Dog dog = new Dog("wangcai",1,false);
    }
}

本文含有隐藏内容,请 开通VIP 后查看