class test_super_sub{
  public static void main(String[] args) {  B b=new B();
 System.out.println("1."+b.i);
 System.out.println("2."+b.j);  A a=new B();
 System.out.println("3."+a.i);
 System.out.println("4."+a.j);  a.m1();
 a.m2();  System.out.println("5."+a.i);
 System.out.println("6."+a.j);
  }
}
class A{
int i=1;
static int j=3; void m1(){
  System.out.println("A.m1()");
  i=5;
}
static void m2(){
  System.out.println("A.m2()");
  j=7;
}
}
class B extends A{
int i=2;
static int j=4;
void m1(){
  System.out.println("B.m1()");
  i=6;
}
static void m2(){
  System.out.println("B.m2()");
  j=8;
}
}----------
输出的是:
1.2
2.4
3.1
4.3
B.m1()
A.m2()
5.1
6.7
-----------------------------------------------为什么会输出
B.m1()
A.m2()
5.1
呢?a.m1();到底执行的是哪个方法?谢谢各位!

解决方案 »

  1.   

    A a=new B(); 父类句柄指向子类对象
    a.m1()执行子类方法 
    a.m2()执行父类方法 ; //因为子类的m2是类方法,而不是对象方法
      

  2.   

    a.m1()执行的是子类的方法,因为子类的方法覆盖(overwrite)了父类的方法
      

  3.   

    " A a=new B(); 父类句柄指向子类对象
      a.m1()执行子类方法 "那么a.j呢,也是执行子类的属性吗?
      

  4.   

    那么a.i呢,也是执行子类的属性吗?不是a.j,我打错了.
      

  5.   

    sorry, 才仔细看了一遍代码刚才说的那个有问题m2在A和B中都是类方法对于 Father f = new Son() 形式的创建对象,f是父类句柄指向子类对象编译时,f是作为父类对象,而运行时f是子类对象但是对于成员变量及类方法,一定是调用的父类的(编译和执行)
    你可以尝试将父类的m2方法注释掉,这时编译器会告诉你找不到m2方法因此a.j是执行调用父类的成员j
      

  6.   

    子类的方法override(覆盖)了父类的方法
    但是父类的static方法无法被覆盖
      

  7.   

    所以
    a.m1();//执行的子类的m1
    a.m2();//执行的父类的m2
      

  8.   

    A类中的j 和 B类中的j没有任何联系,成员变量(无论static or non-static)不会被override.终于彻底明白了
      

  9.   

    这三行都是警告!
     System.out.println("2."+b.j);
     System.out.println("4."+a.j);
     System.out.println("6."+a.j);
    改为
    System.out.println("2."+B.j);
     System.out.println("4."+A.j);
     System.out.println("6."+A.j);
    就没警告符号了!而且运行结果是一样的!楼主发现没啊??