java多态和java类的加载机制

3 篇文章 0 订阅

我们可以看出 子类Sub和父类ExtendsInstanceTest有相同的属性和 相同的方法

上诉代码的输出结果为什么为null?

当我们用new操作符生成一个对象的时候,类的加载机制是什么样子的?

Java机制有一个原则:父类存在则子类可以不存在;若子类存在则父类一定存在(有孩子,孩子一定有父亲)

Java中,若要实例化子类,必须先构造其父类;即父类的存储空间的分配是在子类前面完成的。当执行子类的构造函数的时候,首先第一个代码执行的是super(),如果是默认的空参的构造函数,也是会去执行父类的实例化。就是说子类如果想完成初始化,必须先把父类搞定。

上诉代码中继承的时候,子类和父类有相同的属性和相同的方法;同名的属性的初始化是怎样的?同名的方法(多态)之间的调用是怎样的?

(1)类加载机制,第一步是,分配内存空间(堆空间:物理存储地址,每个属性都要分配物理空间【方法不需要】,此时的物理空间指向的地址是null)

(2)空间分配好之后,进行属性初始化,把值放在栈空间中,第一步中的物理空间存储地址指向这个栈空间。这样就完成了属性值的初始化。

(3)属性值完成初始化之后就开始调用构造函数了,执行构造函数的代码块

类加载的执行过程:必须等所有存储空间分配好,才能够赋值。

Java中子类 的加载机制

(1)子类初始化的时候必须先去初始化父类

(2)只有等 Java机制给子类和父类都分配好内存空间之后(先搞定堆内存),指向null;再进行属性值的初始化,栈空间里是属性的内容,前面分配的内存空间地址这个时候指向的就是栈内存的值。

(3)同名属性不会被子类覆盖;同名方法是去调用子类的重载方法

当有父类和子类的时候,必须把所有的内存空间都分配好了,才能执行属性的初始化,然后是执行构造函数。子类的构造函数是在父类构造完成之后执行的。必须遵守只有有父亲才有其孩子。

分析上诉代码

 (1)ExtendsInstanceTest b=new Sub();在堆内存里,为Sub对象分配了内存空间,这里就是指为属性baseName分配内存空间,此时其物理空间存储地址指向null

(2)下一步 执行Sub的构造函数,首先是执行父类的构造函数 即super()函数,先把父类搞定

(3)父类进行实例化,给父类分配内存空间,即为父类的baseName分配地址,此时其物理空间存储地址指向null

(4)此时父类和子类的内存空间都分配完成,下一步就是进行初始化;首先是给父类的属性进行初始化,即baseName的物理存储空间地址指向里面写上内容为base的栈内存。

(5)接下来就是执行构造函数,完成父类的实例化,构造函数里面的代码是执行了一个函数callName()。此时要注意看子类是否重写这个函数callName(),即多态的调用

(6)从上诉代码可以看到子类有重写那个函数callName(),故调用的是子类的方法。但是此时子类的baseName还未初始化,所以上诉代码输出结果为null

(7)父类创建完成;接下来就是子类,对于子类首先是堆属性值进行初始化,即在栈内存里放上内容sub,将子类属性的物理空间存储地址指向这个栈内存;

(8)然后执行子类的构造函数,对于上诉代码,是子类的默认的无参的构造函数。

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值