java 子类 同名参数_Java -- 父类和子类拥有同名变量

Java -- 父类和子类拥有同名变量

Java -- 父类和子类拥有同名变量

Java – 父类和子类拥有同名变量

请仔细观察系列两段程序的不同之处:一个Son类重写print方法,另一个则没有重写。

分析该问题必须从字节码的角度入手,否则根本不可能看清事情的本质。

成员变量(非静态的)的赋值过程:

默认初始化

显示初始化 / 代码块中初始化

构造器中初始化

有了对象之后。可以“对象.属性”或“对象.方法”的方式队成员变量进行赋值。

最重要的是要搞清楚父类和子类的同名变量是否占用一块内存!!!

方法存在重载,但属性不存在重载。

package test0;

/**

* @author wsh2096

* @create 2020-10-28 8:57

*/

public class SonTest {

public static void main(String[] args) {

Father f = new Son();

System.out.println(f.x);

}

}

class Father {

int x = 10;

public Father() {

this.print();

x = 20;

}

public void print() {

System.out.println("Father.x = " + x);

}

}

class Son extends Father {

int x = 30;

public Son() {

this.print();

x = 40;

}

@Override

public void print() {

System.out.println("Son.x = " + x);

}

}

64972bb300caf1f53386fa68bf4b00a7.png

Father类的字节码:

init方法字节码:

1b7d6707239ca0798b25c7e96a5447c2.png

print方法字节码

a516bbd2b73db400219ba3a2bb01e212.png

Son类的字节码:

init方法字节码:

b57ce20ce92d45470a9adf05e9566b6b.png

print方法字节码

2fa2c3cb0674a67b53c9a8c2aadb77aa.png

分析:

第一个输出0的原因是:在调用print方法的时候,子类Son重载该方法,所以调用子类方法进行输出,此时子类的x还没有显示初始化,所以输出的是子类x默认初始化值0。

第二个输出30的原因是:在Son类的构造器进行输出,此时Son类的x已经进行完显示初始化,将Son的x值赋值为30.

第三个输出20的原因是:此时变量f实际上指向的是Son类的实例,但是外观上是Father类,由于方法存在重载,会进行动态链接进行查找子类的具体实现方法!但是,属性十不存在重载,也就不存在动态链接,所以此时输出f的x值,是去查找Father类实例的属性x的值。(此时父类的构造器已经执行完毕,所以此时的值为20.)

对父类的print方法不进行重载!

package test0;

/**

* @author wsh2096

* @create 2020-10-28 8:57

*/

public class SonTest {

public static void main(String[] args) {

Father f = new Son();

System.out.println(f.x);

}

}

class Father {

int x = 10;

public Father() {

this.print();

x = 20;

}

public void print() {

System.out.println("Father.x = " + x);

}

}

class Son extends Father {

int x = 30;

public Son() {

this.print();

x = 40;

}

// @Override

// public void print() {

// System.out.println("Son.x = " + x);

// }

}

cd5329841c7eb9c08f299ecafea5d589.png

这个没有重载print方法的版本就不放字节码了,与重载的版本相比,只不过是少了东西,其他部分都是一样的。

最后一个输出不需要解释!

第一个输出10,是因为子类并没有重载print方法,所以调用Father的print方法,输出的就是父类的x值,此时已经完成显示初始化,为10.

第二个输出20,属性不能重载,输出Father的x值,此时完成Father构造器初始化,将值赋为20.

Java -- 父类和子类拥有同名变量相关教程

java 登录数据前端加密+后台验证RSA

java 登录数据前端加密+后台验证RSA 前端加密使用RSA+MD5+自写算法 使用到了 md5.js+jsencrypt.min.js+1.js+RSAUtils.java(自写算法) 下载链接:https://gitee.com/gy297879328/learning_summary/tree/master/jiami 使用:RSAUtils.java生成一堆密钥对 ( 公

【Java】网络编程

【Java】网络编程 网络编程 网络通信要素 通信要素1:IP和端口号 IP InetAddress类 实例化 常用方法:getHostName() 常用方法:getHostAddress() 端口号 通信要素2:网络协议 TCP网络编程 例子1:客户端发送信息给服务端,服务端将数据显示在控制台上 例子2:

10--JavaScript--2.1 **内置对象

10--JavaScript--2.1 **内置对象 内置对象 JavaScript 中的对象分为3种: 自定义对象 、内置对象、 浏览器对象 前面两种对象是JS 基础 内容,属于 ECMAScript; 第三个浏览器对象属于 JS 独有的 JavaScript 提供了多个内置对象: Math、 Date 、Array、String

Java 8 异步 API、循环、日期,用好提高生产力!

Java 8 异步 API、循环、日期,用好提高生产力! 点击上方的终端研发部,右上角选择“ 设为星标 ” 来源:cnblogs.com/funnyzpc/p/10801470.html 异步API 循环ForEach 新的时间类( LocalDate、LocalDateTime ) 异步API 对于多任务耗时的业务场景,一般我们会

【刷题1】LeetCode 62. 不同路径 java题解

【刷题1】LeetCode 62. 不同路径 java题解 1.题目 2.方法一:动态规划 一个m*n的网格 转移方程: 由于机器人只能向下或向右,所以此时的路径和=向上的路径和+向左的路径和 dp[i][j]=dp[i-1]+dp[j-1]。 初始条件: 由于第一行和第一列都只有一种路, dp[0][■]

穿越Java - SpringCloud篇 第二章 服务注册与发现 - NACOS | 第2

穿越Java - SpringCloud篇 第二章 服务注册与发现 - NACOS | 第2节NACOS+RestTemplate+DiscoveryClient实现服务的注册与发现 NACOS+RestTemplate+DiscoveryClient实现服务的注册与发现 开发环境 更多干货 需求 分析 使用 User-service 目录结构 pom.xml 依赖

数据结构之二分法以及八大排序算法的理解与代码实现(Java)

数据结构之二分法以及八大排序算法的理解与代码实现(Java) 顾明思意,二分法就是将我们的数组一分为二,然后拿我们要查找的数去和中间的那个元素比较,如果刚好等于中间那个元素,那么就返回中间位置的下标。如果比中间的元素小,那么再使用相同的方式从中

Java SE从入门到放弃(十一)

Java SE从入门到放弃(十一) Java SE从入门到放弃(十一)之Eclipse快捷键总结以及继承和重写 Eclipse中的快捷键: * 1.补全代码的声明:alt + / * 2.快速修复: ctrl + 1 * 3.批量导包:ctrl + shift + o * 4.使用单行注释:ctrl + / * 5.使用多行注释: ctrl

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值