Chapter2、对象与内存控制(3)继承方法和继承成员变量区别

对于类,很重要的特点就是方法和类的继承, 那方法的继承,类的继承,其区别是什么?书中写了这样一段代码

class Base
{
	int count = 2;
	public void display()
	{
		System.out.println(this.count);
	}
}
class Derived extends Base
{
	int count=20;
	@Override
	public void display()
	{
		System.out.println(this.count);
	}
}
public class P37
{
	public static void main(String[] args)
	{
		Base b = new Base();
		System.out.println(b.count);
		b.display();

		Derived d = new Derived();
		System.out.println(d.count);
		d.display();

		Base bd =new Derived();
		System.out.println(bd.count);
		bd.display();

		Base d2b  = d;
		System.out.println(d2b.count);
	}
}

上面程序的结果为

2
2
20
20
2
20
2

上面4个数字毫无疑问,关键是后面三个

Base bd =new Derived();
System.out.println(bd.count);
bd.display();

这三行代码中,System.out.println(bd.count);调用的是继承的变量,但声明的类型为Base型,因此调用的就是Base中的变量。
而bd.display()为继承的方法,而且被覆写,调用的就是子类的方法。
作者是怎么总结的:不管声明时用的什么类型,当通过这写变量调用方法的时候,方法的行为总是表现出他们实际类型的行为;但如果通过这些变量来访问他们所指的对象的实例变量,这写实例变量的值总是表现出声明这些变量所用类型的行为。
因此,就是说,bd方法,用的是Derived中的方法,而变量用的是Base中的变量。

this,super关键字
super关键字没有任何引用对象,不能当成一个真正的引用变量来使用。

书中对父、子对象的存储做了如下的描述:
1、当程序创建一个子类对象的时候,系统不仅为该类中定义的实例变量分配内存,也会为其父类定义的所有的实例变量来分配内存(即使子类中定义了与父类同名的实例变量)
2、如果子类中定义了与父类同名的变量,那么子类中定义的变量会隐藏父类的定义的变量,但其实父类的变量依然存在,并且分坏空间且初始化。
3、为了在子类中访问父类中定义的、被隐藏的实例变量,或者在子类中调用父类定义的或者覆写的方法,可以使用super关键字。
4、如上例子中可以使用(Base)d来访问Base中被隐藏的count变量。

About: happyhls


发表评论

电子邮件地址不会被公开。 必填项已用*标注