简介
第一次看到这个面试题的时候,就感觉此题不简单。考察对概念的领悟程度!!
- 多态:一个对象在不同场景表现的不同状态叫做多态
- 方法重载:方法名称相同,参数个数,参数类型,参数类型的顺序。其中返回值和访问权限不能够作为方法重载的要素。
public class TestMianShi {
public static void main(String[] args) {
//第一波测试
A a1=new A();
test(a1);
//第二波测试
A a2=new B();
test(a2);
//第三波测试
B b1=new B();
test(b1);
}
public static void test(A a){
System.out.println("aaaaaaaaa");
}
public static void test(B b){
System.out.println("bbbbbbbbb");
}
}
class A{
}
class B extends A{
}
/*
输出结果:
aaaaaaaaa
aaaaaaaaa
bbbbbbbbb
*/
解答:
方法的重载始终是靠对象外在的表现类型来进行重载的,和里面到底是什么东西没有关系!!
继续下一个测试:
package cn.domarvel.entitytest;
public class TestMianShi {
public static void main(String[] args) {
C c1=new C();
test(c1);
}
public static void test(Object o){
System.out.println("ooooooooo");
}
public static void test(A a){
System.out.println("aaaaaaaaa");
}
public static void test(B b){
System.out.println("bbbbbbbbb");
}
public static void test(C c){
System.out.println("ccccccccc");
}
}
class A{
}
class B extends A{
}
class C extends B{
}
我们都知道这里将会输出"ccccccccc"
,那么下面呢??
package cn.domarvel.entitytest;
public class TestMianShi {
public static void main(String[] args) {
C c1=new C();
test(c1);
}
public static void test(Object o){
System.out.println("ooooooooo");
}
public static void test(A a){
System.out.println("aaaaaaaaa");
}
public static void test(B b){
System.out.println("bbbbbbbbb");
}
}
class A{
}
class B extends A{
}
class C extends B{
}
好好想想,其实也不难,这里将会输出bbbbbbbbb
。
再来:
package cn.domarvel.entitytest;
public class TestMianShi {
public static void main(String[] args) {
C c1=new C();
test(c1);
}
public static void test(Object o){
System.out.println("ooooooooo");
}
public static void test(A a){
System.out.println("aaaaaaaaa");
}
}
class A{
}
class B extends A{
}
class C extends B{
}
最终输出aaaaaaaaa
。为什么会这样输出呢??其实是当我们调用方法的时候,如果各个重载方法中找不到我们要的类型它将找父类型参数的方法,父类型方法没有就找父父类型参数的方法。以此类推,这就是类的体系树,重载将会通过类的体系树调用各参数方法。
应用:
注意这个service方法的调用,如果request和response在中途不转换的话,将会出现死循环状态。