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();
}}第二个结果的原因是什么???
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();
}}第二个结果的原因是什么???
解决方案 »
- prototype时的spring依赖注入
- IBatis 多表联合查询的问题,请各位指导下
- servlet实现断点续传
- struts2工程,启动时报debug Starting filter 'struts2',求助
- 输入输出问题
- spring配置文件详解
- 求助 JSP代码求助
- 就问dom里怎么把空的elemnt写成 <???/>而不用<???></???>
- String类型最多能接收多大字符串呀?我把5M的附件转换成base64格式的,出现java.lang.OutOfMemoryError
- 建立新EJB JAR时,提示:You must add class files for this enterprise bean
- 急。急。用hibernate查数据库的语句中带有冒号(:)。
- struts1.x只传ID的话,需要actionForm吗?
I am Mike.wang-wang/*class BullDog extends Dog {
* public String getName() {
* return "Mike";
* }
继承了Dog相当于实现了An接口,加上重写了父类中的getName()方法
*/
check dog Mike
check dog Mike
而不是WOO-WOO
return "wang-wang";
}
父类中private修饰了,不存在重写问题。
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();
}} 看看这个就明白了
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方法
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");
}
}
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的话就可以了。