• 面试王牌 JAVA 多态只针对方法 不针对属性


    子类是永远继承父类的非私有化方法,当子类中重写父类方法时,调用的是子类的方法,没有重写时,调用的是父类中的方法

    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();

    就是把子类转型为父类

    子类转型为父类的规则:

    1. 只能调用父类的属性

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

    3. 只能调用被子类复写的方

  • 相关阅读:
    SpringCloud组件---Ribbon
    SpringCloud组件---Eureka
    tomcat及Jetty远程调试debug
    mysql 删除重复数据
    mysql执行SQL语句时报错:[Err] 3
    线程池原理剖析
    上限下限
    线程池Executors、Callable与Future的应用
    spring获取bean(自定义工具类)
    java.util.concurrent.Exchanger应用范例
  • 原文地址:https://www.cnblogs.com/zhouxiansheng/p/4120578.html
Copyright © 2020-2023  润新知