java只对_JAVA 多态只针对方法 不针对属性

20181014180941944936.png

1 多态是只针对方法,而不是属性的,但是写法上,子类重写父类的属性,编译器是不会报错的

class Person{

String name = "person" ;

public void shout(){

System.out.println(name);

}

}

class Stu extends Person{

String name = "student" ;

String school = "school" ;

}

public static void main(String[] args){

Person p = new Stu();

p.shout();

}

答案是Person

若是把main方法里的 Person p = new Stu() 改成 Stu s = new Stu()

s.shout()输入什么.

输出的也是Person,因为子类Stu并没有重写父类方法shout(),所以在调用shout方法的时候,

shout方法中引用的属性都将是super.属性。至于属性继承方面,确实是覆盖了,但是在父类的方法

中并未能引用到子类的属性。(子类中可以输出父类的方法,那是因为子类,没有重写父类的方法)

老师说子类继承父类之后 子类里就有父类非私有的所有属性和方法的一份拷贝

那我的p.shout()就是调用自己本身拷贝的方法.而不是父类的那个shout()方法 是这样吗?我把题目运行了 .结果发现 老师的话把我绕进去了.....谢谢大家的解答的 .

首先,不管你是Person p = new Stu(); 还是 Stu stu = new Stu(),

结果都是输出

父类的属性值

2 也是关于属性多态的

class Person{

String name = "person";

}

class Son extends Person {

String name = "son";

}

public class Test {

public static void main(String[] args){

Person p = new Son();

System.out.println(p.name);

}

}

结果为person。

为什么不是son?

变量是静态绑定,方法是动态绑定。静态绑定就是变量本身什么类型,就用哪个里面的。例如,你的p.name的p是Person类型,那么name就是Person类中的name。而如果是动态绑定,那么会从本身类型开始向超类型查找。如果name是方法,那么用于p是Son类的一个对象,所以会从Son开始找name方法,如果找不到再到父类中找

因为Person p = new Son();

就是把子类转型为父类

子类转型为父类的规则:

只能调用父类的属性

只能调用父类未被复写的方法

只能调用被子类复写的方

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值