访问子类对象的实例变量

原创 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对象不...
  • Julin1214
  • Julin1214
  • 2016年05月24日 17:01
  • 366

访问子类对象实例变量

子类的方法可以访问父类的实例变量,这是因为子类继承父类就会获得父类的成员变量和方法;但父类的方法不能访问子类的实例变量,因为父类根本无从知道它将被哪个子类继承.它的子类将会增加怎样的成员变量. 但是,...
  • licheng989
  • licheng989
  • 2016年12月16日 09:32
  • 159

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

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

实例变量和类变量、类方法和实例方法

类体中包括成员变量和局部变量,而成员变量又可以细分为实例变量和类变量,在声明成员变量的时候,用static给予修饰的称作类变量,否则称作实例变量。 那么,类变量和实例变量有什么区别呢? 我们知道,...
  • qq_30070433
  • qq_30070433
  • 2016年08月25日 12:01
  • 1739

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

子类的方法可以访问父类的实例变量,
  • tianzhiwaidexue
  • tianzhiwaidexue
  • 2014年10月09日 10:33
  • 1235

Effective OC 2.0读书笔记 第7条:在对象内部尽量直接访问实例变量

Effective OC 2.0是一本非常赞的书,如果让我评分,我绝对给10分。 之前读了一遍Effective OC 2.0这本书,现在的想法是将里面的建议实践到工程中,同时将一些使用心得总结成博客...
  • u010962810
  • u010962810
  • 2014年05月04日 22:39
  • 1909

对用父类指针(或引用)指向父类对象和子类对象时,从而用父类指针或者引用访问成员时的深刻理解;

赋值兼容规则永远不变,父类指针既可以指向父类对象,也可以指向子类对象;当父类指针指向父类对象时,访问父类的成员;当父类指针指向子类对象时,那么只能访问子类中从父类继承下来的那部分成员;不能访问子类独有...
  • gogogo_sky
  • gogogo_sky
  • 2017年06月17日 14:40
  • 871

Java-关于子类是否继承了父类的private实例变量

   对面向对象程序设计语言中,对象模型是实现诸如封装、继承、多态的重要基础。在常见的面向对象语言:C++和Java等中,子类是继承了父类的所有实例字段的:也就是一个子类对象中包含了一个完整的父类对象...
  • xinglongbing
  • xinglongbing
  • 2008年09月11日 08:58
  • 5560

如何修改和访问方法中受保护的实例变量

1.实例变量的可见度有三种. 公共的(public) 实例变量可以在类的内部和外部操作。 受保护的(protected)实例变量只能在该类的内部及其子类中进行操作 私有的(private...
  • wangxuejuan1125
  • wangxuejuan1125
  • 2015年11月07日 15:44
  • 408

为什么父类引用可以指向子类对象 子类引用不能指向父类对象 泛型

假设有父类Fu ,其子类为Zi ,从对象的内存角度,假设Fu类里面的变量占内存2M, Zi 类里的变量占内存1M: Fu f = new Fu ();//系统将分配2M内存 Zi z = ne...
  • lifewinnerforever
  • lifewinnerforever
  • 2017年05月29日 11:39
  • 587
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:访问子类对象的实例变量
举报原因:
原因补充:

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