2016-04-01 17 views
1

Ich möchte Werte in meinem Arraylist der abstrakten Klasse type.Below füllen ist mein Codeinitialisieren Arraylist von Typ Abstrakte Klasse

public abstract class Account { 
    private int accountId; 
    private int customerId; 
    private double balance; 

    public Account(int accountId, int customerId, double balance) { 
     this.accountId = accountId; 
     this.customerId = customerId; 
     this.balance = balance; 
    } 

    public abstract double deposit(double sum); 
    public abstract double withdraw(double sum); 
} 

Vor meiner abstrakten Klasse ist. Jetzt habe ich eine andere Klasse bank, in der ich an arraylist definieren und erklären möchte, in dem ich meine Werte füllen kann. Ich erklärte Arraylist als

ArrayList<Account> al=new ArrayList<>(); 

Jetzt möchte ich für die weitere Verwendung Werte dieser Arraylist zu übergeben, aber ich couldnot, da wir nicht abstrakt class.I diesen Code versucht instanziiert mit Hauptmethode Werte in der Klasse zu füllen, aber couldnot es bekommen wegen des oben genannten Grundes

Account ac= new Account(1,100,25000); 
    ArrayList<Account>ac= new ArrayList<Account>(); 
    ac.add(ac); 
+1

Sicher, Sie brauchen eine konkrete Klasse erstellen erstreckt 'Account' (auch ein anonymes wenn du willst) . Eine abstrakte Klasse hat ohne konkrete Implementierungen keinen Sinn, da ein bestimmtes Verhalten nicht definiert wurde. – Berger

+4

Beachten Sie, dass diese Frage nicht wirklich etwas mit ArrayList zu tun hat - nur die abstrakte Klasse und der Versuch, eine Instanz davon zu erstellen, reichen aus. –

+0

Wie Sie gesagt haben, können Sie nicht instanziieren. So ist die Zeile "Account ac = new Account (1.100,25000);" unmöglich. Sie müssen eine weitere Klasse erstellen, die Ihre abstrakte Klasse erweitert. – JanLeeYu

Antwort

1

können Sie diesen folgenden Code hinzufügen, nur um Ihnen den Einstieg:

public class ConcreteAccount extends Account{ 
    public ConcreteAccount (int accountId, int customerId, double balance) { 
     super(accountId, customerId, balance); 
    } 

    public abstract double deposit(double sum) { 
     //implementation here 
    } 
    public abstract double withdraw(double sum) { 
     //implementation here 
    } 
} 

Dann danach können Sie haben:

Account ac= new ConcreteAccount(1,100,25000); 
ArrayList<Account> acList= new ArrayList<Account>(); 
acList.add(ac); 
+0

Ich folgte Ihrem Code, aber es gab mir Kompilierung Fehler möglicherweise, weil wir Elternklasse Klasse Objekt Klasse nicht zugeordnet werden kann Referenz Klasse aber auf die Verwendung von ConcreteAccount ac = neue ConcreteAccount (1,2,5000) funktioniert es gut –

+0

oh mein schlechtes ... Ich habe sie gewechselt. Es ist bereits behoben. Es sollte schon beim kompilieren funktionieren. @ Er.Naved Ali – JanLeeYu

+0

Ich fand es jetzt richtig..Danke für die Hilfe:) @ JanLeeYu –

0

eine Klasse abstrakt bedeutet Kennzeichnung es nicht implementierten Methoden haben könnte, deshalb sind Sie eine Instanz einer abstrakten Klasse erstellen direkt aufgrund nicht definiertes Verhalten nicht in der Lage. Was Sie tun können, ist eine nicht abstrakte Klasse zu definieren, die Ihre Account Klasse erweitert und die beiden abstrakten Methoden in Account implementiert. So etwas wie class BankAccount extends Account { implementations }. Danach können Sie Instanzen der Klasse BankAccount erstellen und sie in Ihre ArrayList Instanz einfügen. Andere Instanzen der Klasse, die Account erweitert, können auch in Ihrer ArrayList Instanz hinzugefügt werden.

2

Abstrakte Klassen können nicht instanziiert werden, aber sie können erweitert werden. Wenn die Kindklasse konkret ist, kann sie instanziiert werden.

Sie müssten auch beide Ihre abstrakten Methoden implementieren, um die Klasse konkreter zu machen.

Lesen Sie hier mehr: Java inheritance.

2

Der ganze Sinn des abstrakten Klasse ist etwas Code faktorisieren in Ihrer Bewerbung. Es als Super-Typ zu verwenden, ist meiner Meinung nach eine schlechte Übung, da Sie dafür Schnittstellen verwenden sollten.

Um eine vollständige Antwort auf Ihr Problem, ich würde:

eine Schnittstelle erstellen: Account.java

public interface Account { 
    public double deposit(double sum); 
    public double withdraw(double sum); 
} 

eine abstrakte Klasse erstellen: AbstractAccount.java

public abstract class AbstractAccount { 
    protected int accountId; 
    protected int customerId; 
    protected double balance; 
    public Account(int accountId, int customerId, double balance) { 
     this.accountId = accountId; 
     this.customerId = customerId; 
     this.balance = balance; 
    } 
} 

Und Stellen Sie schließlich eine Standardimplementierung für Ihre Schnittstelle BankAccount bereit.

java
public class BankAccount extends AbstractAccount implements Account { 
    public Account(int accountId, int customerId, double balance) { 
     super(accountId, customerId, balance); 
    } 
    public double deposit(double sum) { 
     this.balance += sum; 
    } 
    public double withdraw(double sum) { 
     this.balance -= sum; 
    } 
} 

Dann sollten Sie manipulieren:

List<Account> accounts = new ArrayList<Account>(); 
accounts.add(new BankAccount(1, 1, 10000)); 

und Pflege nie über die Umsetzung der Art :)