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);

}

}

Father类的字节码:

init方法字节码:

print方法字节码

Son类的字节码:

init方法字节码:

print方法字节码

分析:

第一个输出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);

// }

}

这个没有重载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

java 子类 同名参数_Java -- 父类和子类拥有同名变量相关推荐

  1. java子类和父类有相同成员_Java -- 父类和子类拥有同名的成员变量的情况

    Java – 父类和子类拥有同名的成员变量取值情况 参考文章 结论: 当子类的成员变量与父类同名时,若对该成员变量进行操作的方法继承于父类,则改变和获取的是父类的成员变量.若对该成员变量进行操作的方法 ...

  2. java 子类的同名方法_java 父类子类有同名方法时如何调用的实现

    父类引用默认调用子类重写的方法 如果父类的引用p指向了子类的实例,则通过这个引用p访问同名方法时,调用的是子类重写的方法. 父类引用p可以指向不同的子类,调用不同子类重写的不同的同名方法,进而达到类间 ...

  3. java中super用来定义父类,定义子类必须使用的关键字是 在java中子类若要继承父类,需要使用的关键字是什么...

    java定义接口时需要使用的关键字是 定义接口复使用的关键字是"interface",中文意思"接口.解释:通常接口都是制为了定义百某些规范,而在接口中只定义了方法,而没 ...

  4. Java中的继承:父类和子类的关系

    一.父类引用指向子类对象时 1.若子类覆盖了某方法,则父类引用调用子类重新定义的新方法 2.若子类未覆盖某方法,则父类引用调用父类本身的旧方法 3.若子类覆盖了某属性,但父类引用仍调用父类本身的旧属性 ...

  5. java 什么是参数_java中参数是什么?

    java中参数是什么?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! java中参数是什么? 参数分为实参和形参.方法名 ...

  6. java 接口 this参数_Java BiFunction 接口实例

    原标题:Java BiFunction 接口实例 www.baeldung.com/java-bifunction-interface 1. 简介 Java8 引入了函数式编程,可以把函数作为参数传入 ...

  7. java 命令行参数 _java命令行参数

    原标题:java命令行参数 命令行参数就是main方法里面的参数String[] args他就是一个数组,args只是数据类型的一个名称,就是一个数组的变量,名称无所谓,类型没变就行了.这个就是程序的 ...

  8. java方法可选参数_Java可选参数

    java方法可选参数 在Java类中设计方法时,某些参数对于其执行而言可能是可选的. 无论是在DTO,胖模型域对象还是简单的无状态服务类中,可选方法参数都是常见的. 从本文中, 您将学习如何在Java ...

  9. java this作为参数_Java this关键字

    在 Java 中,this 关键字指的是当前对象的引用,它有 5 种用法,下面分别给大家介绍一下. 1.消除语法歧义(最常用) 这种情况一般出现在有参构造器中,当构造器的参数与类的属性(或成员变量)名 ...

最新文章

  1. arm服务器配置信息,ARM板 web服务器交叉编译及配置
  2. php丢弃,在IIS 7.5中,PHP吓坏了(连接丢失,连接被丢弃)
  3. node 生成随机头像_唯一ID生成算法剖析
  4. Python 使用@property对属性进行数据规范性校验
  5. dll可以在linux下使用吗_无需虚拟技术,6步直接在Windows下使用Linux
  6. Java中byte[]与十六进制之间的转化
  7. html显示高亮c++
  8. php基础教程 第十一步 面向对象
  9. C语言 extern - C语言零基础入门教程
  10. 最小生成树基础 (Kruskal)
  11. 涂威威:第四范式经验与思考分享
  12. windows idea Tomcat端口被占用
  13. 三农数据(1996-2020)九:产值:谷物及其他作物、蔬菜园艺、水果、坚果、饮料
  14. 电阻器颜色代码在线计算机,色环电阻计算器
  15. 起风了数字简谱用计算机,起风了钢琴简谱-数字双手-买辣椒也用券
  16. android SDK introduce
  17. Word2016写论文之——常用操作总结
  18. 7-1 最长公共子序列 (20 分)
  19. python车牌定位
  20. “知识共享”扎根中国,前景无量

热门文章

  1. 随机森林分类算法python代码_随机森林的原理及Python代码实现
  2. x86汇编指令集大全注释(二)
  3. Android8.1 swap空间不够编译失败:ckati failed with: signal: interrupt
  4. Gstreamer离线版官方文档(十五)
  5. 深入剖析Android音频之AudioPolicyService
  6. ubuntu安装最新版apktool(最新版)反编译工具
  7. SpringBoot之maven包管理
  8. Visual Assist X安装
  9. 订阅号获取openid_小程序订阅消息
  10. git branch看不到分支_最好的Git分支管理教程