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();
}}                An b = new BullDog();
b.sayHi(); Dog dog = (Dog) b;
check(dog);
这个强制转换后调用的还是BullDog的方法 那么强制转换到底转换的什么呀??

解决方案 »

  1.   

    具体在你这个代码里面,因为check的形式参数 是Dog,而想要check的是b指向的BullDog一个对象,如果你Dog dog=b;这样编译器不会通过,因为无法直接将父类或者接口转化为子类或接口的某个实现类,你在编辑器删掉(Dog)就能看到错误在你这个例子里面,强制类型转化作用只有一个,就会避免上面的这个编译错误其实你这个实例本身就饶了弯路,你直接check(new BullDog())就可以了,干嘛还费劲做个转换?
    或者BullDog dog=new BullDog()就可以了