use*_*099 0 java inheritance object
我的理解是Java中的每个类都是Object超类的子类.因此,为什么我的编译器给出了以下代码的错误:
public class ClassA {
public ClassA(){}
public String exampleMethod(String str){
//manipulate string
return str;
}
}
public class ClassB {
public ClassB(){}
public String exampleMethod(String str){
//manipulate string
return str;
}
}
public class Manager {
public Manager(){
execute(new ClassA());
execute(new ClassB());
}
public void execute(Object o){
o.exampleMethod("test");
}
}
Run Code Online (Sandbox Code Playgroud)
如果ClassA是Object的子代,为什么我不能从'o'变量调用方法?我知道我可以将ClassA和ClassB放在超类下,但我想知道为什么会失败.
因为Object类没有定义exampleMethod方法,所以给你错误.你应该至少做一个向下转换o ClassA或ClassB类来执行你的代码:
public void execute(Object o) {
//this makes the code compiles
((ClassA)o).exampleMethod("test");
}
Run Code Online (Sandbox Code Playgroud)
但是,在执行此向下转换之前,您必须确保o参数是一个ClassA或ClassB实例,否则您可能会遇到ClassCastException异常.你可以通过使用instanceof:
public void execute(Object o) {
//this makes the code compiles
//and assures that you won't have a ClassCastException
if (o instanceof ClassA) {
((A)o).exampleMethod("test");
}
if (o instanceof ClassB) {
((B)o).exampleMethod("test");
}
}
Run Code Online (Sandbox Code Playgroud)
不过,这非常笨拙.由于ClassA和ClassBclasses共享一个具有相同签名(相同名称,相同参数,相同返回类型)的方法,因此您可以使用具有此方法的接口以及make ClassA和ClassB类来实现它.例如:
interface IExample {
String exampleMethod(String str);
}
public class ClassA implements IExample {
//current implementation...
}
public class ClassB implements IExample {
//current implementation...
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以将类中的代码缩短Manager为:
public void execute(Object o) {
if (o instanceof IExample) {
((IExample)o).exampleMethod("test");
}
}
Run Code Online (Sandbox Code Playgroud)
甚至更好:
public void execute(IExample o) {
o.exampleMethod("test");
}
Run Code Online (Sandbox Code Playgroud)
这样你就可以传递一个ClassA或者ClassB该execute方法的实例,它将根据每个类给出的实现来表现exampleMethod.
| 归档时间: |
|
| 查看次数: |
135 次 |
| 最近记录: |