谁来给我祥解下这个程序??谢拉
class A
{
int i=1;
char f(){return 'A ';}
static char g(){return 'A ';}
}
class B extends A
{
int i=2;
char f(){return 'B ';}
static char g(){return 'B ';}
}
public class Test
{
public static void main(String[] args)
{
B b=new B();
System.out.println(b.i);
System.out.println(b.f());
System.out.println(b.g());
System.out.println(B.g());
A a=b;
System.out.println(a.i);
System.out.println(a.f());
System.out.println(a.g());
System.out.println(A.g());
}
}
程序运行结果:
2
B
B
B
1
B
A
A
主要说下程序为什么是这个输出顺序,谢谢大虾了!!!
------解决方案--------------------跟顺序没什么关系吧....
System.out.println(b.i);//b声明类型是B,所以调用类B的实例域i
System.out.println(b.f());//动态绑定,b实际类型是B,所以调用类B的f()
System.out.println(b.g());//由于是static,所以是静态绑定,等同于B.g()
System.out.println(B.g());
System.out.println(a.i);//a声明类型是A,所以调用A的实例域i
System.out.println(a.f());//动态绑定,a的实际类型是B,所以调用类B的f()
System.out.println(a.g());//静态绑定,等同于A.g()
System.out.println(A.g());
只用非final,static,private的方法才采用动态绑定
------解决方案--------------------着急上厕所,先留个名
------解决方案--------------------B b=new B();
System.out.println(b.i); ------------2
System.out.println(b.f()); ------------B
System.out.println(b.g()); ------------B
System.out.println(B.g()); ------------B
前面的比较好理解。就不说了.下面部分 是 父类引用和子类对象的关系
A a=b;
System.out.println(a.i); ------------1
System.out.println(a.f()); ------------B 因为f()方法被覆盖了.所以调用子类
System.out.println(a.g()); ------------A 因为g() 是静态的,所以不受影响
System.out.println(A.g()); ------------A 同上
个人理解是这个样子的.> ~
------解决方案--------------------最通俗的理解:
A a = b;
等式左边的引用变量决定访问域的权限
等式右边的对象类型决定最终动态绑定执行的具体方法
但是如果基类的方法是static,final,private词修饰,子类就不能重写基类的方法,就不能实现多态,等式左边的引用变量就只能访问基类的静态方法。
这是我个人理解方法,如有雷同,纯属巧合!
------解决方案--------------------java中的多态是针对java中的方法来说的,
类中的域不受影响,
所以什么类型的引用就会去引用相应类中的域.
------解决方案--------------------静态方法一直不是很懂啊..