635 Stimmen

Können wir eine abstrakte Klasse instanziieren?

In einem meiner Interviews wurde ich gefragt: "Können wir eine abstrakte Klasse instanziieren?"

Meine Antwort war: "Nein, das können wir nicht". Aber der Interviewer sagte mir: "Falsch, wir können."

Ich habe ein wenig darüber gestritten. Dann sagte er mir, ich solle es zu Hause selbst versuchen.

abstract class my {
    public void mymethod() {
        System.out.print("Abstract");
    }
}

class poly {
    public static void main(String a[]) {
        my m = new my() {};
        m.mymethod();
    }
}

Hier erstelle ich eine Instanz meiner Klasse und rufe eine Methode der abstrakten Klasse auf. Kann mir das bitte jemand erklären? Habe ich mich bei meinem Vorstellungsgespräch wirklich geirrt?

18voto

Mixcels Punkte 879

Der technische Teil wurde in den anderen Antworten bereits ausführlich behandelt und endet im Wesentlichen damit:
"Er irrt sich, er weiß nichts, bitte ihn, sich SO anzuschließen und alles zu klären :)"

Ich möchte die Tatsache ansprechen (die in anderen Antworten erwähnt wurde), dass es sich um eine Stress-Frage und ist für viele Interviewer ein wichtiges Instrument, um mehr über Sie zu erfahren und zu sehen, wie Sie auf schwierige und ungewöhnliche Situationen reagieren. Indem er Ihnen falsche Codes gibt, kann er wahrscheinlich Ich wollte sehen, ob du mir widersprichst. Um zu wissen, ob Sie das Selbstvertrauen haben, sich in solchen Situationen gegen Ihre Vorgesetzten durchzusetzen.

P.S.: Ich weiß nicht, warum, aber ich habe das Gefühl, dass der Interviewer diesen Beitrag gelesen hat.

14voto

Abhishek_Mishra Punkte 4497

Abstrakte Klassen können nicht instanziiert werden, aber sie können unterklassifiziert werden. Siehe diesen Link

Das beste Beispiel ist

Obwohl Die Klasse Calender hat eine abstrakte Methode getInstance() aber wenn Sie sagen Calendar calc=Calendar.getInstance();

calc bezieht sich auf die Klasseninstanz der Klasse GregorianCalendar als "GregorianCalendar extends Calendar "

In der Tat anonymer innerer Typ ermöglicht es Ihnen, eine No-Name-Unterklasse der abstrakten Klasse und eine Instanz hiervon.

13voto

Glen Best Punkte 22041

Technische Antwort

Abstrakte Klassen können nicht instanziiert werden - das liegt an der Definition und dem Design.

Aus der JLS, Kapitel 8. Klassen:

Eine benannte Klasse kann als abstrakt deklariert werden (§8.1.1.1) und muss deklariert werden abstrakt deklariert werden, wenn sie unvollständig implementiert ist; eine solche Klasse kann nicht instanziiert werden, kann aber durch Unterklassen erweitert werden.

Aus dem JSE 6 Javadokument für Classes.newInstance():

InstantiationException - wenn diese Klasse eine Abstraktion darstellt Klasse, einen primitiven Typ oder void darstellt; oder wenn die Klasse keinen Null-Konstruktor hat; oder wenn die Instanziierung aus einem anderen Grund fehlschlägt.

Sie können natürlich eine konkrete Unterklasse einer abstrakten Klasse (einschließlich einer anonymen Unterklasse) instanziieren und auch einen Typecast einer Objektreferenz auf einen abstrakten Typ durchführen.

Ein anderer Blickwinkel - Teamplay und soziale Intelligenz:

Diese Art von technischen Missverständnissen kommt in der Praxis häufig vor, wenn wir es mit komplexen Technologien und juristischen Spezifikationen zu tun haben.

"Menschliche Fähigkeiten" können hier wichtiger sein als "technische Fähigkeiten". Wenn Sie wettbewerbsorientiert und aggressiv versuchen, Ihre Seite des Arguments zu beweisen, könnten Sie theoretisch Recht haben, aber Sie könnten auch mehr Schaden anrichten, wenn Sie einen Streit haben / Ihr "Gesicht" beschädigen / sich einen Feind schaffen, als es wert ist. Seien Sie versöhnlich und verständnisvoll bei der Beilegung Ihrer Differenzen. Wer weiß - vielleicht haben Sie "beide Recht", gehen aber von leicht unterschiedlichen Bedeutungen der Begriffe aus?

Wer weiß - auch wenn es unwahrscheinlich ist, ist es möglich, dass der Gesprächspartner absichtlich einen kleinen Konflikt/ein Missverständnis herbeigeführt hat, um Sie in eine schwierige Situation zu bringen und zu sehen, wie Sie sich emotional und sozial verhalten. Seien Sie freundlich und konstruktiv im Umgang mit Kollegen, befolgen Sie die Ratschläge der Vorgesetzten und klären Sie nach dem Vorstellungsgespräch alle Probleme/Missverständnisse - per E-Mail oder Telefonanruf. Das zeigt, dass Sie motiviert und detailorientiert sind.

7voto

iTech Punkte 17714

Es ist eine wohlbekannte Tatsache, dass abstract class peut no instanziiert werden, wie jeder antwortete.

Wenn das Programm eine anonyme Klasse definiert, erstellt der Compiler tatsächlich eine neue Klasse mit einem anderen Namen (mit dem Muster EnclosedClassName$n donde n ist die anonyme Klassennummer)

Wenn Sie also diese Java-Klasse dekompilieren, finden Sie den Code wie folgt:

meine.klasse

abstract class my { 
    public void mymethod() 
    { 
        System.out.print("Abstract"); 
    }
} 

poly$1.class (die generierte Klasse der "anonymen Klasse")

class poly$1 extends my 
{
} 

ploly.cass

public class poly extends my
{
    public static void main(String[] a)
    {
        my m = new poly.1(); // instance of poly.1 class NOT the abstract my class

        m.mymethod();
    }
}

5voto

Priyankara Punkte 748

Über abstrakte Klassen

  • Objekt einer abstrakten Klasse kann nicht erstellt werden
  • Kann Variablen erstellen (können sich wie Datentypen verhalten)
  • Wenn ein Kind nicht mindestens eine abstrakte Methode des Elternteils außer Kraft setzen kann, wird das Kind ebenfalls abstrakt
  • Abstrakte Klassen sind ohne untergeordnete Klassen nutzlos

Der Zweck einer abstrakten Klasse ist es, sich wie eine Basis zu verhalten. In der Vererbungshierarchie stehen die abstrakten Klassen an der Spitze.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X