今天看到了一道关于Java继承的题目:
问如下代码,输出的结果是Father还是test。
class Father { private String name = "Father"; public void getName(){ System.out.println(name); } } class Test extends Father{ private String name = "test"; public static void main(String[] args){ Test t = new Test(); t.getName(); } }
这题的答案是Father,因为test类没有重写getName方法的话,使用的是父类的方法,打印的是父类的name。
PS:如果getName方法的内容是 System.out.println(this.getClass()); 的话,t.getName得到的是test的class。
因为验证这题的时候最开始使用的kotlin
open class Father{ private val name = "father" // public fun getName():String{ // return name // } } class test:Father(){ private val name = "test" }
上面的代码把注释去掉的话,test中name会报错,因为父类的方法已经使用了父类的name,子类声明重名的变量为了不产生歧义会编译时报错。所以只要改名。
所以这个题目在kotlin中是不成立的,因为编译压根不通过。也防止在写代码的时候产生这个错误。