java 子类 复制_关于java子类继承来的属性与方法究竟是完全复制还是共用使用...

关于java子类继承来的属性与方法究竟是完全复制还是共用使用

关于java子类继承来的属性与方法究竟是完全复制还是共用使用

今天在学习java的面向对象时,无意间发现一个问题。

public class testEquals{

public static void main(String[] args){

Child cd1 = new Child();

cd1.f();

}

}

class Father{

public int value;

public void f(){

value = 100;

System.out.println("classFatherValueIs:"+value);

}

}

class Child extends Father{

public int value; //请看这里

public void f(){

super.f();

value = 200;

System.out.println("classChildValueIs:"+value); //输出

System.out.println(value);

System.out.println(super.value+"super.value");

}

}

/**

result:

classFatherValueIs:100

classChildValueIs:200

200

100super.value

**/

当Child类在继承Father类时,子类有重新声明value变量,在Child.f()内对value变量的值进行修改并不会改变父类Father.f()的值。

断点debug:父类子类均有自己的值

60e4e2629157ea85090c02e8ad1839df.png

而当我将子类的value变量声明去掉后,情况变得和想象中就不太一样了,以往我所认知的继承应该是将非private的成员统统复制过来,并于父类互补干扰。但实际并不是这个样子。

当去掉子类的类型声明

package cn.sxt.oop;

public class testEquals{

public static void main(String[] args){

Child cd1 = new Child();

cd1.f();

}

}

class Father{

public int value;

public void f(){

value = 100;

System.out.println("classFatherValueIs:"+value);

}

}

class Child extends Father{

public void f(){

super.f();

value = 200;

System.out.println("classChildValueIs:"+value);

System.out.println(value);

System.out.println(super.value+"super.value");

}

}

/**

result:

classFatherValueIs:100

classChildValueIs:200

200

200super.value

父类的value值随着子类一起改变了。虽然没有显示的在子类中声明value变量,但通过继承,应该是互不干扰才是,为什么在子类定义value,父类的值也改变了。

断点debug:此时父类的value也受到了子类的影响变成了200

8d99d9e3b303adf94ce864cc05344e7c.png

子类究竟时如何被实例化出来的?

以上面child类为例,Child的父类是Father类,而father类继承所有类的老子Object类。也就是说实例化一个Child类,首先要生成一个Object类,father类继承Object类中被特别定义的成员,并根据要求生成Father实例,Child类再继承Father实例生成child对象。也就是说如果想单独生成Child类,Father于Object类也再咱们不知情的情况下生成了。

3695e81248058f2556dc6cba6a2be35a.png

大胆推测一下:

继承并不是单纯的复制父类代码。在子类中没有对父类的相同的成员名进行单独定义时,子类继承来的成员其实只是对父类成员的引用。当单独去进行声明,即使没有重新去定义逻辑,也相当于覆盖了继承来的属性或方法。

如果继承是单纯的复制代码,那么子类所占的内存需要和父类一样打,甚至更大。所以相同的部分向上引用应该就是一个很好的办法。

后来在科普看到了类似的解答,和我猜的大致差不多:

继承是复制还是共用?例如 Dog类继承Animal类,在Dog中的属性修改,Animal中的属性也会一起改变吗?如果用Dog和Animal分别实例化对象,dog和animal,这两者的属性是公用还是各占内存,毫无关系?另外要对子类继承的属性赋值,通过super(),最终跳到父类构造器,此时,是不是创建了一个父类对象?

1、共用更恰当,因为父类的一些私有方法和私有属性是不会被继承的,继承之后,子类可以共用父类的公有属性和公有方法,,

2、Dog中如果没有重新定义父类已有的同名属性,则修改公有属性就是修改父类的公有属性,即父类的属性会一起改变,,

3、如果两者都实例化,肯定是两个不同的对象,内存地址不可能共用的,就算是Dog实例化多次也是只是多个不同的对象,内存地址是不一样的,,

4、super其实就是一个区分标志,不会新建对象的,,,super()只是调用父类的无参构造方法,因为子类也有无参构造方法,,只要是子类要调用在父类中有同名同参的方法或者同名的属性,都要用到super来区分,,

关于这部分的资料感觉还是蛮少的,所以这个想法是否正确也不能保证。

还有一个很有意思的东西

package cn.sxt.oop;

public class A {

int i = 12;

}

class B extends A {

int i = -6;

public static void main(String[] args) {

A xx = new B();

System.out.println(xx.i);

}

}

/**

result:

12

**/

