public class Test{
public static void main(String[] arg){
B b = new B();
System.out.println(b.i);
System.out.println(b.j);

A a = new B();
System.out.println(a.i);
System.out.println(a.j);

a.m();
a.m1();
System.out.println(a.i);
System.out.println(a.j);
}
}class A{
int i = 1;
static int j = 3;
void m(){
i = 5;
}
static void m1(){
j = 7;
}
}class B extends A{
int i = 2;
static int j = 4;
void m(){
i = 6;
}
static void m1(){
j = 8;
}
}问。为什么输出结果是那样的

解决方案 »

  1.   

    火龙果那大牛人 曾经讲过当然不会出错了,因为都是静态方法。所以子类方法的   m1()   就不是方法的重写,其貌似重写的作用根本没有产生,根据对象的声明,第二句只会输出的是   B.m1()   方法。因为这两个方法由于是静态方法,所以在内存中的地址空间是固定,根本不存在冲突的问题。也就是说这两个方法在内存中占用了不同的空间,而具体执行哪一个,那就要看是由哪个类来调用的了。具体参考下面
    http://topic.csdn.net/u/20070828/10/7aa61fbc-8575-4212-85c4-582c08f81535.html
      

  2.   

    大多数的为什么都可以用DEBUG来解决。
      

  3.   

    A a = new B();
    此处使用指向A的引用,编译器只允许使用A类中的方法,而不是B中的方法,如果要使用B的方法,必须进行强制转换
      

  4.   


    public class Test {
    public static void main(String[] arg) {
    B b = new B();
    System.out.println(b.i);
    System.out.println(b.j); A a = new B();
    System.out.println(a.i);
    System.out.println(a.j); a.m();
    a.m1();
    System.out.println(a.i);
    System.out.println(a.j);
    }
    }class A {
    int i = 1; static int j = 3; void m() {
    i = 5;
    } static void m1() {
    j = 7;
    }
    }class B extends A {
    int i = 2; static int j = 4; void m() {
    i = 6;
    } static void m1() {
    j = 8;
    }
    }类的静态成员和静态方法是不能被继承的
      

  5.   

    貌似说的有点问题吧,静态成员和静态方法是能被继承的,只是不能被覆盖(重写)。public class TestStatic {
        public static void main(String[] arg) {
            B b = new B();
            b.m1();
            System.out.println(b.j);
         }
    }class A {
        int i = 1;
        static int j = 3;
        void m() {
            i = 5;
            System.out.println("A的普通方法");
        }
        static void m1() {
            j = 7;
            System.out.println("A的静态方法");
        }
    }
    class B extends A {
        int i = 2;
           void m() {
            i = 6;
            System.out.println("B的普通方法");
        }
    }
    最后输出的是:
    A的静态方法
    7
      

  6.   


    B b = new B();
    System.out.println(b.i);//2
    System.out.println(b.j);//4调用的是子类的属性
    A a = new B();
    System.out.println(a.i);//1
    System.out.println(a.j);//3方法被覆盖,但是属性不被覆盖。
    a.m(); 
    a.m1(); 
    System.out.println(a.i); //1
    System.out.println(a.j); //7分别调用B类的m()方法(被B类覆盖)和A类的m1()方法(静态方法只属于该类),
    所以调用m()方法的时候只改变b对象的属性,与a对象的属性无关,故a.i=1;
    调用m1()方法时改变类a.j,所以a.j=7
      

  7.   

    如果类的方法是private ,static,final或者是构造器,方法的调用方式是静态绑定的
    换句话说也就是和对象的声明时类型有关,A a = new B();
    System.out.println(a.i);//1
    System.out.println(a.j);//3这里a的声明时的类型是A,那么a.m();实际上调用的就是A类的方法而m()方法默认是default
    这时调用方式是动态绑定的,和对象的实际类型有关,调用的方法是与实际类型最接近的方法
    a的实际类型是B,那么a.m1()调用的就是B类的方法