求问 为什么倒数两句代码
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。你可以按照成员变量的概念来理解静态函数的隐藏。