B实例的i值是A类的i值,有点懵

关于java子类继承来的属性与方法究竟是完全复制还是共用使用相关教程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/299025.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于IE某些原因导致下拉列表弹出阻止窗口的解决办法

找个N多方案,未果。最终还是重新安装IE解决。 原因可能是因为我同时安装的IE6,IE7共存导致的。转载于:https://www.cnblogs.com/23shi/archive/2010/09/29/1838747.html

女生会 P 的可不仅仅是丰胸和瘦腿......

1 打死你都想不到女生还有这种操作▼2 小朋友的大哥式道歉▼3 可能舌头和尾巴对猫来说也是另一种生物吧?▼4 当代年轻人的发际线▼5 这一招江湖上俗称“老汉推车”▼6 身正不怕影子斜人正不怕车子歪▼7 这位大爷太过于自信了▼你点的每个赞,我都认…

何时使用领域驱动设计

何时使用领域驱动设计?其实当你的应用程序架构设计是面向业务的时候,你已经开始使用领域驱动设计了。领域驱动设计既不是架构风格(Architecture Style),也不是架构模式(Architecture Pattern)&a…

使用MOM 2005监视DC的磁盘空间

在使用MOM 2005监视DC的磁盘空间之前首先需要在MOM 2005服务器上导入Active Directory的管理包,这样MOM 2005服务器才能够对域控制器进行管理 我来到一台计算机名称叫做MOM2005的计算机 它是一台MOM 2005管理服务器同时是一台MOM 2005报表服务器 打开MOM 2005管理控制台--按管…

php如何读出xml的节点内容 两个例子

第一个例子: PHP与XML联系紧密,下面是一个较简单的解析XML节点数据的例子,示例中自定义有一个XML样例文件代码,通过PHP将依次读取出XML节点中的id、name和email数据,是读取较大的XML文件的前提,新手的话&am…

java递归 treeview_treeview递归

