在多态中,父类和子类有同名的静态方法,在调用时是这样写的Fu f=new zi();那是会运行父类的静态方法那还是会运行子类的静态方法,为什么???
我们假设Fu f=new zi();"="号作为"左边","="右边作为"右边",在多态中有以下特点:
(1)静态成员函数的特点:无论编译和运行,都参考左边(引用型变量所属的类),就是会运行父类的静态方法。
(2)非静态函数的特点:在编译时期,参阅左边(引用型变量所属的类)是否有调用的方法,如果有,编译通过,如果没有编译失败。
在运行时期,调用的是子类的方法,
简单总结一下:非静态成员函数在多态调用时,编译看左边,运行看右边
(3)对于成员变量的特点:无论编译和运行,都参考左边(引用型所属的类),即运行父类的成员变量。
例如:
class Fu{
int num=3;
}
class Zi extends Fu{
int num=8;
}
class Test{
public static void main(String []args){
Fu f=new Zi();
System.out.println(f.num);
Zi z=new Zi();
System.out.println(z.num);
}
}
运行结果为:3,8
首选,即便是同名的静态方法,但是在内存的方法区中,也是分别根据类名保存的。所以不会冲突,但是如果是非静态的方法,那么调用的就是子类的方法了,同样的方法因为子类对象中重写了父类中的方法,所以父类的引用指向子类的实例对象。就好比你这个父类是人,实例对象是子类的男人。当你调用父类引用的撒尿后,自然调用的就是男人的站着撒尿的方式,你这个对象是男人。。不是女人,和太监。。
在继承中有一点比叫特别:
那就是同名的静态方法是不能覆盖的,这一点你的验证代码就可以看到,
同样,静态的变量也是不能覆盖的,如:
class Fu{
static int num=3;
}
class Zi extends Fu{
static int num=4;
}
通过引用父类的对象建立子类的对象的话,你得到的结果结果num=3;
因为在内存中静态成员在类开始加载时就存在于类中一特殊的内存中,它没有实例对象,它会一直存在而不改变,知道程序运行结束!
|