Java学习的第二篇总结!——子类和父类 深入分析,希望大家多多支持!

从内存角度去分析代码,可以从本质上理解一门语言!

子类从父类继承分成两种:

1.方法的继承:

方法的继承,父类直接把自己的方法转移到子类中去,当然前提是父类的方法修饰符的访问范围是子类可以访问的范围,但是如果子类已经重写了父类的方法,这时候这个方法就不能重父类转移到子类中。

2.成员变量的继承 :

成员变量就会有点奇妙了,它不会从父类转移到子类,而是保留在父类中,这就会出现,子类和父类可能同时拥有两个相同名字的变量。

下面用一段代码来说明这种相对比较复杂的关系:

package com.text;

public class Test {

public static void main(String[] args) {

Father a = new Father();

Chilren b = new Chilren();

Father c = new Chilren();

a.getAge();

System.out.println(a.age);

b.getAge();

System.out.println(b.age);

c.getAge();

System.out.println(c.age);

}

}

class Father {

int age = 40;

public void getAge() {

System.out.println(age);

}

}

class Chilren extends Father {

int age = 18;

public void getAge() {

System.out.println(age);

}

}

输出

40

40

18

18

18

40

前四个结果可以理解,但是最后两个结果有人可能会问为什么结果会不一样,这段代码就体现了,成员变量继承和方法继承的区别。

可以得出结论:

Father c = new Chilren();

在以上父类引用指向子类对象情况下,访问变量看的是引用类型,所以c.age是父类的成员变量,而c.getAge()访问到的是子类Chilren的方法,所以在这个方法中用到的age变量是Chilren的变量

反正一句话,访问变量看声明,访问方法看实际对象类型(new出来的类型)

接下来对代码做部分修改

public static void main(String[] args) {

Chilren b = new Chilren();

Father c = b

System.out.println(b.age);

System.out.println(c.age);

}

输出

18

40

b 和c 两个引用都是指向内存中同一个对象,但是打印出来的结果却是不同,这就说明了,内存中保存了两个 age的值,一个是18 一个是40 。

这里就会产生一些疑问,在内存中他们是怎么存储的?这时候会想到有个super关键字,通过super. 可以访问到父类的变量和方法,这里有人会说:“super.代表的就是一个父类对象,因为他指向父类”  之前我也是这么想,但是看过一些书后知道其实不是这样

其实super.不是“东西”,说道super.自然会想到this.,有人把他们归为同类,其实他们大大不同

this:是一个真真实实对象,代表的就是当前对象,可以用 return this;  去返回一个对象。

super:不能一个对象,不是指向父类对象的意思,super只是修饰了他后边的内容,告诉JVM,后面这部分内容不是当前对象所属类的内容而已,若用return super,JVM是不允许的,是一种错误的语法。

public static void main(String[] args) {

Chilren b = new Chilren();

Father c = b

System.out.println(b.age);

System.out.println(c.age);

}

输出

18

40

回归到上面这段代码,这里并不是说内存中有两个对象 b 和 c ,内存中其实就只有一个 b对象 ,只是c 不仅有自己的实例 变量,同时也存在父类所定义的全部实例变量。

所以可以得出结论:在实例化一个子类的同时,系统会给子类所有实例变量分配内存,也会给他的父类的实例变量分配内存,及时父子类中存在重名的实例变量,也会两个都分配内存的,这个时候子类只是隐藏了父类的这个变量,但还是会给它分配内存,然后可以用super来访问属于父类的变量。

