博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
深入理解子类和父类之间关系
阅读量:4654 次
发布时间:2019-06-09

本文共 1986 字,大约阅读时间需要 6 分钟。

 

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);	}} 输出404018181840

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

可以得出结论

  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);	} 输出1840

  

     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);	} 输出1840   

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

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

 

 

 

 

 

转载于:https://www.cnblogs.com/chenchuangfeng/archive/2013/06/10/3130329.html

你可能感兴趣的文章
BZOJ3145 [Feyat cup 1.5]Str 后缀树、启发式合并
查看>>
CF573E Bear and Bowling 贪心、分块、凸包
查看>>
CF1190E Tokitsukaze and Explosion 二分、贪心、倍增、ST表
查看>>
LOJ2392 JOISC2017 烟花棒 二分、贪心
查看>>
LOJ2336 JOI2017 绳 贪心、构造
查看>>
LOJ2257 SNOI2017 遗失的答案 容斥、高维前缀和
查看>>
牛客挑战赛32
查看>>
Codeforces Round #588 (Div. 1)
查看>>
STM32 HAL库 UART 串口读写功能笔记
查看>>
stm32中阻塞模式和非阻塞模式 in blocking mode 与 in non-blocking mode区别
查看>>
再看传指针
查看>>
数字pid笔记(2)
查看>>
Visual Studio Code快速删除空行及几个常用快捷键总结
查看>>
STM32F103C8T6最小板搞定CMSIS-DAP和SWO功能
查看>>
一篇文章让您了解MQTT
查看>>
MQTT介绍与使用
查看>>
ESP8266—“ICACHE_FLASH_ATTR”宏
查看>>
Win10系统如何在防火墙里开放端口
查看>>
ESP8266常见问题汇总——转载自官网
查看>>
初识 MQTT——IBM
查看>>