Java超类引用子类对象的规律

首先,对于JVM实现引用的一个机制是:类实例的引用就是指向一个句柄(handle)的指针,这个句柄就是一堆指针:一个指针指向一块从java堆中为分配出来内存空间;另一个指针指向一张表(实际上这个表格也有两个指针(一个指针指向一个包含了对象的方法表,另外一个指向类对象,表明该对象所属的类型))

下面举例进行分析:  Student st=new Student();//Student为子类

Person p=st;//Person 为超类

p.sayHello();//该方法在超类和子类中都存在

分析: * 为什么子类的类型的对象实例可以覆给超类引用? 自动实现向上转型。通过该语句,编译器自动将子类实例向上移动,成为通用类型Person;  *p.sayHello()将执行子类还是父类定义的方法? 子类的。在运行时期,将根据p这个对象引用实际的类型来获取对应的方法。所以才有多态性。一个超类的对象引用,被赋予不同的子类对象引用,执行该方法时,将表现出不同的行为。 特别注意的是: 在p=st的时候,仍然是存在两个句柄,p和st,但是p和st拥有同一块数据内存块和不同的函数表。  动态链接:当父类中的一个方法只有在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用; 对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类中的这个方法,这就是动态连接。总结它为:

一、使用超类型的引用指向子类的对象;

二、该引用只能调用超类中定义的方法和变量;

三、如果子类中重写了超类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用)

四、变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了基类中的变量,那么在编译时会报错。  通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用。  java 的这种机制遵循一个原则:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。  1. 如果a是类A的一个引用,那么,a可以指向类A的一个实例,或者说指向类A的一个子类。  2. 如果a是接口A的一个引用,那么,a必须指向实现了接口A的一个类的实例。

时间: 2024-10-26 14:13:32

Java超类引用子类对象的规律的相关文章

java基础入门-父类引用子类对象(2)-抽象类

抽象类:具有抽象方法的类,需要使用abstract关键字修饰 关系图 下面上代码 package com.ray.testobject; /** * 抽象类 * * @author ray * @since 2015-05-02 * @version 1.0 * */ public abstract class Person { public abstract void getDescription(); } package com.ray.testobject; /** * 实现类 * * @

父类引用子类对象

先贴上代码 <pre name="code" class="java">package com.ray.object; /** * 父类引用子类对象 * * @author ray * @since 2015-04-30 * @version 1.0 * */ public class Test { class Person { public void say() { System.out.println("i am a person"

父类指针可以直接指向子类对象,父类引用可以直接引用子类对象

1 #include<iostream> 2 #include<string> 3 using namespace std; 4 class parent{ 5 public: 6 int mi; 7 void add(int v){ 8 mi += v; 9 } 10 void add(int a,int b){ 11 mi += (a+b); 12 } 13 }; 14 class child:public parent{ 15 public: 16 int mv; 17 vo

java父类引用指向子类对象

父类引用指向子类对象指的是: 例如父类Animal,子类Cat,Dog.其中Animal可以是类也可以是接口,Cat和Dog是继承或实现Animal的子类. Animal animal = new Cat(); 即声明的是父类,实际指向的是子类的一个对象. 那这么使用的优点是什么,为什么要这么用?可以用这几个关键词来概括:多态.动态链接,向上转型 也有人说这是面向接口编程,可以降低程序的耦合性,即调用者不必关心调用的是哪个对象,只需要针对接口编程就可以了,被调用者对于调用者是完全透明的.让你更关

Java超类对象引用访问子类对象

下面举例进行分析:  Student st=new Student();//Student为子类 Person p=st;//Person 为超类 p.sayHello();//该方法在超类和子类中都存在 分析: * 为什么子类的类型的对象实例可以覆给超类引用? 自动实现向上转型.通过该语句,编译器自动将子类实例向上移动,成为通用类型Person:  *p.sayHello()将执行子类还是父类定义的方法? 子类的.在运行时期,将根据p这个对象引用实际的类型来获取对应的方法.所以才有多态性.一个

【转】父类引用指向子类对象

父类引用指向子类对象指的是: 例如父类Animal,子类Cat,Dog.其中Animal可以是类也可以是接口,Cat和Dog是继承或实现Animal的子类. Animal animal = new Cat(); 即声明的是父类,实际指向的是子类的一个对象. 那这么使用的优点是什么,为什么要这么用?可以用这几个关键词来概括:多态.动态链接,向上转型 也有人说这是面向接口编程,可以降低程序的耦合性,即调用者不必关心调用的是哪个对象,只需要针对接口编程就可以了,被调用者对于调用者是完全透明的.让你更关

理解多态AND理解父类引用指向子类对象

假设现在有一个父类Father,它里面的变量需要占用1M内存.有一个它的子类Son,它里面的变量需要占用0.5M内存. 现在通过代码来看看内存的分配情况: Father f = new Father();//系统将分配1M内存. Son s = new Son();//系统将分配1.5M内存. 因为子类中有一个隐藏的引用super会指向父类实例,所以在实例化子类之前会先实例化一个父类,也就是说会先执行父类的构造函数. 由于s中包含了父类的实例,所以s可以调用父类的方法. Son s1 = s;/

C#父类子类对象关系

案例: 主要有Vehicle.cs  Airplane.cs   Car.cs  3个类. Car和Airplane都继承与Vehicle类.Vehicle中Drive为虚方法,可在子类中重写,父类引用子类对象,并在car中重写了Drive方法. 1 class Vehicle 2 { 3 public void StartEngine(string noiseToMakeWhenStaring) 4 { 5 Console.WriteLine("starting engine:{0}"

java多态,如何理解父类引用指向子类对象

摘录 要理解多态性,首先要知道什么是“向上转型”. 我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类.我可以通过   Cat c = new Cat(); 实例化一个Cat的对象,这个不难理解. 但当我这样定义时:   Animal a = new Cat(); 表示定义了一个Animal类型的引用,指向新建的Cat类型的对象.由于Cat是继承自它的父类Animal,所以Animal类型的引用是可以指向Cat类型的对象的. 那么这样做有什么意义呢?因为子类是对父类的一个改进