java同类项引用相同对象_Java中类的属性不体现多态性

http://blog.csdn.net/l_b_h_w/article/details/52665231

多态出现的缘由:java的引用变量有两种类型:一个是编译时的类型,一个是运行时类型。

编译时类项:声明该变量时使用的类型决定。

运行时类项:实际赋给该变量的对象决定

如果编译时和运行时类项不一样就会出现所谓的多态(polymorphism)。

多态:相同类项的变量执行同一个方法时,呈现出不同的行为特征这就是多态。

注意:引用变量在编译阶段只能调用其编译时类项所具有的方法,但运行时则执行运行时类项所具有的方法,因此编译java代码时,引用变量只能调用声明该变量时类项里包含的方法,如:Object p = new Person()定义一个变量p,p只能调用Object类得方法而不能调用person类里定义的方法。

与方法不同的是对象的属性则不具有多态性。

子类从父类继承分成两种:

1.方法的继承:

方法的继承,父类直接把自己的方法转移到子类中去,当然前提是父类的方法修饰符的访问范围是子类可以访问的范围,但是如果子类已经重写了父类的方法,这时候这个方法就不能重父类转移到子类中。

2.成员变量的继承 :

成员变量就会有点奇妙了,它不会从父类转移到子类,而是保留在父类中,这就会出现,子类和父类可能同时拥有两个相同名字的变量。

下面用一段代码来说明这种相对比较复杂的关系:

public class Test

{

public static void main(String[] args)

{

Father a = new Father();

Chilren b = new Chilren();

Father c = new Chilren();

a.getAge();

System.out.println(a.age);

b.getAge();

System.out.println(b.age);

c.getAge();

System.out.println(c.age);

}

}

class Father

{

int age = 40;

public void getAge()

{

System.out.println(age);

}

}

class Chilren extends Father

{

int age = 18;

public void getAge()

{

System.out.println(age);

}

}

输出

40

40

18

18

18

40

前四个结果可以理解,但是最后两个结果有人可能会问为什么结果会不一样,这段代码就体现了,成员变量继承和方法继承的区别。

可以得出结论:Father c = new Chilren(); 在以上父类引用指向子类对象情况下,访问变量看的是引用类型,所以c.age是父类的成员变量,而c.getAge()访问到的是子类Chilren的方法,所以在这个方法中用到的age变量是Chilren的变量

反正一句话,访问变量看声明,访问方法看实际对象类型(new出来的类型)

接下来对代码做部分修改:

public static void main(String[] args)

{

Chilren b = new Chilren();

Father c = b

System.out.println(b.age);

System.out.println(c.age);

}

输出

18

40

b 和c 两个引用都是指向内存中同一个对象,但是打印出来的结果却是不同,这就说明了,内存中保存了两个 age的值,一个是18 一个是40 。

这里就会产生一些疑问,在内存中他们是怎么存储的?这时候会想到有个super关键字,通过super. 可以访问到父类的变量和方法,这里有人会说:“super.代表的就是一个父类对象,因为他指向父类” 之前我也是这么想,但是看过一些书后知道其实不是这样。

其实super.不是“东西”,说道super.自然会想到this.,有人把他们归为同类,其实他们大大不。this:是一个真真实实对象,代表的就是当前对象,可以用 return this; 去返回一个对象。super:不能一个对象,不是指向父类对象的意思,super只是修饰了他后边的内容,告诉JVM,后面这部分内容不是当前对象所属类的内容而已,若用return super,JVM是不允许的,是一种错误的语法。

回归到上面这段代码,这里并不是说内存中有两个对象 b 和 c ,内存中其实就只有一个 b对象 ,只是c 不仅有自己的实例 变量,同时也存在父类所定义的全部实例变量。

所以可以得出结论:在实例化一个子类的同时,系统会给子类所有实例变量分配内存,也会给他的父类的实例变量分配内存,及时父子类中存在重名的实例变量,也会两个都分配内存的,这个时候子类只是隐藏了父类的这个变量,但还是会给它分配内存,然后可以用super来访问属于父类的变量。

参考:深入理解子类和父类之间关系

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值