java父类和子类_深入理解子类和父类之间关系相关推荐

  1. java 接口和虚构_深入理解Java的接口和抽象类

    深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的 ...

  2. java三角形创建子类_如何创建子类,以便参数属于Java中的子类类型

    我有抽象的父类Animal: public abstract class Animal { public abstract T copyAnimal(T animal); } 然后我想创建一个子类Du ...

  3. java注释和注解_深入理解JAVA注解(Annotation)以及自定义注解

    Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制.Java 语言中的类.方法.变量.参数和包等都可以被标注.注解可以看作是一种特殊的标记,在程序在编译或 ...

  4. java抽象类的属性_深入理解Java抽象类

    基础部分内容差不多讲解完了,今天开始进入Java提高篇部分,这部分内容会比之前的内容复杂很多,希望大家做好心理准备,看不懂的部分可以多看两遍,仍不理解的部分那一定是我讲的不够生动,记得留言提醒我. 好 ...

  5. java虚引用作用_深入理解Java中的引用(二)——强软弱虚引用

    深入理解Java中的引用(二)--强软弱虚引用 在上一篇文章中介绍了Java的Reference类,本篇文章介绍他的四个子类:强引用.软引用.弱引用.虚引用. 强引用(StrongReference) ...

  6. 深入理解Java虚拟机知乎_深入理解Java虚拟机(类文件结构)

    深入理解Java虚拟机(类文件结构) 欢迎关注微信公众号:BaronTalk,获取更多精彩好文! 之前在阅读 ASM 文档时,对于已编译类的结构.方法描述符.访问标志.ACC_PUBLIC.ACC_P ...

  7. java final 变量 好处_深入理解Java中的final关键字

    Java中的final关键字非常重要,它可以应用于类.方法以及变量.这篇文章中我将带你看看什么是final关键字?将变量,方法和类声明为final代表了什么?使用final的好处是什么?最后也有一些使 ...

  8. java的双亲委派_深入理解Java的类加载器及双亲委派机制

    当我们在写完一个Java文件的时候,编译器会将.java文件编译成.class文件,然后当程序运行时,JVM首先会找到main方法所在类,并将main所在类的class文件字节码读到内存中,转换成JV ...

  9. java虚拟机编译顺序_深入理解Java虚拟机(程序编译与代码优化)

    文章首发于微信公众号:BaronTalk,欢迎关注! 对于性能和效率的追求一直是程序开发中永恒不变的宗旨,除了我们自己在编码过程中要充分考虑代码的性能和效率,虚拟机在编译阶段也会对代码进行优化.本文就 ...

最新文章

  1. wcf http 返回图片
  2. Mysql(12)——inner join的用法
  3. c语言mysql 学生信息管理系统_学生信息管理系统学生时代小作品源码(C语言版)...
  4. python labelencoder参数_对python 数据处理中的LabelEncoder 和 OneHotEncoder详解
  5. 零基础跨行学习Java是否可行
  6. 区块链浏览器_带你走进Filecoin区块链浏览器filscout.io
  7. 2层弹出页面刷新中间层
  8. jackson set properties to default value (取消让jackson 赋予默认值)
  9. php操作mysqli(示例代码)
  10. 【maven】maven基础知识总结
  11. linux grep命令使用详解
  12. viper4android 机顶盒,利用VIPer53封装上系统实现经济型机顶盒供电
  13. Win10使用快捷键新建文件夹和.txt文本文档,提升工作效率,让你成为最靓的仔
  14. 【VOLTE】SRVCC的演进
  15. Django models中的null和blank的区别
  16. 【最短路算法】第二弹:一文弄懂Bellman-Ford(贝尔曼福特算法)
  17. butter滤波器是iir吗_学习随笔之IIR滤波器与FIR滤波器
  18. CornerNet详解
  19. GAN原理及Pytorch框架实现GAN(比较容易理解)
  20. UCC21755QDWRQ1引脚图TPS92667QPHPRQ1汽车级驱动芯片

热门文章

  1. 关于住房公积金的提取
  2. CDR强大的平面设计,亿万人都在用CorelDRAW2020 XP/Win/Mac版
  3. python中numpy中一维二维三维数组的意思
  4. 写给技术Leader的财务常识:看懂三张报表
  5. 分享105个ASP整站程序源码,总有一款适合您
  6. 微信小程序中 input空间输入文字如何清空
  7. linux 音频转换工具,Ubuntu 14.04安装音频转换工具SoundConverter 2.1.3
  8. 先给荣耀上鸿蒙试水,荣耀领战,华为鸿蒙HMS全球突进
  9. 《流星蝴蝶剑》修改法详解
  10. Model Primer -- For WoW UI