我正在完成我的作业,但是我对抽象类和具体类感到困惑,而且我从程序中得到错误......
假设有一个抽象类Person和一个具体的子类Student:
abstract class Person{
private String name;
public Person(String s){
name = s;
}
public String getName() {
return name;
}
public abstract void doAction(Person other);
}
class Student extends Person{
public Student(String name){
super(name);
}
public void doAction(Person other){
System.out.println("This person's name is " + getName());
}
}
然后我实现了一个main函数来测试它,但是我收到了一个错误......:
public class TestMain {
public static void main(String[] args) {
Person person;
Student student;
person = new Student("Sam");
student = person;
student.doAction(person);
}
}
据说student = person
收到错误"Error: Incompatible types: Person cannot be converted to Student"
。实际上有什么问题,为什么......?有谁能解释一下......?
答案 0 :(得分:5)
Student
是Person
,但不是每Person
都是Student
。
如果您有Person
类型的变量,则无法将其值分配给Student
类型的变量,因为通常情况下这可能不安全。
如果您确定它绝对是Student
(例如您使用instanceof
支票,或者您已经对代码进行了推理,那么"知道") ,你可以施放变量;但面向对象编程的核心思想之一就是你不应该关心特定的子类。
这有两种方式:
首先将new Student()
分配给Student
变量,然后将该值分配给Person
变量:
student = new Student("Sam");
person = student;
student.doAction(person);
这很好,因为每个Student
都是Person
,因此可以为Person
变量分配Student
变量的值。
完全放弃student
变量,因为您只需要引用Person
来引用doAction
,而不是Student
:
person = new Student("Sam");
person.doAction(person);
答案 1 :(得分:2)
在运行时期间,person
变量可以引用Person
的实例,这些实例不是Student
的实例。因此,不允许分配student = person;
。
您必须检查person
的运行时类型并执行强制转换才能使分配正常工作(嗯,类型检查不是强制性的,但建议使用,以避免潜在的{{1 }}):
ClassCastException
答案 2 :(得分:0)
package taskassignment;
public abstract class Person
{
public String name;
public Person(String n)
{
name = n;
}
public String getName()
{
return name;
}
public abstract String doAction(Person other);
}
public class Student extends Person
{
public Student(String n)
{
super(n);
}
@Override
public String doAction(Person other)
{
return "The Person Name is : "+ getName();
}
}
public static void main(String args[])
{
Person person = new Student("Sam");
Student student = (Student) person;
System.out.println(student.doAction(person));
}