2017-03-01 1 views
0

내 코드에 대해 질문이 있습니다. 나는 추상적으로 선언 된 Employee 클래스를 가진다. 그 밑에는 3 가지 추상 메소드, 추상 문자열 부서, 추상 int 작업 일 및 추상 void print_info가 있습니다.추상 메서드에서 변수에 액세스 한 후 null을 반환합니다.

이제 Employee 추상 클래스를 확장하는 2 등급 Tester를 만들었습니다. 나는 추상적 인 방법을 구현했다. 내가 Tester의 인스턴스를 생성하고 테스터 클래스에서 print_info 호출 할 때

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(); 



} 

} 

이제, 변수 부서 및 work_days는 null를 돌려 0으로

나는 추상화의 규칙을 거역 했습니까? 비평가들은 많이 받아 들여진다. 감사합니다

+0

실제 질문은 무엇입니까? 당신은 무슨 일이 일어나는가를 이해하는데 문제가 있는가, 아니면 좋은 스타일/나쁜 스타일에 관한 질문 일 뿐인가? –

+0

안녕하세요 당신은 추상 클래스 메소드를 호출하는 이유는 무엇입니까? 당신은 이미 Employee 클래스와 is-A 관계를 설정했습니다. 동적 다형성을 사용하지 않고 테스터 자체의 객체를 생성하고 메소드를 호출합니다. – Pradeep

+0

@Pradeep 일반적인 방법이 Employee에 들어갈 수 있습니다. 추상화가 필요함 –

답변

0

dept 또는 workdays의 값을 설정하지 않았습니다.

과 같은 줄을 Tester 클래스의 생성자 (해당 값이 될 경우)에 넣을 수 있습니다.

2

올바르게 구현했으며 표시되는 값도 정확합니다.

값을 지정하지 않고 인쇄하면 기본값을 얻게됩니다.

개체의 경우 기본값은 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); 
0

당신은 속성에 액세스의 게터의 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()); 
} 
0

전화, String 유형에 대한 기본값은 null이며, int 형에 대해 당신이 근무일 = 0 부서 =가 null 얻을 이유 즉, 0 입니다.

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(); 

} 
1

department() 및 work_days()를 호출하지 않으면 멤버 변수가 초기화되지 않습니다. 회원을 초기화하기 위해 생성자를 추가하지 않는 이유는 무엇입니까?

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

변수의 값을 초기화 한 적이 없다고 생각하면 null이됩니다. 접근하기 전에 먼저 department()work_days()을 호출하여 변수를 초기화해야합니다.

어쩌면 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; 
} 

이 다음 게터에게

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; 
} 

처럼 보이는

뭔가 당신은 또한 부서에 대한 게터를 작성할 수에 액세스 할 때이 항상 설정됩니다 당신에게 그 일 - 일/부서를 보장 할 수 있습니다 게터는 모든 곳에서 사용되어야한다 지금처럼 :

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

당신은 또한 m가 호출 할 수 있습니다 당신이 메서드를 호출합니다 일단 만 당신의 재산은 initilize 얻을 것이다, 동일한 개체로,

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

String department() 
int work_days() 

을 : ethods이처럼 생성자의 값을 초기화합니다. 그렇지 않으면 Constructor/SIB/IIB를 사용하여 초기화해야합니다. 그런 다음 print_info() 메소드를 호출하여 표시된 값을 가져올 수 있습니다.

관련 문제