访问子类对象的实例变量

原创 2013年12月06日 09:55:13
/**
 * Description:
 * <br/>网站: <a href="http://www.crazyit.org">疯狂Java联盟</a>
 * <br/>Copyright (C), 2001-2014, Yeeku.H.Lee
 * <br/>This program is protected by copyright laws.
 * <br/>Program Name:
 * <br/>Date:
 * @author Yeeku.H.Lee kongyeeku@163.com
 * @version 1.0
 */
class Base
{
	// 定义了一个名为i的实例变量
	private int i = 2;
	public Base()
	{
		this.display();
	}
	public void display()
	{
		System.out.println(i);
	}
}
// 继承Base的Derived子类
class Derived extends Base
{
	// 定义了一个名为i的实例变量
	private int i = 22;
	// 构造器,将实例变量i初始化为222
	public Derived()
	{
		i = 222;              //②
	}
	public void display()
	{
		System.out.println(i);
	}
        public void sub(){}
 }
public class Test
{
	public static void main(String[] args)
	{
		// 创建Derived的构造器创建实例
		new Derived();       //①
	}
}


输出结果:0

在生成子类实例时先调用父类的构造器,生成父类的实例,构造器的调用是完成java对象的初始化,但在此之前java对象已经分配好 内存空间-----0或nul.

在执行Derived的构造器之前系统先调用Base的构造器,此时 一行代码 this.display(); 经过编译处理应该包含两行代码i=2;this.display();但此时this代表什么?

先看如下代码:

	public Base()
	{
		// 直接输出this.i
		System.out.println(this.i);
		this.display();
	}
此时输出2 , 0

为什么?

当this在构造器中时,this代表正在初始化的java对象.但此时,this位于Base构造器内,但这些代码实际放在Derived的构造器中------是Derived的构造器隐式调用Base构造器的代码.

由此可见this代表Derived对象.

但是为什么上例会输出2呢?

这是因为:这个this虽然代表Derived对象,但是却位于Base构造器中,它的编译类型是Base,实际引用的是一个Derived对象(父类引用指向子类对象).为证明这一点,再次改写程序


public Base()
	{
		// 直接输出this.i
		System.out.println(this.i);
		this.display();
		// 输出this实际的类型,将看到输出Derived
		System.out.println(this.getClass());
		// 因为this的编译类型是Base,所以依然不能调用sub()方法,
		// this.sub();
	}
上面程序调用this.getClass()来获取this代表的对象,将看到输出Derived类,这代表此时this引用代表的是Derived对象.但是却无法调用sub()方法,编译出错,这就是因为this的编译时类型是Base的缘故.

当变量的编译时类型和运行时类型不一样时,通过访问它引用的实例对象时,该实例对象的值是由声明该变量的类型决定.但通过该变量调用它引用的对象的方法时,将会调用实际引用的对象的方法.即父类引用(Father father)指向子类对象(Sun sun)时,调用father 的变量时将是父类的变量,而调用方法时将是子类的方法.


版权声明:本文为博主原创文章,转载请注明出处。

Java之访问子类对象的实例变量

子类的方法可以访问父类的实例变量,这是因为子类继承父类就会获得父类的成员变量和方法。 父类的方法不能访问子类的实例变量,父类无从知道它将被哪个子类继承,它的子类将会增加怎样的成员变量。 Java对象不...

java 父类访问子类对象的实例变量 继承过程中的执行顺序

子类的方法可以访问父类的实例变量,

java 程序加载过程---3--类中申明同时申明类的静态对象 创建类的实例 访问类的静态变量 调用类的静态方法 使用反射方法 初始化类的子类对象 直接使用java.exe 调用某个类

java 程序加载过程---3---申明类的静态对象===》常见的应用是单例模式(饿汉式) 大家知道,只要打开任何一个开源软件,看到很多在类申明时候同时申明一个静态对象,此种情况JVM是如何加载的呢?...

OC中继承子类对象调用方法机制 子类对象访问父类中的实例变量

在继承中,子类对象如何调用到正确方法的机制        每一个Objective - C对象都有一个隐藏的指针指向类的代码,当向一个对象发送消息的时候,当前的对象会首先在当前类里去查找相应的方...
  • ysxr001
  • ysxr001
  • 2014年11月08日 15:41
  • 954

OC中继承子类对象调用方法机制 子类对象访问父类中的实例变量

在继承中,子类对象如何调用

java继承中父类变量引用子类对象的问题--有关动态绑定

java 第一遍,动态绑定笔记Java核心技术卷(一)153页: //类的设定: //子类Manager继承于父类Employee //父类方法有getName(),getSalary() ...

深入理解父类变量引用子类对象

从对象的内存角度出发 假设现在有一个父类Father,它里面的变量需要占用1M内存.有一个它的子类Son,它里面的变量需要占用0.5M内存. 现在通过代码来看看内存的分配情况:(假设子类继承父类所...

实例:父类指针操作子类对象,以及dynamic_cast和static_cast的比较

实例:父类指针操作子类对象,以及dynamic_cast和static_cast的比较

java学习之路 之 高级类特性-四种权限修饰符、关键字super、子类对象的实例化过程

四种访问权限修饰符 Java权限修饰符public、protected、private置于类的成员定义前,用来限定对象对该类对象成员的访问权限。 对于class的权限修饰只可以用public和de...

java基础_day0022_java关键字_this_super_构造器_子类对象实例化

super 关键字  调用 父类中和子类中 重名的 属性 和方法    调用父类的属性和方法  用super.关键字  调用子类中的属性和方法用this. 如果只有父类和子...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:访问子类对象的实例变量
举报原因:
原因补充:

(最多只允许输入30个字)