观看别人代码的时候发现父类中的一个方法定义的传入值是子类类型,基础不太牢固,不太明白为什么这样用可以成功
父类car
package test;
public abstract class car {
public car() {}
public void run(boolean value) {
if (value == true)
System.out.println("this car is running!");
}
public abstract void TestWorking(Working carname);
}
子类Working
package test;
public class Working extends car{
private Object value;
public void run(boolean value) {}
public Working() {
}
public Working(Working value) {
this();
}
public void TestWorking(Working carname) {
System.out.println(carname.getValue().toString());
}
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
}
执行的代码testrunning
package test;
public class testrunning {
public static void main(String[] args) {
Working work = new Working();
work.setValue("nissa");
work.TestWorking(work);
}
}
但是我对父类car中的这段代码实在不太理解
public abstract void TestWorking(Working carname);
以及一开始的问题是觉得父类中调用子类类型为什么不报错,后来测试了一下觉得是因为加载的时候都先加载各自的构造函数,所以在TestWorking方法被加载之前子类构造函数已经存在才不会报错?不知道这样理解是否正确
然后认为testworking是否是向上转型,但是仔细看了一下向上转型的demo感觉不是
感觉有一丢丢的混乱,在编译阶段,一个类中能够定义什么样的类型和子父类关系不大,主要取决于它是否有权限访问到对应的类型(也就是由权限修饰符控制)。
你是想问为什么car中可以使用Working类型吗?
这个和子父类是没有关系的,因为是在编译阶段,你只要保证你所引用的类是存在的,能够访问的就可以,并且只是一个简单的参数列表类型声明。
编译通过之后已经产生了各种class文件,在执行时也是这些在起作用,只要类存在就可以加载到的,感觉你想的貌似过于复杂了。。。
有帮助请采纳,还有不懂的可以继续追问~