子类继承自父类的属性,独属于子类;继承自父类的方法,所有子类共享

子类继承自父类的属性,独属于子类

定义父类Animal

public class Animal {
    String name = "动物";
    Food food = new Food();
}

定义子类Cat

public class Cat extends Animal{
    String info = "我是小猫";
}

定义子类Dog

public class Dog extends Animal{
    String info = "我是小狗";
}

定义父类引用类型成员Food

public class Food {
    String info = "我是食物";
}

子类继承父类,并修改自父类的属性name

public class Test_main {
    public static void main(String[] args) {
        Cat cat = new Cat();
        cat.name = "猫咪";
        Dog dog = new Dog();
        System.out.println(dog.name);
        System.out.println(cat.name);;
    }
}

运行结果:可以看到,子类Dog继承自父类的属性name值,并没有因子类Cat的改动而改变
在这里插入图片描述
输出子类继承自父类引用类型的成员

public class Test_main {
    public static void main(String[] args) {
        Cat cat = new Cat();
        Dog dog = new Dog();
        System.out.println(cat.food);
        System.out.println(dog.food);
    }
}

运行结果:可以看到,二者所继承的对象并不是同一个
在这里插入图片描述

子类继承自父类的方法,所有子类共享

这个只能说说自己的理解,能力不够,没法测试:

  • 父类的class字节码文件被加载进方法区,方法区是所有线程共享,而子类和父类有继承关系,因此子类可以在方法区调用父类class字节码,即执行里面的父类方法代码。

  • 之所以执行父类的方法,是因为子类当中并没有对这个方法进行重写,即子类的字节码文件中,并没有目标方法代码,进而只能去父类的字节码文件中去寻找

  • 所以,父类的方法,所有子类共享【前提:子类并未对该方法重写】

猜测

  1. 子类的构造方法会默认调用父类的构造方法,因此在new子类时,会导致父类的字节码文件被加载进方法区。
  2. 子类对象创建时,同时会创建其继承自父类的所有非静态属性,以及自身类中定义的属性,即使二者属性名一致,也会创建两个属性,但调用方式不同,本类属性调用方式属性名 | this,父类属性调用方式super
  3. 构造方法的调用会导致类加载至方法区,假设构造方法的执行会导致类的实例化,如子类构造调用父类构造,创建了父类对象,但是这个父类对象并没有被引用指向,也就是一个无法访问到的对象,因此被创建后立马又被回收。
  4. 假设构造方法的执行不会导致类的实例化,那么构造方法中应该还有一行“隐式代码”,用以告知JVM我需要创建这个对象,而由super调用的构造方法并不存在这行“隐式代码”,因此也就不会创建父类对象
  5. 能确定的是:子类对象的创建,并不会导致父类对象的创建

**PS:**欢迎指点

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值