Java - 抽象类和具体类

时间:2016-11-02 06:42:22

标签: java

我正在完成我的作业,但是我对抽象类和具体类感到困惑,而且我从程序中得到错误......

假设有一个抽象类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"。实际上有什么问题,为什么......?有谁能解释一下......?

3 个答案:

答案 0 :(得分:5)

StudentPerson,但不是每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));
}