继承的注意事项2

本文详细探讨了Java中的继承概念,包括内存布局、方法重载、super关键字的使用以及构造器的调用顺序。强调了即使private成员变量在子类中不可见,但仍会占用内存空间。同时,解释了this和super的区别,this用于访问当前对象的属性和方法,而super用于调用父类的非静态成员。最后,文章指出在子类构造器中必须首先调用super()来初始化父类部分。
摘要由CSDN通过智能技术生成

注意一:继承的内存布局

在这里插入图片描述

即使父类当中的成员变量被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);
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HackerTerry

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值