为什么方法能实现多态,变量就不行呢?调用方法a.fn()打印的20,是调用的B类中的方法,但是a.x却是10,是A类中的变量,不明白.
class A
{
int x=10;
void fn()
{
System.out.println(x);
}
}
class B extends A
{
int x=20;
void fn()
{
System.out.println(x);
}
}
class Test
{
public static void main(String []args)
{
B b=new B();
A a=b;
System.out.println(a.x);
a.fn();
}
}
class A
{
int x=10;
void fn()
{
System.out.println(x);
}
}
class B extends A
{
int x=20;
void fn()
{
System.out.println(x);
}
}
class Test
{
public static void main(String []args)
{
B b=new B();
A a=b;
System.out.println(a.x);
a.fn();
}
}
A a=b; 被又声明回了A类..
自然结果就是10和20..
个人意见...
方法可以重写,变量只能覆盖!!所以,如果有一个由父类声明、由子类new出的对象的引用/在调用父类与子类同名的变量和方法时/则调用子类的方法,调用其自身的变量!!!
override 有人翻译成重写 ,有人翻译成覆盖,这是对方法而言,static,private,final方法出外
对于变量,没有override一说,它们的行为成为hiden
类父类的方法体。在使用父类对象.方法()时,执行的就是子类重写过后的方法的方法体。
而属性只在这子类中发生了作用域的隐藏。但是在new 子类()的时候,还是对父类中的属性做了初始化。从而用父类的对象就
只能是访问到父类中的属性值。
在子类对象中也可以访问父类的属性【注意权限】值。但是要通过类名限定。
方法可以重写,变量只能覆盖!! 所以,如果有一个由父类声明、由子类new出的对象的引用/在调用父类与子类同名的变量和方法时/则调用子类的方法,调用其自身的变量!!!