求问 倒数两句代码

图片说明
图片说明

求问 为什么倒数两句代码

who.method(); 为什么打印的是Sub的method()方法而不是Base的
who.staticMethod();要是按上面道理,这个为什么又不是打印Sub类的staticMethod()
更多

这是父类对子类的实例化
实例化后的对象为子类对象

父类可以实例化任何继承自己的子类 \

就像接口一样 接口实例化继承它的类 实例化的对象也是这个类的对象 而不是接口对象

java多态的条件有3个:1、继承或实现,2、重写方法,3、父类对象子类引用。那么java的多态是针对父类里面的方法而言的,变量是没有多态这个说法的。

Sub 继承 base,base 非静态方法method()被Sub覆盖了,当实例化对象时执行的method()已经被sub中的方法给覆盖,而静态方法staticMethod是不能被覆盖的,你的结果对象是base,调用staticMethod时执行的是自己的方法,静态方法相当于谁调用的就是使用谁的

简单点说就是,子类重写了父类的method(),你申明的时候是父类引用指向子类对象,这种情况只要子类重写了父类的方法,那么调出来的一定是子类的方法,
但是那个staticMethod()是静态方法,静态方法存在于方法区中,只有一份,是不会被子类继承走的,子类无法重写父类的静态方法,所以调出来的还是父类的

Base who=new Sub();
这一句是很明显的多态,并且是运行时多态,它满足重写这个条件,并且父类对象指向子类实例。通过父类对象调用被重写的函数时(在这里是method)
编译时只需要寻找父类中是否存在这个函数,但是到了运行时就会执行子类的函数,这就是运行时多态。
而staticmethod这个函数是静态函数,虽然是隐藏了父类的staticmethod,但是静态函数是没有重写这样的说法的,看起来是隐藏,其实并不是。这样的
写法只会调用父类的静态函数。
其实这个静态函数的隐藏是类似于成员变量的隐藏的,如果父类和子类拥有同名的成员变量,那么通过多态的写法,那么调用的变量也只会是父类的成员
变量。
这里给出一个例子
public class Test {

            public static void main(String args[]) {
                Person p=new Man();
                System.out.println(p.name);
            }
        }
        class Person {
            String name="person";
        }
        class Man extends Person{
            String name="man";
        }

结果是person。你可以按照成员变量的概念来理解静态函数的隐藏。