public class TestA { interface An {
void sayHi(); String getName();
} class Dog implements An {
public String getName() {
return "Bob";
} public void sayHi() {
System.out.println("I am " + getName() + "." + back());
} private String back() {
return "wang-wang";
}
} class BullDog extends Dog {
public String getName() {
return "Mike";
} private String back() {
return "WOO-WOO";
}
} public void checkout() {
An a = new Dog();
a.sayHi(); An b = new BullDog();
b.sayHi(); Dog dog = (Dog) b;
check(dog); BullDog bulldog = (BullDog) b;
check(bulldog);
} public void check(Dog dog) {
System.out.println("check dog " + dog.getName());
} public void check(BullDog bulldog) {
System.out.println("check dog " + bulldog.getName());
} /**
 * @param args
 */
public static void main(String[] args) {
TestA tA = new TestA();
tA.checkout();
}}第二个结果的原因是什么???

解决方案 »

  1.   

    I am Bob.wang-wang
    I am Mike.wang-wang/*class BullDog extends Dog {
                         *           public String getName() {
                          *                return "Mike";
                           *                   }
                              继承了Dog相当于实现了An接口,加上重写了父类中的getName()方法
                             */
    check dog Mike
    check dog Mike
      

  2.   

    Mike我知道。。就是为什么是wang-wang
    而不是WOO-WOO
      

  3.   

    private String back() {
    return "wang-wang";
    }
    父类中private修饰了,不存在重写问题。
      

  4.   

    public class Test4 { interface An {
    void sayHi(); String getName();
    } class Dog implements An {
    public String getName() {
    return "Bob";
    } public void sayHi() {
    System.out.println("I am " + getName() + "." + back()+" eat "+eat());
    } public String back() {
    return "wang-wang";
    }

    private String eat() {
    return "bone";
    }
    } class BullDog extends Dog {
    public String getName() {
    return "Mike";
    } public String back() {
    return "WOO-WOO";
    }

    private String eat() {
    return "meat";
    }
    } public void checkout() {
    An a = new Dog();
    a.sayHi(); An b = new BullDog();
    b.sayHi(); Dog dog = (Dog) b;
    check(dog); BullDog bulldog = (BullDog) b;
    check(bulldog);
    } public void check(Dog dog) {
    System.out.println("check dog " + dog.getName());
    } public void check(BullDog bulldog) {
    System.out.println("check dog " + bulldog.getName());
    } /**
     * @param args
     */
    public static void main(String[] args) {
    Test4 tA = new Test4();
    tA.checkout();
    }}  看看这个就明白了
      

  5.   

    Override is runtime, B extends A and overrides foo()
    A a = new A();
    A b = new B();
    a.foo(); // foo() in A;
    b.foo(); // foo() in B;
    Overload is compile time
    Object str = "abc";
    System.out.println(str);
    你可以debug一下,看看这个println进入了那个overload方法
      

  6.   

    private不能override
    class A {
      public A() {
        f(); // 同样两个方法,f是private不会被覆盖
        g(); // g是public,就会被覆盖
      }
      private void f() {
        System.out.println("A.f");
      }
      public void g() {
        System.out.println("A.g");
      }
    }
    class B extends A {
      // 这个根本没法写@Override
      private void f() {
        System.out.println("B");
      }
      @Override
      public void g() {
        System.out.println("B.g");
      }
    }
      

  7.   

    class Dog implements An {
    public String getName() {
    return "Bob";
    }public void sayHi() {
    System.out.println("I am " + getName() + "." + back());
    }private String back() {
    return "wang-wang";
    }
    }这里的Dog类是BullDog的父类,父类中你的back()方法是用private修饰的,所以在子类中无法重写,换句话说就是你用BullDog实例调用back方法时,back方法调用的是父类中的此方法,所以不会打印出“woo-woo”你要是在父类中修改为 protected的话就可以了。
      

  8.   

    我来通俗的说一下吧,父类中private String back() 方法,子类无法继承,子类写的这个方法父类更不看不到,虽然有一个一样的方法,但不叫重写。你用父类的应用调用 方法,当然要用父类中定义的private String back() 
      

  9.   

    父类中private String back() 方法,子类无法继承,主要是这个private。