我是个刚接触JAVA的新手,下面这段代码的打印结果是10,为什么不是20呢?
class A
{
int x=10;
}
class B extends A
{
int x=20;
}
class Test
{
public static void main(String []args)
{
B b=new B();
A a=b;
System.out.println(a.x);
}
}
class A
{
int x=10;
}
class B extends A
{
int x=20;
}
class Test
{
public static void main(String []args)
{
B b=new B();
A a=b;
System.out.println(a.x);
}
}
有一个疑惑:如果我在System.out.println(a.x)前.然后看对象a,发现其下面有两个变量.一个x(a) = 10; 一个x(b) = 20;
谁能给解释解释..
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();
}
}
在构造B的时候,也构造了一个A。内存中有两个x,分别是B类里的20和A类里的10.在调用的时候,如果采用方法调用,如
public int getX(){
return x;
}
则调用子类的方法,这个时候a.getX()返回的是20.如果直接调用类成员变量,则调用当前对象的申明类型的成员变量。如例子里面的a.x和((A)b).x都会返回10.我们发现访问成员变量和访问方法的起始点不同,容易造成混淆,所以最好不要直接访问类的成员变量,要用方法来访问。
而是B自己的属性,所以a在B中找不到x,只有使用A中的x。
就像你重写方法的时候,又在把方法名其中一个小写字母写成大写了,
并没有重写到,在子类中找不到,自然就去父类找。
并不是全局变量```
A a = b;
并不能把b.x赋值给a.x
所以结果还是10;
b在这里进行了转换。
父引用(此时必须是子对象)调 重写的member方法时,是调子类的member方法,
父引用(此时必须是子对象)调 重写的static方法时,是调父类的static方法,
父引用(此时必须是子对象)调 属性(不管是member属性还是static属性),是调父类的属性。父引用(装父对象)调方法和属性时就只能调父类的,不能调子类的。this. member方法时 也是找子类的重写方法,
this. static方法时 调的是书写这个 "this." 类区的static方法,
this. 属性(不管是member还是static)都是调的是书写这个 "this." 类区的static方法,static不能实现多态比较容易理解,属性不能实现多态,我也不知道为什么,我想对于初学者,能够熟练运用就暂时够了,LZ要能查到告诉我下,我也很想知道。