面试题--多态

子类继承父类(有静态和非静态方法分别输出静态和非静态变量,子类对两个变量重新赋值,方法不动放过来)使用向下转型创建对象,这个对象直接获取两个变量和方法分别输出什么。

多态是面向对象的第三大特性,对应现实世界中同一事物的不同形态。
比如, 西服、T恤和夹克都继承与‘衣服’,都是衣服的一种形态。

多态的三个条件:1 子类继承父类 2 子类重写父类方法 3 向上转型

所描述的类图如下:

public class Person {
    String str = "A";
    static String staticStr = "staticA";

    void method() {
        System.out.println(str);
    }
    static void staticMethod() {
        System.out.println(staticStr);
    }
}

public class Son extends Person {
    String str = "B";
    static String staticStr = "staticB";

    void method() {
        System.out.println(str);
    }
    static void staticMethod() {
        System.out.println(staticStr);
    }
}
// 以下代码分别输出什么
Person p = new Son();
System.out.println(p.str);
p.method();
System.out.println(p.staticStr);
p.staticMethod();

输出为:
A
B
staticA
staticA

分析:
子类对象赋给父类变量,对外呈现的是父类的属性和方法。但是有些方法被子类重写后,调用的是子类的方法,继承的属性,同样可以被重写。
当我们使用父类变量调用方法的时候,如果子类没有重写,那么调用的就是父类的方法,返回的当然也是父类的属性。当子类重写方法后,那么调用的就是子类的方法,返回的当然也是子类的属性。
但当是静态方法和属性的时候就另当别论了,静态方法和属性属于类而不属于类的对象,使用父类的变量就是使用父类的类,和具体是哪个对象无关了。

你可能感兴趣的:(java)