做鼎桥笔试一个很有意思的点,记录一下:
1、考察的是方法重载:方法重载是在一个类中定义多个具有相同名称但参数列表不同的方法的行为。编译器使用传递给方法的参数类型以及它们的数量来确定调用哪个方法。
首先说结果:输出的是I am a father。
public class Main {
public static void main(String[] args){
Father o = new Child();
change(o); // 这里o的编译时类型是Father,所以会调用change(Father f)方法
}
private static void change(Father f){
System.out.println("I am a father");
}
private static void change(Child c){
System.out.println("I am a child");
}
}
class Father { }
class Child extends Father { }
2、考察的是多态:多态是指可以将子类的对象引用赋给父类的引用变量,并且可以使用这个父类引用来调用子类中重写的方法。
这个结果是:Hello from Child。
public class Main2 {
public static void main(String[] args) {
Father f = new Child();
f.sayHello(); // 这里调用的是Child类中的sayHello方法,因为f实际指向的是Child类的一个对象
}
}
class Father {
public void sayHello(){
System.out.println("Hello from Father");
}
}
class Child extends Father {
@Override
public void sayHello(){
System.out.println("Hello from Child");
}
}
我的理解是:
Father f = new Child();
f是Father类是无容置疑的,但是当他new了一个Child类时,他可以调用Child类中重写的方法,也就是f处于一个叠加状态,他比单纯的Father类
Father f = new Father();
多了一份改进,能使用Child类的重写方法(相应的他本身的被重写的方法也不能使用了)
如果是单纯的Father类就是可以使用的
相比单纯的Child类
Child f = new Child();
他不能使用Child类中别的未重写的方法
如下所示:
public class Main {
public static void main(String[] args) {
Father f = new Child();
f.sayHello(); // 这里调用的是 Child 类中的 sayHello 方法,因为它重写了 Father 类中的 sayHello 方法
// f.sayChildSpecific(); // 这行会编译错误,因为 sayChildSpecific 方法不存在于 Father 类中
}
}
class Father {
public void sayHello(){
System.out.println("Hello from Father");
}
}
class Child extends Father {
@Override
public void sayHello(){
System.out.println("Hello from Child");
}
public void sayChildSpecific(){
System.out.println("Hello from a method specific to Child");
}
}
尤其注意,
Child f = new Father();
是不被允许的,父类可以涵盖子类,但子类不能涵盖父类。
Father类和Child类还有Father类但new的Child类的关系应该是这样的
Father类和Child类有交集,交集就是重写的部分,Father类但new的Child类就是大部分的父类加上小部分的Child的集合。