`
chenchuangfeng
  • 浏览: 79448 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

深入理解子类和父类之间关系

    博客分类:
  • Java
阅读更多

 

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是不允许的,是一种错误的语法。

 

 

		Chilren b = new Chilren();
		Father c = b

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

 

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

 

 

 


 

3
3
分享到:
评论

相关推荐

    java父类和子类初始化顺序的深入理解

    本篇文章是对java父类和子类初始化顺序进行了详细的分析介绍,需要的朋友参考下

    深入理解Java多态.pptx.pptx

    子类继承父类后,可以使用父类的方法;接口定义了一组规范,实现接口的类需要实现这些规范;重写是在子类中重新定义父类的方法,以实现不同的功能。 多态的作用 多态可以提高代码的复用性和可扩展性。通过多态,可以...

    Java 继承与多态的深入理解

    主要介绍了Java 继承与多态的深入理解的相关资料,子类继承父类的特征和行为,使得子类具有父类的各种属性和方法。或子类从父类继承方法,使得子类具有父类相同的行为,需要的朋友可以参考下

    深入理解Java:10个示例展示核心概念和用法涵盖了类和对象、继承和多态、接口和实现、异常处理、集合框架、文件操作、多线程、输入

    2. 继承和多态:演示了继承关系和多态性的概念,子类可以重写父类的方法。 3. 接口和实现:展示了接口的定义和实现类的实现,实现类必须实现接口定义的方法。 4. 异常处理:示范了异常处理的基本用法,包括捕获和...

    《Java程序设计案例教程》教学课件05深入Java面向对象.pptx

    修饰符 class 子类名 extends 父类名 { //类体 } 除了增加"extends 父类名"以外,其余含义和类的定义相似,可参阅4.2节。 《Java程序设计案例教程》教学课件05深入Java面向对象全文共47页,当前为第6页。 5.2 继承 ...

    C++类型转换的深入总结

    C风格的强制类型转换(Type ...如子类和父类之间的多态类型转换。 reinterpret_cast,仅仅重新解释类型,但没有进行二进制的转换。 4种类型转换的格式,如:TYPE B = static_cast(TYPE)(a)。 const_cast 去掉类型的c

    深入理解c#多态

     父类中如果有方法需要子类重写,可以将该方法标记为虚方法  虚方法必须在父类中有实现,空实现也可以  虚方法子类可以重写,也可以不重写  实现静态多态性有两种方法;  函数重载  运算符重载 函数重载  即...

    深入理解C# abstract和virtual关键字

    } } class B : A // 注意B是从A类继承,所以A是父类,B是子类 { public override void Func() // 注意override ,表明重新实现了虚函数 { Console.WriteLine(“Func In B”); } } class C : B // 注意C是从B类继承,...

    深入理解javascript原型链和继承

    javascript本身不是面向对象的语言,而是基于对象的语言,对于习惯了其他OO语言的人来说,起初有些不适应,因为在这里没有“类”的概念,或者说“类”和“实例”不区分,更不要指望有“父类”、“子类”之分了。...

    深入理解C++的多态性

    C++多态性是通过虚函数来实现的,虚函数允许子类重新定义成员函数,而子类重新定义父类的做法称为覆盖(override),或者称为重写。(这里我觉得要补充,重写的话可以有两种,直接重写成员函数和重写虚函数,只有重写...

    PHP面向对象编程之深入理解方法重载与方法覆盖(多态)

    什么是多态? 多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种...在实际的应用开发中,采用面向对象中的多态主要在于可以将不同的子类对象都当作一个父类来处理,并且可以屏蔽不同子

    深入理解Python中的super()方法

    在类的继承中,如果你想要重写父类的方法而不是覆盖的父类方法,这个时候我们可以使用super()方法来实现 python语言与C++有相似的类继承,在类定义时,python中会自定义第一个self,类似C++中this指针,指向对象自身...

    深入理解JavaScript系列(41):设计模式之模板方法详解

    具体体现是面向对象编程编程语言里的抽象类(以及其中的抽象方法),以及继承该抽象类(和抽象方法)的子类。 正文 举个例子,泡茶和泡咖啡有同样的步骤,比如烧开水(boilWater)、冲泡(brew)、倒在

    深入理解Java三大特性中的多态

    多态性是对象多种表现形式的...在面向对象中,最常见的多态发生在使用父类的引用来引用子类的对象。下面这篇文章主要给大家深入的介绍了Java三大特性中多态的相关资料,有需要的朋友可以参考借鉴,下面来一起看看吧。

    疯狂JAVA讲义

    那JRE和JVM的关系是怎样的呢? 8 学生提问:为什么不安装公共JRE系统呢? 9 1.4.2 设置PATH环境变量 10 学生提问:为什么选择设置用户变量,用户变量和系统变量有什么区别呢? 11 1.5 第一个Java程序 12 1.5.1 ...

    C++入门到精通

    重新实现共享特性 它可以继承了父类的数据和操作 子类或者子类型只针对它与父类不同 的地方进行设计 例如 我们可以定义一个父类 Employee 以及两个子类型 TemporaryEmpl 和 Manager 这些子类型继承了Employee 的...

    传智播客扫地僧视频讲义源码

    07_课堂答疑什么时候子类的步长和父类的步长一样 08_抽象类基本语法 09_抽象类在多继承中的应用 10_面向抽象类编程_计算程序员工资 11_中午课程回顾 12_信息系统框架集成第三方产品案例_背景和需求 13_信息系统框架...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    该案例采用目前最流行、最规范的java ee架构,整个应用分为jpa实体层、eao层、业务逻辑层、mvc层和视图层,各层之间分层清晰,层与层之间以松耦合的方法组织在一起。该案例既提供了ide无关的、基于ant管理的项目源码...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    10.3.7 使用super调用父类中的方法和属性 278 10.4 多态(Polymorphism)以及其他 279 10.4.1 多态——运行方知结果 280 10.4.2 重载也不简单 280 10.4.3 使用多态构建车队 283 10.5 在多态的环境中拨开迷雾 ...

Global site tag (gtag.js) - Google Analytics