从抽象方法

时间:2017-03-01 11:39:22

标签: java abstract-class abstraction

我对我的代码有疑问。我将类Employee声明为abstract。在它下面是3个抽象方法,抽象String部门,抽象int work_days和抽象void print_info。

现在,我创建了第二个类Tester,它扩展了Employee抽象类。我实现了抽象方法。

abstract class Employee {

abstract String department();
abstract int work_days();
    abstract void print_info();

}



class Tester extends Employee{

String dept;
int work_days;

@Override
String department() {
    dept = "QA Department";
    return dept;
}

@Override
int work_days() {

    work_days = 5;
    return work_days;
}

@Override
void print_info() {
        System.out.println("Department :> " + dept + "Working Days :> " + work_days);
}




}




class Demo {

public static void main(String[] args){

    Employee emp_tester = new Tester();
    emp_tester.print_info();



}

}

现在,当我为Tester创建实例并从Tester类调用print_info时,变量dept和work_days返回null和0。

我是否违反了抽象规则?任何批评者都被广泛接受。感谢

8 个答案:

答案 0 :(得分:2)

您已将其实施正确,并且您看到的值也正确无误。

如果您尚未指定任何值并打印它们,则会获得其默认值。

对于Objects,默认为null,对于基元,默认为null。您需要在使用它们之前设置它们。

class Tester extends Employee{

String dept;
int work_days;

    public Tester(String dept, int work_days){
      this.dept = dept;
      this.work_days = work_days
    }

然后在创建测试人员时,

Employee emp_tester = new Tester("Testing", 24);

答案 1 :(得分:1)

在打印前调用您的部门功能。

public static void main(final String[] args) {

    final Employee emp_tester = new Tester();
    emp_tester.department();
    emp_tester.work_days();
    emp_tester.print_info();

}

答案 2 :(得分:1)

除非您调用department()和work_days(),否则现在不会初始化成员变量。 为什么不添加构造函数来初始化成员?

Tester() {
  dept = "QA Department";
  work_days = 5;
}

答案 3 :(得分:0)

您没有设置deptworkdays的值。

您可能希望在dept = "QA Department";类的构造函数中放置Tester等行,如果这是它们的值。

答案 4 :(得分:0)

你应该调用getter insteat访问属性:

class Tester extends Employee{

String dept;
int work_days;

@Override
String department() {
    dept = "QA Department";
    return dept;
}

@Override
int work_days() {

    work_days = 5;
    return work_days;
}

@Override
void print_info() {
        System.out.println("Department :> " + department() + "Working Days :> " + work_days());
}

提示:不要将方法eqauls调用属性名称。如果返回值,请调用方法get...

class Tester extends Employee{

String dept;
int work_days;

@Override
String getDepartment() {
    dept = "QA Department";
    return dept;
}

@Override
int getWorkdays() {

    work_days = 5;
    return work_days;
}

@Override
void print_info() {
        System.out.println("Department :> " + getDepartment() + "Working Days :> " + getWorkDays());
}

答案 5 :(得分:0)

在Java中,String类型的默认值为null,int类型的默认值为0。 这就是为什么你得到dept = null和workdays = 0。

答案 6 :(得分:0)

我认为你从未初始化变量的值,它将为null。在访问变量之前,必须首先调用department()work_days()来初始化变量。

也许您需要构建一个getter构造。这可以确保您在访问getter时始终设置工作日/部门

看起来像

int getWorkDays(){
    if(work_days == 0){
         //work_days(); use this instead of my example to call the overriden abstract method
        work_days = 5;
    }
    return work_days;
}

你也可以为Dept编写一个getter:

String getDept(){
    if(dept == null || dept.equals("")){
        //department(); use this instead of my example to call the overriden abstract method
        dept= "QA Department";    
    }
    return dept;
}

这个吸气剂现在应该在任何地方使用,如:

@Override
void print_info() {
        System.out.println("Department :> " + getDept() + "Working Days :> " + getWorkDays());
}

您还可以调用方法来初始化构造函数中的值,如:

Tester(){
    work_days();
    department();
}

答案 7 :(得分:0)

一旦你打电话给方法,

String department()
int work_days()

使用相同的对象,只有你的属性才会获得initilize。否则,您需要使用Constructor / SIB / IIB进行初始化。之后,您可以调用print_info()方法来显示值。