2017-12-18 5 views
0

나는 자바를 처음 접하고 기본적인 개념을 배우고있다. 나는 추상화를 배우고 있었고 가장 기본적인 정의는 다음과 같다 : 복잡성을 숨기기 위해 사용 (프로세스가 어떻게 수행되는지 숨기고, 우리는 무엇을 할 수 있는지 보여 줌)?Java 추상화

충분히 정교합니다. 나는 추상화가 무엇인지에 대한 기본적인 생각을 가지고있다. 하지만 난 여기에 몇 가지에 명확하지 않다 :

/* File name : Employee.java */ 
public abstract class Employee { 
    private String name; 
    private String address; 
    private int number; 

    public Employee(String name, String address, int number) { 
     System.out.println("Constructing an Employee"); 
     this.name = name; 
     this.address = address; 
     this.number = number; 
    } 

    public double computePay() { 
    System.out.println("Inside Employee computePay"); 
    return 0.0; 
    } 

    public void mailCheck() { 
     System.out.println("Mailing a check to " + this.name + " " + this.address); 
    } 

    public String toString() { 
     return name + " " + address + " " + number; 
    } 

    public String getName() { 
     return name; 
    } 

    public String getAddress() { 
     return address; 
    } 

    public void setAddress(String newAddress) { 
     address = newAddress; 
    } 

    public int getNumber() { 
     return number; 
    } 
} 

Salary.java

/* File name : Salary.java */ 
public class Salary extends Employee { 
    private double salary; // Annual salary 

    public Salary(String name, String address, int number, double salary) { 
     super(name, address, number); 
     setSalary(salary); 
    } 

    public void mailCheck() { 
     System.out.println("Within mailCheck of Salary class "); 
     System.out.println("Mailing check to " + getName() + " with salary " + salary); 
    } 

    public double getSalary() { 
     return salary; 
    } 

    public void setSalary(double newSalary) { 
     if(newSalary >= 0.0) { 
     salary = newSalary; 
     } 
    } 

    public double computePay() { 
     System.out.println("Computing salary pay for " + getName()); 
     return salary/52; 
    } 

} 

Main.java

/* File name : AbstractDemo.java */ 
public class AbstractDemo { 

    public static void main(String [] args) { 
     Salary s = new Salary("Mohd Mohtashim", "Ambehta, UP", 3, 3600.00); 
     Employee e = new Salary("John Adams", "Boston, MA", 2, 2400.00); 
     System.out.println("Call mailCheck using Salary reference --"); 
     s.mailCheck(); 
     System.out.println("\n Call mailCheck using Employee reference--"); 
     e.mailCheck(); 
    } 
} 
:

은 아래의 예를 볼 수 있습니다

내 질문은 여기에, 우리는 심지어 추상적 인 수업을 이해하지 못할 수도 있습니다. 그래서 우리는 그것을 확장해야하고 같은 방법을 넘어야합니까? 자식 클래스의 추상 메소드를 오버라이드 (override)하는 경우, 슈퍼 클래스 (abstract 클래스 메소드)는 사용하지 않습니다. 또한 intentiate도 우리는 왜 abtsrcat 클래스를 확장하는 대신 하나의 클래스에 모든 것을 쓸 수 있습니까?

추상 클래스를 확장하고 동일한 것을 오버라이드하는 것은 이러한 낭비 추상 클래스의 공간이 더 많으므로 부정적인 것은 아닙니다.

나는 혼란스러워하는 이유가 명확하지 않다는 것을 알고있다. 누군가가 이것을 설명 할 수 있다면 (나와 같은 멍청한 놈에게는 도움이되지 않는 딱지 결정이 없다) 설명이 있으면 정말 감사 할 것입니다. 잘못된 사용 예, 추상 클래스의 이해의 제외

+3

직원 not_ 급여 _is를 호출하여 구현 언제든지 않습니다. 클래스 계층 구조가 의미가 없습니다 – SLaks

+2

[추상 클래스를 사용하는 방법 및시기] 가능한 중복 (https://stackoverflow.com/questions/6007089/how-and-when-to-use-an-abstract-class) –

+0

https : // stackoverflow.com/questions/29498036/what-of-the-purpose-of-abstract-classes-in-java –

답변

1

바로되지 않습니다 :

그래서 우리는 그것을 확장과 같은 방법을 오버라이드 (override)하는해야? 모두 확장하거나 구현 오버라이드 (override) 할 수있는 추상적 인 방법을 제공 할 수있을 추상 클래스와 인터페이스 : 우리는 자식 클래스에서 추상 Methos의를 오버라이드 (override) 할 때, 슈퍼 클래스 (추상 클래스 메소드는) 아무 소용

우선이다 수업.

두 번째 : 추상 클래스는 모든 확장 클래스에 대해 공통 메소드 구현을 가질 수 있습니다. 그런 다음 반복 구현하거나 재정의 할 필요가 없습니다. 그냥 사용하십시오. 셋째

: (참고 자바 8 일부터 시작 인터페이스는 방법에 대한 기본 구현을 가질 수) : 당신이 일반적인 구현 아닌 다른 필요한 경우 - 슈퍼 클래스에서 재정의 필요한 방법을.

넷째 : 당신이 슈퍼 방법을 실행해야 당신의 또 다른 구현 경우 - super.methodName(...)