2017-12-18 3 views
0

Ich bin neu in Java und lernen grundlegende Konzepte. Ich lernte Abstraktion und die grundlegendsten Definitionen, die ich fand, waren: Verwendet, um die Komplexität zu verstecken (verstecken, wie ein Prozess getan wird und zeigen, was können wir tun?)Abstraktion in Java

Fair genug. Ich habe eine grundlegende Vorstellung davon, was Abstraktion ist. Aber ich bin nicht klar, in paar Dinge hier:

Lässt das unten stehende Beispiel sehen:

/* 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(); 
    } 
} 

Meine Frage hier ist, wir kann nicht einmal eine abstrakte Klasse inszenieren. Also müssen wir es erweitern und die gleiche Methode übergehen? Wenn wir die abstrakten Methoden in der Kindklasse überschreiben, ist die Superklasse (abstrakte Klassenmethode) nutzlos. Auch wenn wir nicht einmal erklären können, warum können wir nicht einfach alles in eine Klasse schreiben, anstatt die abtsrcat-Klasse zu erweitern?

Während die abstrakte Klasse zu erweitern und das Gleiche zu übersteuern, ist es nicht negativ, da der Raum mehr für diese abstrakten Klassen verschwenden wird?

Ich weiß, ich habe keine Klarheit und das ist der Grund, warum ich verwirrt bin. Wenn jemand dies erklären kann (keine strategischen Definitionen, die für Noobs wie mich nicht nützlich sind) mit Erklärung, würde ich die Zeit dafür sehr schätzen.

+3

Ein Gehalt _is not_ einem Mitarbeiter anrufen. Ihre Klassenhierarchie macht keinen Sinn – SLaks

+2

Mögliche Duplikate von [Wie und wann eine abstrakte Klasse zu verwenden] (https://stackoverflow.com/questions/6007089/how-and-when-to-use-an-abstract-class) –

+0

https: // Stapelüberlauf.com/questions/29498036/what-is-the-purpose-of-abstract-classes-in-java –

Antwort

1

Abgesehen von schlechtem Beispiel Sie, Ihr Verständnis der abstrakten Klasse verwenden, ist nicht richtig:

So haben wir es zu erweitern und die gleiche Methode overide? Wenn wir die abstrakte methos in der untergeordneten Klasse überschreiben, ist die Superklasse (abstrakte Klasse-Methode) zwecklos

Erstens: Abstrakte Klasse und Schnittstelle beide bleiben abstrakte Methoden bieten außer Kraft gesetzt werden, durch die Erweiterung oder die Umsetzung Klassen.

Zweite: Abstrakte Klasse kann allgemeine Methodenimplementierung für alle erweiterten Klassen haben - dann müssen Sie sie nicht immer wieder implementieren oder überschreiben. Benutze sie einfach. (Hinweis: von Java beginnend 8 Schnittstelle kann auch Standard Implementierung für Methoden)

Drittens:, wenn Sie eine andere als gemeinsame Implementierung benötigen - Überschreibung erforderlich Methode von Superklasse.

Forth: wenn in Ihrer weiteren Implementierung Sie Super-Methode ausgeführt werden müssen - tun Sie es jederzeit bei der Umsetzung von super.methodName(...)