面试题--多态

定义

多态是面向对象的第三大特性(封装、继承、多态),用以描述现实世界中同一事物的不同形态。

比如, 西服、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"; // 重新定义str属性(甚至可以改变数据类型和访问级别)
    static String staticStr = "staticB";

    void method() {
        System.out.println(str); // str其实前面有一个隐式的this,既this.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

分析

首先 子类对象赋给父类类型变量,使用父类变量,那么呈现出来的是父类的属性和方法。
其次 子类重写方法后,那么调用的方法就是子类的方法了。
再次 子类会继承父类属性,并能对父类属性修改,但是他们依然是两套属性了(要初始化子类必须先初始化父类,父类有一套自己的属性,子类继承后,如果不修改就有一套一样的属性)。
最后 静态属性和方法属于类而不属于具体的某个实例,使用某个实例调用静态方法属性就是调用的实例所属类的方法和属性。

原文地址:https://www.cnblogs.com/paper-man/p/13284634.html