我对我的代码有疑问。我将类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。
我是否违反了抽象规则?任何批评者都被广泛接受。感谢
答案 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)
您没有设置dept
或workdays
的值。
您可能希望在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()
方法来显示值。