`

Java 深层理解 父类引用指向子类对象

    博客分类:
  • J2SE
阅读更多

从对象的内存角度来理解试试.
假设现在有一个父类Father,它里面的变量需要占用1M内存.有一个它的子类Son,它里面的变量需要占用0.5M内存.
现在通过代码来看看内存的分配情况:
Father f = new Father();//系统将分配1M内存.
Son s = new Son();//系统将分配1.5M内存!因为子类中有一个隐藏的引用super会指向父类实例,所以在实例化子类之前会先实例化一个父类,也就是说会先执行父类的构造函数.由于s中包含了父类的实例,所以s可以调用父类的方法.
Son s1 = s;//s1指向那1.5M的内存.
Father f1 = (Father)s;//这时f1会指向那1.5M内存中的1M内存,即是说,f1只是指向了s中实例的父类实例对象,所以f1只能调用父类的方法(存储在1M内存中),而不能调用子类的方法(存储在0.5M内存中).
Son s2 = (Son)f;//这句代码运行时会报ClassCastException.因为f中只有1M内存,而子类的引用都必须要有1.5M的内存,所以无法转换.
Son s3 = (Son)f1;//这句可以通过运行,这时s3指向那1.5M的内存.由于f1是由s转换过来的,所以它是有1.5M的内存的,只是它指向的只有1M内存.

分享到:
评论
2 楼 nihaokid 2011-08-27  
方法是不会存在在对象内存中的,它存在于方法区,建议看看jvm的东西
1 楼 vissalan 2010-05-31  
有一点没看明白
Father f1 = (Father)s;
这时f1会指向那1.5M内存中的1M内存
那么Son s3 = (Son)f1这句不会报错吗?

相关推荐

    父类引用指向子类对象

    在Java编程语言中,"父类引用指向子类对象"是一种常见的多态性表现,它体现了面向对象设计的核心原则之一。这种现象发生时,父类类型的引用被用来创建和操作子类的对象,允许我们利用子类扩展的功能,同时保持代码的...

    java 子类对象赋值给父类对象的使用

    4. **类型转换**:虽然父类引用可以指向子类对象,但反过来不行,即子类引用不能直接指向父类对象。若要从父类引用转回子类引用,需要进行类型转换(downcasting),如`Dog dog = (Dog) animal;`,但需要注意,只有...

    父类引用指向子类对象[归纳].pdf

    在Java编程中,"父类引用指向子类对象"是一种常见的多态性表现形式,它体现了面向对象设计的核心原则之一。这种技术允许我们通过父类的引用或接口来调用子类的方法,从而实现了代码的灵活性和可扩展性。下面我们将...

    父类赋值给子类

    在编程领域,特别是面向对象编程中,"父类赋值给子类" 是一个常见的操作。C# 作为一种强大的面向对象的语言,提供了多种方式来实现这种继承关系下的数据复制。这里我们将深入探讨如何在 C# 中进行父类属性到子类属性...

    【Java基础】怎么理解父类引用能指向子类对象?

    因为子类中有一个隐藏的引用super会指向父类实例,所以在实例化子类之前会先实例化一个父类,也就是说会先执行父类的构造方法,由于s中包含了父类的实例,所以s可以调用父类的方法。 下面我们来看一下代码:

    ChildClass.java

    父类引用指向子类对象时,没法调用子类特有的方法; 父类引用指向子类对象: java中子类强转父类,实际上依然是子类; 该引用只能调用父类中定义的方法和变量; 如果子类中重写了父类中的一个方法,那么在...

    java多态性详解——父类引用子类对象

    在Java中,我们可以通过父类的引用变量来指向子类的对象,这种现象被称为“向上转型”(Upcasting)。例如: ```java class Animal {} // 父类 class Cat extends Animal {} // 子类 public class Test { public ...

    在父类获取子类属性

    总结,理解和正确使用“在父类获取子类属性”这一概念是Java编程中一个重要的技能,它涉及到继承、封装和多态等面向对象编程的核心概念。在实际应用中,我们需要根据具体场景选择合适的方式来访问和操作子类的属性,...

    将子类引用赋给父类对象时,java虚拟主机并没有将那些非继承成员丢弃

    这个过程被称为向上转型(Upcasting),它允许我们用父类引用指向子类实例,从而实现更通用的代码设计。然而,这并不意味着在转换过程中会丢失子类的非继承成员,即那些在父类中不存在的方法或属性。Java虚拟机(JVM...

    java多态性详解——父类引用子类对象.pdf

    多态性是 Java 面向对象编程的精髓所在,它可以通过父类类型的引用指向子类的对象、方法的重写和重载、动态连接来实现。多态性可以提高程序的灵活性和可扩展性,使得程序更加灵活和强大。 知识点: 1. 多态性是 ...

    论JAVA继承机制中父类与子类的关系

    文章围绕子类继承父类成员的过程、成员变量及方法的赋值、重写、覆盖等问题展开讨论,旨在帮助读者更好地理解Java继承中的重点与难点。 #### 关键词 - 继承机制 - 父类 - 子类 #### 一、超类的属性或方法在继承...

    Java中父类怎么调用子类的方法

    Java中父类调用子类的方法是面向对象编程中一个常见的问题,了解如何在Java中实现父类调用子类的方法对于编程开发者来说非常重要。本文将通过示例代码和详细的解释,介绍三种方式来实现父类调用子类的方法,并对每...

    java反射获取所有属性,获取所有get方法,包括子类父类

    在Java中,反射主要用于在运行时分析类和对象,包括访问私有成员、调用私有方法、创建动态代理等。在标题和描述中提到的知识点主要集中在如何通过反射获取类的所有属性和get方法,包括来自子类和父类的。下面将详细...

    day02-多态&抽象类&接口1

    在Java中,多态的实现基于继承、方法重写以及父类引用指向子类对象。 1.1 多态的概述 多态(Polymorphism)是指同一个对象在不同的情况下表现出不同的行为特性。在Java中,多态的实现有以下前提条件: - 继承关系...

    子类、父类查询

    有关子类和父类。A是子类,Teacher是父类。A是Teacher 的一种(子类)会继承父类李非私

    java子类重写父类的方法.doc

    在 Java 中,多态只看父类引用的方法,而不看子类对象的方法。这意味着,如果父类有一个方法 `void eat() { ... }`,子类可以定义一个同名的方法 `void eat() { ... }`,但这只是子类的方法,而不是重写父类的方法。...

    Java中父类和子类之间的转换操作示例

    在 Java 中,父类和子类之间的转换操作可以分为两种:父类引用强转成为子类引用和父类不可以强转成为子类。 一、父类引用强转成为子类引用 在 Java 中,父类引用可以强转成为子类引用。这意味着,我们可以将父类...

    java中的继承(子类调用父类构造方法还不懂).doc

    - **上溯造型**:使用父类的引用指向子类的对象。例如: ```java Father f = new Son1(); f.bidBoy(); ``` 在这个例子中,虽然`f`是`Father`类型的引用,但它实际上指向的是`Son1`对象。因此,`f.bidBoy()`调用的...

Global site tag (gtag.js) - Google Analytics