关于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:父类子类均有自己的值

而当我将子类的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

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

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

大胆推测一下:

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

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

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

继承是复制还是共用?例如 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子类继承来的属性与方法究竟是完全复制还是共用使用相关教程

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

  1. super构造方法为什么给子类赋值_【Java学习 | Javase】super

    整理自:动力节点基础讲义 super 概述 严格来说,super其实并不是一个引用,它只是一个关键字,super代表了当前对象中从父类继承过来的那部分特征.换句话说,super其实是this的一部分, ...

  2. 学JAVA的诗句_学Java有感(终)

    大一的下半学期逐渐步入尾声,我的Java学习也以告一段落.经过一个学期的学习,不能说是融会贯通,但也算小有心得.下面就来谈谈我对这个学期Java学习的感受吧! 在大一的上半学期,我接触到了一个计算机语 ...

  3. java多态 作用_关于Java三大特性之多态的总结

    面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. 1.定义: 多态:指允许不同类的对象对同一消息做出响应.即同一消息可 ...

  4. java画笑脸_用java编写一个颜色为红色,粗线型的笑脸和哭脸,需要继承JFrame类,用java中的绘制图形做...

    展开全部 /* * Copyright (c) cherry  Co. Ltd. * All right reserved. */ package com.cherry.swing; import j ...

  5. java基础知识点_「Java面试题/知识点精华集」20000+字的Java基础知识篇(2020最新版) !

    " 本文已经收录进我的 79K Star 的 Java 开源项目 JavaGuide:https://github.com/Snailclimb/JavaGuide (「Java学习+面试指 ...

  6. 纯java分布式内存数据库_最新Java岗面试清单:分布式+Dubbo+线程+Redis+数据库+JVM+并发...

    最近可能有点闲的慌,没事就去找面试面经,整理了一波面试题.我大概是分成了Java基础.中级.高级,分布式,Spring架构,多线程,网络,MySQL,Redis缓存,JVM相关,调优,设计模式,算法与 ...

  7. ncs java 成都 面试_成都java工程师面试一般都是哪些问题,基础难不难!

    了解了许多学员参加的Java面试,他们表示,面试官提出的基础性问题还是比较多.从这个突破口切入,Java新手想要成功通过面试,基础知识方面也需要准备,今天达内成都Java培训班小编就来给大家分享一些J ...

  8. java new thread()_(一)java多线程之Thread

    Thread类 学习java线程的开发者,首先遇到的第一个类就是Thread,通过使用Thread类,我们就可以启动,停止,中断一个线程. 在同一个时间片里, 可能会有多个线程在执行, 每个线程都拥有 ...

  9. java初始化数据报_初始化java原因

    虚拟机的类加载机制 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类 即虚拟机的类加载机制. 在Java中,类型的加载.链接 ...

最新文章

  1. error C2664: “wcscpy”: 不能将参数 1 从“LPSTR”转换为“wchar_t *”
  2. Daily Scrum 11.18
  3. [周赛][Leetcode][第5457题][JAVA][动态规划][和为奇数的子数组数目]
  4. codeforces 617A-C语言解题报告
  5. FreeSql (三十三)CodeFirst 类型映射
  6. 有望年前发布?魅族16s Pro Plus曝光:下半年旗舰担当
  7. 小学五年级计算机进度安排,苏教版小学五年级信息技术教学计划及进度安排.DOC...
  8. [科研论文]基于W7100的以太网读卡器的设计与实现
  9. React Router的Route的使用
  10. Vue引入Froala-Editor富文本编辑器
  11. FreeSurfer和FSL的安装和使用(脑部图像去除头骨+对图像和label同时进行仿射对齐)教程
  12. 利用快速傅里叶计算多项式相乘
  13. 淘宝API item_history_price - 获取商品历史价格信息
  14. 计算机课板书图片,小学信息技术课《插入图片及剪贴画》说课稿
  15. python如何模拟键盘输入_Python模拟键盘输入和鼠标操作
  16. 抖音小店在哪里登录?抖音店怎么运营?
  17. 计算机组成原理-存储系统
  18. 「 C/C++疑难杂症 」warning: ISO C++ forbids converting a string constant to ‘CHAR*’ {aka ‘char*’} [-Wwrite
  19. pytorch学习笔记(八):PytTorch可视化工具 visdom
  20. PL/SQL Developer配置使用说明

热门文章

  1. 程序员修神之路--问世间异步为何物?
  2. C# 7.0中的解构功能---Deconstruct
  3. asp.net core 发布到 docker 容器时文件体积过大及服务端口的配置疑问
  4. 想使用Docker容器?先看看这些注意事项
  5. Visual Studio “15”的第四个预览版发布
  6. dotnetConf 2016 线上虚拟大会
  7. VS2019 停止WEB项目调试时 保持IIS Express 不关闭
  8. 【数据结构与算法】拓扑排序问题C语言实现
  9. C# numericUpDown控件用法总结及注意事项
  10. Android之BaseRecyclerViewAdpater(3.0.4版本)当页面第二次滑到底部的时候没有触发OnLoadMoreListener监听的onLoadMore函数