首页 > 试题广场 >

指出以下程序的输出或者错误 class Person{

[问答题]
指出以下程序的输出或者错误
class Person{
 Person(){
   System.out.println("create person");  
 }
 public static String getName(){
   return"Person";
 }
}
class Teacher extends Person{
 Teacher(){
   System.out.println("create teacher");  
   super();
 }
 public static String getName(){
   return"Teacher";
 }
}
public class Test{
 public static void main(String[] args){
   Person person = new Person();
   Person teacher = new Teacher();
   System.out.println(person.getName());
   System.out.println(teacher.getName());
 }
}


首先需要理解为什么要定义成 Person teacher = new Teacher();
这是一种多态性的向上转型,为了更好的封装子类中的方法,Person 类型的引用是可以指向Teacher类型的对象的。那么这样做有什么意义呢?因为子类是对父类的一个改进和扩充,所以一般子类在功能上较父类更强大,属性较父类更独特,父类中的一个方法只有在在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类中的这个方法,这就是动态连接,但是如果父类的方法是static类型(类方法),那么子类无法重写父类方法 。(注意:如果子类也想尝试重写该方法,并且不是static类型,那么将会报错)

如果子类中的方法没有由static修饰,那么子类可以重写父类方法(注意:如果子类该方法是类方法,那么将会报错)

对于多态,可以总结它为:

一、使用父类类型的引用指向子类的对象;
二、该引用只能调用父类中定义的方法和变量;
三、如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用)
四、变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了父类中的变量,那么在编译时会报错。
成员变量,静态方法--看左边;非静态方法:编译--看左边,运行--看右边。 



发表于 2019-09-23 00:11:28 回复(0)
程序出错,super()语句调用了父类的无参数的构造方法,它必须放在子类的构造方法的有效代码的第一句。调整后程序输出结果为:
create person 
create person 
create teacher 
Person 
Person
Person person = new Person()生成一个父类的Person类对象实例,所以调用父类的构造方法,输出create person。然后Person teacher = new Teacher()生成一个子类的Teacher为对象实例,因为它的构造方法第一句是调用父类的构造方法,所以会先输出create person,然后执行构造方法中下面的语句输出create teacher。因为teacher这个实例的引用是赋给Person类的,所以最后它的getName返回的是Person。(为会么teacher这个实例的引用是赋给Person类的,最后它的getName返回的是Person?
编辑于 2017-07-31 15:34:17 回复(5)
super要在构造函数第一行使用
发表于 2017-08-06 12:26:47 回复(0)
super 放在构造方法第一行后的输出结果是 create person create person create teacher person teacher
发表于 2017-08-03 07:31:35 回复(0)
super()应该放在第一行
发表于 2017-08-01 09:18:22 回复(0)