1.数据库table A(ID int pk,Value varchar,Fid int)A:ID Value Fid1 value1 02 value2 03 value3 14 vlaue4 15 value5 26 value6 22.递归void BindTree(TreeNodeCollection tnc,string fid){DataView dvds.Tables[0].DefaultView;//…

latex 1图加标题_使用VsCode编译latex心得

本人最早接触latex是刘海洋老师的《latex入门》,大家可自行搜索相关资源查阅,可以作为参考书,不建议从头到尾的翻阅学习。学习窍门在配置好相关软件之后,应当立即编译一个模板,保证能通过。相关的模板如IEEE等学术报告…

Microsoft AJAX Client Library规范的实例

MSDN 帮助: ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.chs/dv_vwdcon/html/285e3a65-b42e-42c5-952d-baf184057899.htm Type.registerNamespace("Demo"); Demo.Person function(firstName, lastName, emailAddress) {this._firstName firstName;this._last…

这就是为什么上帝和魔鬼都喜欢数学......

全世界只有3.14 % 的人关注了爆炸吧知识是上帝的指纹还是魔鬼的聚合物两千多年来,几何学的研究主要集中在欧几里得几何上。正因如此,欧式几何中由直线或曲线、平面或曲面、平直体或曲体所构成的各种几何形状,一直是人类认识自然物体形状的有力…

彻底删除 XP 自带的 Windows Messenger方法

开始->运行->RunDll32 advpack.dll,LaunchINFSection %windir%\INF\msmsgs.inf,BLC.Remove 就这么简单 鲜为人知的安装和卸载绝技:巧用Rundll32.exe在Windows系统中安装和卸载程序是件非常容易的事情,一般用户通过安装和卸载程序向导就…

反向压力

大家好,我是鱼皮,今天分享一个实用的编程小知识 —— 反向压力。在介绍反向压力前,我们先聊聊什么是压力?什么是压力?我是一个打工人,日常工作就是听产品经理的话,写代码做需求。正常打工正常情…

2×3卡方检验prism_卡方独立性检验原理

这篇文章主要讲了两个部分,一个是卡方检验的推导,一个是卡方检验应该取多少样本量。卡方独立性检验是为了检验两个变量是否独立,我们先来回顾一下卡方独立性检验的流程:1、统计列联表,计算观察值:表一图中的…

不断电系统的容量如何计算?

不断电系统的容量如何计算?  1.目前市面上销售的不断电系统大都以VA(视在功率)为单位,V表示电压,A表示电流,电压乘以电流就表示功率,也就是不断电系统的容量;以一部500VA的不断电系统来说明,当…

AVL树----java

AVL树----java AVL树是高度平衡的二叉查找树 1.单旋转LL旋转 理解记忆&#xff1a;1.在不平衡的节点的左孩子的左孩子插入导致的不平衡&#xff0c;所以叫LL private AVLTreeNode<T> leftLeftRotation(AVLTreeNode<T> k2) {AVLTreeNode<T> k1;k1 k2.left;k2…

其实你女朋友也不是很爱你...

1 你玩她口红化妆品试试▼2 我妈介绍的相亲对象优点&#xff1a;每天主动问早缺点&#xff1a;每天只问早▼3 女儿过度高估老爸了▼4 国际油价暴跌全军出击买买买▼5 有人喜欢我吗&#xff1f;我爱吃炸鸡▼6 有厕纸的那部分人还有全球百分之50的双黄连▼7 其实生物书比较…

Gestalt - 在浏览器里用 python/ruby 写客户端脚本

Gestalt 是 Mix Online Lab 创造出来的一个框架&#xff0c;利用它我们可以在浏览器里用 python/ruby 写脚本来操纵 DHTML 的各种对象&#xff0c;其作用就跟 javascript 类似。一个例子&#xff1a;<script language"javascript"src"gestalt.js"/>&…

文末有彩蛋 | 第四周课程回顾与总结

我们在前三周的课程上&#xff08;第一周、第二周、第三周&#xff09;&#xff0c;系统讲授了 FOSS 和 COSS 的课程内容&#xff0c;第四周&#xff0c;我们开始进入 OSPO&#xff08;开源项目办公室&#xff09;的部分。本导学班在调研全球开源教育与课程的基础上&#xff0c…

win10 软路由_「保姆级」万晓博带你用软路由搭建家庭网络中心第1节-准备工作...

本章前言&#xff1a;  去年无意中在群我的一个群里大佬提起过软路由&#xff0c;那时候对这个需求并不是很大&#xff0c;所以对软路由只是名字概念而已&#xff0c;但是后面群里就一软路由这个话题 炒起来了&#xff0c;有的人说软路由就是利用自己闲置设备(PC笔记本)的或者…

doxygen如何生成JAVA文档_有用Doxygen生成文档的吗?发一篇Doxygen的使用文档给大家,从网上搜来的。...

第二章&#xff1a;Documenting the code特殊的注释一种特殊的注释是带有一些额外标记的C/C注释块&#xff0c;这样doxygen就知道需要将其加入到文档中了。对于每个代码块都有两种注释&#xff0c;这两种注释组成了文档&#xff1a;一种是brief 描述另一种是detailed 描述&…

【转】构建Android平台Google Map应用

http://www.moandroid.com/?p1360 Android 的新版本提供了的功能&#xff0c;通过这段视频&#xff0c;大家可以先简单了解下&#xff1a; Android 提供的地图&#xff08;Map&#xff09;功能可能是广大开发者非常关心的一个部分。到目前为止&#xff0c;开发内嵌式地图应用的…