探究内存中子类实例

本文探讨了Java中的继承特性,当子类继承父类时,系统会为父类的实例变量分配内存,即使子类有同名变量。子类的变量会隐藏父类的变量,但并未覆盖,仍可使用`super`关键字访问。示例代码展示了如何在子类中访问父类的实例变量和方法。
摘要由CSDN通过智能技术生成

class Fruit {
    String color = "未确定颜色";

    // 定义一个方法,该方法返回调用该方法的实例
    public Fruit getThis() {
        return this;
    }

    public void info() {
        System.out.println("Fruit方法");
    }
}

public class Apple extends Fruit {
    String color = "红色";



    // 重写父类的方法
    @Override
    public void info() {
        System.out.println("Apple方法");
    }

    // 通过super调用父类的Info()方法
    public void AccessSuperInfo() {
        super.info();
    }

    // 尝试返回super关键字代表的内容
    public Fruit getSuper() {
        return super.getThis();
    }


	public static void main(String[] args) {
		// 创建一个Apple对象
		Apple a = new Apple();
		// 调用getSuper()方法获取Apple对象关联的super引用
		Fruit f = a.getSuper();
		// 判断a和f的关系
		System.out.println("a和f所引用的对象是否相同:" + (a == f));
		System.out.println("访问a所引用对象的color实例变量:" + a.color);
		System.out.println("访问f所引用对象的color实例变量:" + f.color);
		// 分别通过a、f两个变量来调用info方法
		a.info();
		f.info();
		// 调用AccessSuperInfo来调用父类的info()方法
		a.AccessSuperInfo();
	}
}

 我们可以得出一个结论:

当程序创建一个子类对象时,系统不仅会为该类定义的实例变量分配内存,也会为其父类中定义的所有实例变量分配内存,即使子类与父类有同名的实例变量。也就是说,当系统创建一个 Java 对象时,如果该 Java 类有2个父类(一个直接父类 A ,一个间接父类 B ),假设 A 类中定义了2个实例变量, B 类中定义了3个的变量,当前类中定义了2个实例变量,那么这个 Java 对象将会保存2+3+2个实例变重。

如果在类里定义了与父类中已有变量同名的变量,那么子类中定义的变量会隐藏在父类中定义的变量。注意:不是完全覆盖,因此系统在创建子类对象时,依然会为父类中定义的、被隐藏的变量分配内存空间。


为了在子类方法中访问父类中定义的、被隐藏的实例变量,或者为了在子类方法中调用用父类中定义的、被覆盖( Override )的方法,可以使用 super .作为限定来修饰这些实例变量和实例方法

因为子类中定义与父类中同名的实例变量并不会完全覆盖父类中定义的实例变量,它只是简单的隐藏了父类中的实例变量

我们可以看下下面代码




class Parent
{
	public String tag = "疯狂Java讲义";        // ①
}
class Derived extends Parent
{
	// 定义一个私有的tag实例变量来隐藏父类的tag实例变量
	private String tag = "轻量级Java EE企业应用实战";// ②
}
public class HideTest
{
	public static void main(String[] args)
	{
		Derived d = new Derived();
		// 程序不可访问d的私有变量:tag,所以下面语句引起编译错误
		// System.out.println(d.tag);          // ③
		// 将d变量显式地向上转型为Parent后,即可访问tag实例变量,
		// 程序将输出:"疯狂Java讲义"
		System.out.println(((Parent) d).tag);   // ④
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值