跪求这段JAVA代码错在哪里??谢谢

来源:百度知道 编辑:UC知道 时间:2024/07/01 07:32:56
public class test1 {

/**
* @param args
*/
public static void main(String[] args) {
AccpTeacher t=new AccpDBTeacher();
t.sayHi();
t.giveLesson();
// TODO 自动生成方法存根

}

}

class AccpTeacher{
public void giveLesson(){
System.out.println("知识点讲解");
System.out.println("总结提问");
}
}

class AccpDBTeacher extends AccpTeacher{
public void giveLesson(){
System.out.println("启动 SqlServer");
super.giveLesson();
}
private void sayHi() {
System.out.println("Hi");
// TODO 自动生成方法存根

}
}

这个错在t.sayHi()这一行,AccpTeacher类中没有这个方法。
这个错误应该是对java多态性不太了解所致。
第一,认识对象的结构。对象定义了两个类AccpTeacher、AccpDBTeacher。其中AccpDBTeacher继承于AccpTeacher。 父类AccpTeacher中只有一个方法giveLesson(),而在AccpDBTeacher子类中覆写了方法giveLesson(),并添加了一个新方法sayHi() 。
第二,分析对象的方法。在main()中出现了一个由子类对象为父类实例化的向上转型。
AccpTeacher t=new AccpDBTeacher();
这个时候多态产生了:
如果父类的方法在子类中被覆写那么通过父类调用该方法则调用子类方法中被覆写过的方法;
如果在子类中添加了新的方法那么在向上转型的过程中会丢失该子类中的新方法,既无法通过父类调用。
所以t.sayHi();这里会报错,删掉后程序结果正确输出:
————————————————程序执行结果————————————
启动 SqlServer
知识点讲解
总结提问
——————————————————————————————————

t只是指向子类的一个分配在栈中的一个对象,这个对象的类型是AccpTeacher的,没法看到子类(AccpDBTeacher)中的方法。
解决办法:
把sayHi()写到父类中去,并把作用域变成default的,这个不用解释了吧

五楼讲的比我详细,参考一下吧

在类AccpTeacher中添加一个方法pulic void sayHi(){},并将AccpDBTeacher 中的private改为pulic就可以了

你用子类给父类赋值这是可以的,但是你声明的对象 t 它代表的是父类,父类里有 sayHi() 这个方法么?

貌似这段代码 需要特定环境运行或则是缺失了部分

父类指向子类对象,这种多态方法只能在使用时调用父类中有的方法。子类中新加的方法父类是看不见的。无论是priv