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:父类子类均有自己的值
而当我将子类的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子类继承来的属性与方法究竟是完全复制还是共用使用...相关推荐
- super构造方法为什么给子类赋值_【Java学习 | Javase】super
整理自:动力节点基础讲义 super 概述 严格来说,super其实并不是一个引用,它只是一个关键字,super代表了当前对象中从父类继承过来的那部分特征.换句话说,super其实是this的一部分, ...
- 学JAVA的诗句_学Java有感(终)
大一的下半学期逐渐步入尾声,我的Java学习也以告一段落.经过一个学期的学习,不能说是融会贯通,但也算小有心得.下面就来谈谈我对这个学期Java学习的感受吧! 在大一的上半学期,我接触到了一个计算机语 ...
- java多态 作用_关于Java三大特性之多态的总结
面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. 1.定义: 多态:指允许不同类的对象对同一消息做出响应.即同一消息可 ...
- java画笑脸_用java编写一个颜色为红色,粗线型的笑脸和哭脸,需要继承JFrame类,用java中的绘制图形做...
展开全部 /* * Copyright (c) cherry Co. Ltd. * All right reserved. */ package com.cherry.swing; import j ...
- java基础知识点_「Java面试题/知识点精华集」20000+字的Java基础知识篇(2020最新版) !
" 本文已经收录进我的 79K Star 的 Java 开源项目 JavaGuide:https://github.com/Snailclimb/JavaGuide (「Java学习+面试指 ...
- 纯java分布式内存数据库_最新Java岗面试清单:分布式+Dubbo+线程+Redis+数据库+JVM+并发...
最近可能有点闲的慌,没事就去找面试面经,整理了一波面试题.我大概是分成了Java基础.中级.高级,分布式,Spring架构,多线程,网络,MySQL,Redis缓存,JVM相关,调优,设计模式,算法与 ...
- ncs java 成都 面试_成都java工程师面试一般都是哪些问题,基础难不难!
了解了许多学员参加的Java面试,他们表示,面试官提出的基础性问题还是比较多.从这个突破口切入,Java新手想要成功通过面试,基础知识方面也需要准备,今天达内成都Java培训班小编就来给大家分享一些J ...
- java new thread()_(一)java多线程之Thread
Thread类 学习java线程的开发者,首先遇到的第一个类就是Thread,通过使用Thread类,我们就可以启动,停止,中断一个线程. 在同一个时间片里, 可能会有多个线程在执行, 每个线程都拥有 ...
- java初始化数据报_初始化java原因
虚拟机的类加载机制 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类 即虚拟机的类加载机制. 在Java中,类型的加载.链接 ...
最新文章
- error C2664: “wcscpy”: 不能将参数 1 从“LPSTR”转换为“wchar_t *”
- Daily Scrum 11.18
- [周赛][Leetcode][第5457题][JAVA][动态规划][和为奇数的子数组数目]
- codeforces 617A-C语言解题报告
- FreeSql (三十三)CodeFirst 类型映射
- 有望年前发布?魅族16s Pro Plus曝光:下半年旗舰担当
- 小学五年级计算机进度安排,苏教版小学五年级信息技术教学计划及进度安排.DOC...
- [科研论文]基于W7100的以太网读卡器的设计与实现
- React Router的Route的使用
- Vue引入Froala-Editor富文本编辑器
- FreeSurfer和FSL的安装和使用(脑部图像去除头骨+对图像和label同时进行仿射对齐)教程
- 利用快速傅里叶计算多项式相乘
- 淘宝API item_history_price - 获取商品历史价格信息
- 计算机课板书图片,小学信息技术课《插入图片及剪贴画》说课稿
- python如何模拟键盘输入_Python模拟键盘输入和鼠标操作
- 抖音小店在哪里登录?抖音店怎么运营?
- 计算机组成原理-存储系统
- 「 C/C++疑难杂症 」warning: ISO C++ forbids converting a string constant to ‘CHAR*’ {aka ‘char*’} [-Wwrite
- pytorch学习笔记(八):PytTorch可视化工具 visdom
- PL/SQL Developer配置使用说明
热门文章
- 程序员修神之路--问世间异步为何物?
- C# 7.0中的解构功能---Deconstruct
- asp.net core 发布到 docker 容器时文件体积过大及服务端口的配置疑问
- 想使用Docker容器?先看看这些注意事项
- Visual Studio “15”的第四个预览版发布
- dotnetConf 2016 线上虚拟大会
- VS2019 停止WEB项目调试时 保持IIS Express 不关闭
- 【数据结构与算法】拓扑排序问题C语言实现
- C# numericUpDown控件用法总结及注意事项
- Android之BaseRecyclerViewAdpater(3.0.4版本)当页面第二次滑到底部的时候没有触发OnLoadMoreListener监听的onLoadMore函数