关于java类实例化,以及this/super详解

关于java类

1 构造函数如果没有,会有个默认的无参构造
2 如果手动添加过构造函数则默认的构造函数消失(建议每个类都显示添加无参构造,或者通过框架lombok添加注解的方式)
子类构造函数第一句一定是super(),可能为隐藏式
3 super()必须在第一行,所以同一个构造函数里super()和this()不能同时存在,
因为同时存在的话,就会有俩super语句,所以一定有一句super不在第一行

//super和this其实指的是同一对象
//子类实例化的时候虽然有super()语句但是并不意味着,也实例化了一个父类,只是调用了父类的构造函数
//但是调用同一方法的时候表现形式却不一样,应该是虚拟机内部机制不一样
//所以在成员方法里面互相调用的话,其实方法前面应该是有默认的this.
//但是如果通过super,调用方法就会覆盖this所以会有不同的呈现形式
//但是父类并没有实例化,为什么可以通过super调用父类的方法呢
//*****************
//推测即使重写父类的方法,父类的方法也依旧存在,只是被隐藏了,注意如果父类方法里面还有super此时super和this的
//表现形式不一样,它会发生改变,即会指向更上一层,和this不一样this只指向运行时实例,无论是否在通过super调用的方法

有一道java题目有如下代码,求会打印什么

在这里插入图片描述
在这里插入图片描述
看题知道main函数里面,首先创建了一个B类的实例,无视引用,然后调用了B实例的方法,所以很容易猜到首先会进入B类的test1方法,然后super调用了父类的test1方法,紧着着因为会调用一下test2()那么这个test2指的是A还是B呢,答案是B,所以输出如下
在这里插入图片描述
这里可以总结出一下几点
1.super.xxx()会调用父类的方法
2.this.xxx()会调用当前类的方法
3.所有的成员方法在调用的时候其实前面默认有this.即使不写也是有的

那么super和this指的究竟是什么?为什么superthis编译器会显示恒等于true
在这里插入图片描述
那么这里似乎就有个悖论了,this
super,但是很明显this.test1()和super.test1()指的是不同的方法

推测1 super和this的地址指向是一致的,但是方法调用的时候this.和super.虚拟机的处理是不一样的,之前说过成员方法,调用的时候前面会有隐藏式的this,但是如果使用了super,来调用的话,就会覆盖了隐藏的this,从而有不同的指向,会指向父类的方法。

由推测1,那么父类没有实例,为什么还可以调用它的方法呢
推测1-1构造实例b的时候隐藏式构造了一个它父类的实例
推测1-2方法被子类重写了,但是依旧存在,只是被隐藏了,但是可以通过super关键字调用

注意这些推测只是java的表现形式,而不是底层原理,从理解上来看个人觉得1-2更容易理解一点
验证一下有如下代码
在这里插入图片描述
在这里插入图片描述
那么答案是多少呢?如果按照之前的推测实例b中有隐藏的父类test1的方法,那么既然它还是实例b的方法那么,test1中有super关键字的时候应该还是调用父类A的toString()那么推测答案
似乎是
BBBB
AAAA
然而并不是
答案如下
在这里插入图片描述
竟然是Object类的toString()方法?????
难道真的是隐藏式的有个父类的实例吗这样好像就说得通了,但是感觉很扯,这样如果项目结构复杂一点,那么类实例岂不是茫茫多,所以我选择另外一种理解

总结一下,this.的指向是不会改变的,
无论是不是"隐藏方法",它只指向当前运行的实例。
然而super则会发生改变,如果它在某个方法内的话,它指向方法实际所属的类的父类!!那么怎么判断实际所属呢,在哪个类定义就属于哪个类,A的test1自然是在A里面定义的,所以A的test1方法里面的super会指向A的父类Object

(这里有一个现象)
在这里插入图片描述
很奇怪super后面必须有个点???它好像无法单独存在,那么说this和super相等其实就太扯了,它俩好像都不是一个性质的东西呀,super好像是一个纯粹的指针,必须指点什么,但是this则不一样,它好像可以是一个具体的东西比如引用,那么是不是super实际上是堆里面的东西一个无法直接访问的地址,而this则是类似于栈里面保存的引用

哈哈哈哈不知道是不是通篇乱扯,但是应该不会再做错题了

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

暮冬.

希望能有帮助,谢谢打赏~

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

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

打赏作者

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

抵扣说明:

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

余额充值