我有一个抽象类和2个子类。如果你不能实例化抽象类,你如何使用它们

时间:2012-03-09 21:45:15

标签: java class inheritance abstract

我有一个抽象类和2个子类。如果你不能实例化抽象类,你如何使用它们。我编写了最初使用类和子类的代码,后来意识到我最好从父类中获得2个子类。我理解这是一种在Java中进行多重继承的方法。我现有的代码是实例化父类,我是 与此合作。现在,我无法实例化父类,因为类现在是抽象的。 它只是我现在可以实例化的子类吗?这些是正常的课程。

一个子类是员工,有出生日期,工资,另一个子类是客户,并有favouritefood,paymentdetails

父类是人

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:3)

您不需要实例化父类。例如,您必须使用它,原因如下:

您可以保留一些通用的有用方法,您可以在子类中使用(并通过父类的变量链接到它)(如果需要,也可以覆盖它),例如:

    abstract class Person{
       protected String name;
       protected String surname;
       public String getFullName(){return name+" "+surname;}
    }
    public class Employee extends Person{ 
       public Employee(String name, String surname){
          this.name=name; this.surname=surname;
       }
    }
    public class Mister extends Person{
       public Employee(String name, String surname){
          this.name=name; this.surname=surname;
       }
       public String getFullName(){return "Mr. "+name+" "+surname;}
    }

然后你可以这样做:

    Person p1=new Employee("Jonh","Doe");
    Person p2=new Mister("Jonh","Doe");
    p1.getFullName(); //John Doe
    p2.getFullName(); //Mr. John Doe

PS:抽象类不用于多重继承,多重继承意味着另一件事(类可以从多个父级继承)

答案 1 :(得分:2)

是的,这正是它的含义。抽象类无法实例化,只有完全实现它们的类才可以。

如果你的逻辑听起来,你甚至不需要。我的意思是,您是否只想创建一个Person,或者它始终是Employee还是Customer

此外,如果一个类被多个其他类扩展,则不称为多重继承。多重继承是指单个类扩展多个其他类。

在Java中,您只能扩展一个类,但您可以实现多个接口。 (但这超出了我猜的范围)

答案 2 :(得分:2)

你可以这样做:

public abstract class Person {
    // details left out
}

public class Employee extends Person {
    // details left out
}

public class Customer extends Person {
    // details left out
}

现在你可以这样做:

Person e = new Employee();
Person c = new Customer();
List<Person> = new ArrayList<Person>();  

您只需将每个Person引用指向一个有效的具体子类。

现在您已了解有关继承的知识,您将需要了解Factory类和虚拟构造函数。这允许您以这样的方式创建不同类型的Person的新实例,以便“if”检查客户端代码。

答案 3 :(得分:1)

很抱歉接下来的回答,但我想回答您对验证的评论: 你可以这样做:

    class Person{
         .....
       boolean validate(){return !name.isEmpty() && !surname.isEmpty();}
    }

    class Employee{
       ....
       boolean validate(){return super.validate() && salary>0;}
    }