CodeGym /Java-Blog /Random-DE /Erkundung der Fragen und Antworten aus einem Vorstellungs...
John Squirrels
Level 41
San Francisco

Erkundung der Fragen und Antworten aus einem Vorstellungsgespräch für eine Stelle als Java-Entwickler. Teil 5

Veröffentlicht in der Gruppe Random-DE
Hallo Hallo! Java-Entwickler sind heute sehr gefragt. Natürlich kann ich Ihnen keine offene Stelle anbieten, aber ich werde versuchen, Ihnen dabei zu helfen, neues Wissen zu erlangen und Lücken zu schließen. Lassen Sie uns also unsere Überprüfung der Interviewfragen für Java-Entwickler fortsetzen. Links zu den vorherigen Teilen der Rezension finden Sie am Ende des Artikels. Erkundung der Fragen und Antworten aus einem Vorstellungsgespräch für eine Stelle als Java-Entwickler.  Teil 5 - 1

39. Was sind die Zugriffsmodifikatoren in Java? Benenne sie. Wofür werden sie benutzt?

Ich habe Zugriffsmodifikatoren zuvor in einer Frage zu den Elementen von Java behandelt, die zum Erreichen der Kapselung verwendet werden. Aber ich werde Sie trotzdem daran erinnern. Zugriffsmodifikatoren in Java sind Schlüsselwörter, die die Zugriffsebene beschreiben, die einer bestimmten Java-Komponente gewährt wird. Es gibt die folgenden Zugriffsmodifikatoren:
  • public – ein mit diesem Modifikator markiertes Element ist öffentlich. Mit anderen Worten: Felder und Methoden sowie mit dem Modifikator public deklarierte Klassen sind für andere Klassen sowohl in ihrem eigenen Paket als auch in externen Paketen sichtbar;
  • protected – Auf ein mit diesem Modifikator markiertes Element kann von überall in seiner eigenen Klasse im aktuellen Paket oder in abgeleiteten Klassen zugegriffen werden, auch wenn sie sich in anderen Paketen befinden;
  • Der Standardwert (oder überhaupt kein Modifikator) gilt implizit, wenn kein Zugriffsmodifikator angegeben ist. Es ähnelt dem vorherigen, außer dass es in abgeleiteten Klassen in anderen Paketen sichtbar ist.
  • private – Dies ist der privateste aller Modifikatoren. Es ermöglicht den Zugriff auf ein Element nur innerhalb der aktuellen Klasse.

40. Nennen Sie die Hauptmerkmale statischer und nicht statischer Methoden

Der Hauptunterschied besteht darin, dass statische Methoden zu einer Klasse gehören. Tatsächlich müssen Sie keine Instanz dieser Klasse erstellen – statische Methoden können einfach über den Klassentyp aufgerufen werden. Angenommen, wir haben eine statische Methode zum Streicheln einer Katze:

public class CatService {
   public static void petTheCat(Cat cat) {
       System.out.println("Pet the cat: " + cat.getName());
   }
Wir benötigen keine Instanz der CatService- Klasse, um es aufzurufen:

Cat cat = new Cat(7, "Bobby");
CatService.petTheCat(cat);
Im Gegensatz dazu sind gewöhnliche Methoden an ein Objekt gebunden (gehören ihm). Um sie aufzurufen, benötigen Sie eine Instanz (ein Objekt), auf der die Methode aufgerufen wird. Angenommen, unsere Katze verfügt über eine nicht statische Methode meow() :

class Cat {
   public void meow() {
       System.out.println("Meow! Meow! Meow!");
   }
Um diese Methode aufzurufen, benötigen wir eine bestimmte Instanz einer Katze:

Cat cat = new Cat(7, "Bobby");
cat.meow();

41. Was sind die wichtigsten Einschränkungen, die für statische und nicht statische Methoden gelten?

Wie ich bereits sagte, besteht die Hauptbeschränkung einer gewöhnlichen (nicht statischen) Methode darin, dass es immer eine Instanz geben muss, auf der die Methode aufgerufen wird. Eine statische Methode erfordert dies jedoch nicht. Darüber hinaus kann eine statische Methode den Verweis this auf Elemente eines Objekts nicht verwenden, da jetzt ein aktuelles Objekt für die Methode vorhanden ist.

42. Was bedeutet das Schlüsselwort static? Kann eine statische Methode überschrieben oder überladen werden?

Ein mit dem Schlüsselwort static markiertes Element gehört nicht zu einer Instanz einer Klasse, sondern zur Klasse selbst. Es wird geladen, wenn die Klasse selbst geladen wird. Statische Elemente sind für das gesamte Programm gleich, während nicht statische Elemente nur für ein bestimmtes Objekt gleich sind. Die folgenden Elemente können statisch sein:
  • Felder einer Klasse;
  • Initialisierungsblock einer Klasse;
  • eine Methode einer Klasse;
  • verschachtelte Klassen einer Klasse (natürlich ist dies auch eine Tautologie).
Eine statische Methode kann nicht überschrieben werden: Sie gehört zur Klasse und wird nicht vererbt, kann aber gleichzeitig überladen werden.

43. Kann eine Methode gleichzeitig statisch und abstrakt sein?

Ich habe dies bereits in einem früheren Artikel beantwortet: Eine Methode kann nicht gleichzeitig abstrakt und statisch sein. Wenn eine Methode abstrakt ist, bedeutet das, dass sie in einer untergeordneten Klasse überschrieben werden muss. Aber eine statische Methode gehört zur Klasse und kann nicht überschrieben werden. Dadurch entsteht ein Widerspruch, der dem Compiler auffällt und sich darüber aufregt. Wenn Sie sich in dieser Situation befinden, sollten Sie ernsthaft über die Korrektheit der Architektur Ihrer Anwendung nachdenken (Hinweis: Da stimmt eindeutig etwas nicht). Erkundung der Fragen und Antworten aus einem Vorstellungsgespräch für eine Stelle als Java-Entwickler.  Teil 5 - 2

44. Können statische Methoden inmitten nicht statischer Methoden verwendet werden? Und umgekehrt? Warum?

Wir können statische Methoden in nicht statischen Methoden verwenden. Nichts verhindert das. Das Gegenteil ist jedoch nicht möglich: Eine statische Methode kann keine nicht statische Methode verwenden, ohne auf eine bestimmte Instanz der Klasse zu verweisen. Denken Sie daran, dass statische Mitglieder einer Klasse keinen Zugriff auf eine This- Referenz haben: Sie können so viele konkrete Objekte der Klasse haben, wie Sie möchten, und jedes von ihnen enthält eine This- Referenz, die eine Selbstreferenz darstellt. Wie kann man also bestimmen, welche Referenz verwendet werden soll? Äh, das tust du nicht. Aus diesem Grund können statische Elemente nicht auf nicht statische Elemente verweisen, ohne auf ein bestimmtes Objekt zu verweisen. Grundsätzlich kann eine statische Methode nur dann eine nicht-statische Methode verwenden, wenn sie einen Verweis auf ein bestimmtes Objekt hat. Zum Beispiel eines, das als Methodenargument einging:

public static void petTheCat(Cat cat) {
   System.out.println("Pet the cat: " + cat.getName());
}
Hier sehen wir, dass in der statischen Methode petTheCat() getName aufgerufen wird , eine gewöhnliche nicht statische Methode eines Cat- Objekts.

45. Was ist eine Schnittstelle? Kann es eine endgültige Schnittstelle geben?

Wir erinnern uns, dass es in Java keine Mehrfachvererbung gibt. Schnittstellen sind so etwas wie eine Alternative dazu. Eine Schnittstelle ist wie eine sehr reduzierte Klasse. Sie definieren die Funktionalität, aber keine konkrete Implementierung. Diese Aufgabe wird den Klassen überlassen, die diese Schnittstellen implementieren. Beispiel einer Schnittstelle:

public interface Animal {
    void speak();
}
Beispiel einer Schnittstellenimplementierung durch eine Klasse

class Cat implements Animal {
 
   @Override
   public void speak() {
       System.out.println("Meow! Meow! Meow!");
   }
}
Hier ist das Wichtigste, was Sie über die Verwendung von Schnittstellen wissen sollten:
  1. Schnittstellenmethoden dürfen nur einen Header enthalten. Sie dürfen keinen bestimmten Methodenkörper haben, dh sie müssen abstrakt sein (obwohl sie nicht das Schlüsselwort abstract verwenden ). Es gibt Ausnahmen: statische Methoden und Standardmethoden, die einen Methodenkörper erfordern.

  2. Eine Klasse kann viele Schnittstellen implementieren (wie gesagt, Schnittstellen sind eine Alternative zur Mehrfachvererbung). Die Schnittstellennamen werden im Methodenheader durch Kommas getrennt: class Lion implementiert Animal, Wild .

  3. Schnittstellen werden mit dem Schlüsselwort interface erstellt .

  4. Wenn eine Klasse eine Schnittstelle implementiert, verwenden wir das Schlüsselwort „implements“ .

  5. Eine Klasse, die eine bestimmte Schnittstelle implementiert, muss alle ihre abstrakten Methoden implementieren oder sich selbst als abstrakt deklarieren.

  6. Der Hauptzweck der Verwendung von Schnittstellen besteht darin, Polymorphismus zu implementieren (um einem Objekt die Möglichkeit zu geben, viele Formen anzunehmen).

  7. In der Regel werden Zugriffsmodifikatoren für Methoden nicht in Schnittstellen angegeben: Sie sind standardmäßig öffentlich , und Sie können keine anderen Modifikatoren als public angeben . Ab Java 9 können Sie private Modifikatoren für Methoden verwenden.

  8. Standardmäßig sind Schnittstellenvariablen statisch final . Mit anderen Worten, es handelt sich um Konstanten – sie müssen immer direkt in der Schnittstelle initialisiert werden.

  9. Sie können keine Instanz einer Schnittstelle erstellen.

Die Antwort auf die Frage, ob Schnittstellen endgültig sein können, lautet natürlich nein. Tatsächlich besteht der Sinn von Schnittstellen darin, dass sie implementiert werden. Und wie wir uns alle sehr gut erinnern, macht der letzte Modifikator auf Klassenebene eine Klasse nicht vererbbar und im Fall einer Schnittstelle nicht umsetzbar. Warum brauchen wir eine Schnittstelle, die wir nicht implementieren und nutzen können? Du hast recht – das würden wir nicht tun! Und der Compiler stimmt zu. :) Erkundung der Fragen und Antworten aus einem Vorstellungsgespräch für eine Stelle als Java-Entwickler.  Teil 5 - 3Tatsächlich mag die Einführung statischer Schnittstellenmethoden seit Java 8 einen Sinn ergeben, aber das ändert nichts an der Tatsache, dass eine Schnittstelle nicht endgültig sein kann. Ich habe nur sehr oberflächlich über Schnittstellen gesprochen, da es sich um ein breites Thema handelt. Weitere Informationen hierzu finden Sie in den Artikeln zu Schnittstellen in Java und dem Unterschied zwischen abstrakten Klassen und Schnittstellen .

46. ​​Wo können statische Felder initialisiert werden?

Statische Felder können initialisiert werden:
  • unmittelbar nach der Deklaration mit einem Gleichheitszeichen ( = );
  • in einem statischen Initialisierungsblock;
  • in einem nicht statischen Initialisierungsblock (Sie müssen jedoch verstehen, dass jedes Mal, wenn ein Objekt erstellt wird, das statische Feld überschrieben wird, wenn dieser Initialisierungsblock ausgeführt wird;
  • in einem Klassenkonstruktor. Bei jedem Aufruf des Konstruktors (d. h. bei jeder Erstellung eines Objekts mit diesem Konstruktor) wird das Feld überschrieben;
  • in statischen Methoden;
  • in nicht statischen Methoden;
  • in verschachtelten statischen und nicht statischen, lokalen und anonymen Klassen.

47. Was sind anonyme Kurse?

Anonyme Klassen sind Klassen, die keinen eigenen Typ haben. Wovon rede ich? Als wir über Schnittstellen sprachen, erwähnte ich, dass man keine Instanz eines Objekts erstellen kann: Man kann nur eine Instanz einer Klasse erstellen, die eine Schnittstelle implementiert. Was ist, wenn Sie nicht möchten, dass eine Klasse eine Schnittstelle implementiert, sondern ein Objekt benötigen, das die Schnittstelle implementiert? Und dies ist wahrscheinlich die einzige Verwendung des Objekts. Und Sie müssen keine vollständige Implementierungsklasse erstellen. Wie würdest du es machen? Das ist richtig! Durch die Verwendung einer anonymen Klasse! Erkundung der Fragen und Antworten aus einem Vorstellungsgespräch für eine Stelle als Java-Entwickler.  Teil 5 - 4Angenommen, wir haben eine Animal- Schnittstelle:

public final interface Animal {
   public void speak();
}
Wenn wir eine anonyme Klasse verwenden möchten, um eine bestimmte Schnittstelle zu instanziieren:

Animal cat = new Animal() {
   @Override
   public void speak() {
       System.out.println("Meow! Meow! Meow!");
   }
};
Und dann können Sie dieses Objekt und die implementierte speak()- Methode sicher verwenden. Mit anderen Worten: Die anonyme Klasse implementiert die Schnittstelle und alle ihre abstrakten Methoden genau hier und jetzt. Andernfalls wären wir nicht in der Lage, ein Interface/abstraktes Klassenobjekt zu erstellen, da es nicht implementierte/abstrakte Methoden gäbe. Wie ich bereits erwähnt habe, werden anonyme Klassen nicht nur zur Implementierung der abstrakten Methoden einer Schnittstelle verwendet, sondern auch zur Implementierung der abstrakten Methoden einer abstrakten Klasse. Dieser Ansatz eignet sich für Situationen, in denen ein Objekt einmal verwendet wird oder wenn eine bestimmte Methodenimplementierung nur einmal benötigt wird. Es ist nicht erforderlich, eine separate Klasse zu erstellen, die die erforderliche abstrakte Klasse/Schnittstelle implementiert. Ich stelle aber auch fest, dass anonyme Klassen in der Arbeit selten verwendet werden. In der Regel wird den ordentlichen Klassen weiterhin der Vorzug gegeben. Mehr über anonyme Klassen können Sie hier in diesem Artikel lesen .

48. Was sind primitive Klassen?

Ich denke, das ist eine irreführende Frage, möglicherweise eine Fangfrage, da es in Java keine primitiven Klassen gibt. Es gibt nur das Konzept der primitiven Typen, das wir zuvor betrachtet haben. Wir erinnern uns, dass Java 8 primitive Typen hat: byte , short , int , long , float , double , char , boolean .

49. Was ist eine Wrapper-Klasse?

Das Hauptproblem bei der Verwendung primitiver Typen in Java besteht darin, dass es sich nicht um Klassen handelt und Java eine OOP-Sprache ist. Das heißt, in dieser Sprache geschriebene Programme laufen auf Interaktionen zwischen Objekten hinaus. Aber Primitive sind keine Objekte. Sie verfügen nicht über Methoden, auch nicht über die Standardmethoden der Object- Klasse. Aber was ist, wenn wir ein Grundelement als Schlüssel in einer Map verwenden müssen ? Dann müssen wir die Methode hashCode() aufrufen . Dort können Sie auch die Methode equal() aufrufen . Was dann? Es gibt Unmengen von Momenten, in denen man einen Unterricht braucht, kein Primitiv. Dies macht Grundelemente zu unbrauchbaren und unerwünschten Elementen in einem Programm, da sie gegen die eigentliche Idee von OOP verstoßen. Aber die Situation ist nicht so schlimm, wie es scheint. Schließlich gibt es in Java das Konzept primitiver Wrapper. In Java hat jeder primitive Typ einen Zwilling – eine Wrapper-Klasse.
  • Byte -> Byte.klasse
  • short -> Short.class
  • int -> Integer.class
  • long -> Long.class
  • float -> Float.class
  • double -> Double.class
  • char -> Character.class
  • boolean -> Boolean.class
Diese Typen stellen die einfachen Typen dar, jedoch in vollwertigen Klassen mit einer Reihe vielfältiger und hilfreicher Methoden. Um eine komfortable Nutzung dieser Klassen zu ermöglichen, wurden die Konzepte Autoboxing und Unboxing eingeführt. Autoboxing ist die automatische Konvertierung eines primitiven Typs in seine analoge Klasse, falls erforderlich (z. B. Konvertierung int in Integer ). Unboxing ist der umgekehrte Vorgang: automatische Konvertierung einer primitiven Wrapper-Klasse in einen primitiven Typ (z. B. Konvertieren von Integer in int ). Dank der Einführung primitiver Wrapper-Klassen und der Autoboxing- und Unboxing -Prozesse sind primitive Typen nun vollwertige Mitglieder von Java als OOP-Sprache. Erkundung der Fragen und Antworten aus einem Vorstellungsgespräch für eine Stelle als Java-Entwickler.  Teil 5 - 5Für eine tiefergehende Diskussion dieses Themas empfehle ich dringend die Lektüre dieses Artikels .

50. Was ist eine verschachtelte Klasse? Wo wird es verwendet?

Eine verschachtelte Klasse ist eine Klasse, die selbst Mitglied einer anderen Klasse ist. In Java gibt es vier Arten dieser verschachtelten Klassen: 1. Innere Klasse Diese Art von Klasse wird direkt im Hauptteil einer anderen Klasse deklariert. Eine innere Klasse ist eine nicht statische verschachtelte Klasse und kann auf jedes private Feld oder jede Instanzmethode der äußeren Klasse zugreifen. Lassen Sie uns als Beispiel einen Zoo erstellen, der ein Tier enthält – ein Zebra:

public class Zoo {
   class Zebra {
       public void eat(String food) {
           System.out.println("Zebra eats " + food);
       }
   }
}
Nicht kompliziert, oder? Schauen wir uns ein Beispiel für die Erstellung einer Instanz der inneren Klasse an:

Zoo.Zebra zebra = new Zoo().new Zebra();
zebra.eat("apple");
Wie Sie bereits gesehen haben, ist es notwendig, zunächst ein Objekt der umschließenden Klasse zu erstellen. Anschließend verwenden Sie die Objektreferenz, um eine Instanz der inneren Klasse zu erstellen. Ich möchte auch darauf hinweisen, dass eine innere Klasse (nicht statische verschachtelte Klasse) keine statischen Methoden oder statischen Felder haben kann . Dies liegt genau daran, dass die innere Klasse implizit mit einer Instanz ihrer äußeren Klasse verknüpft ist und daher keine statischen Methoden in sich selbst deklarieren kann. 2. Statisch verschachtelte Klassen Diese Klassen ähneln der vorherigen Kategorie, verfügen jedoch über den statischen Zugriffsmodifikator in der Klassendeklaration. Da diese Art von Klasse keinen Zugriff auf die nicht statischen Felder der äußeren Klasse hat, ähnelt sie eher einem statischen Teil der äußeren Klasse als einer inneren Klasse. Aber diese Klasse hat Zugriff auf alle statischen Mitglieder der äußeren Klasse, auch auf die privaten. Beispiel einer statisch verschachtelten Klasse:

public class Zoo {
   static class Zebra {
       public void eat(String food) {
           System.out.println("Zebra eats " + food);
       }
   }
}
Es ist etwas anders als das vorherige erstellt:

Zoo.Zebra zebra = new Zoo.Zebra();
zebra.eat("apple");
Hier benötigen wir kein Objekt der äußeren Klasse, um ein Objekt der statischen verschachtelten Klasse zu erstellen. Wir müssen nur den Namen der verschachtelten Klasse kennen, um sie innerhalb der äußeren Klasse zu finden. 3. Lokale Klassen Lokale Klassen sind Klassen, die im Rumpf einer Methode deklariert werden. Objekte einer lokalen Klasse können nur innerhalb der umschließenden Methode erstellt und verwendet werden. Beispiel:

public class Zoo {
   public void feed(String animal, String food) {
       switch(animal) {
           case "zebra":
               class Zebra {
                   public void eat(String food) {
                       System.out.println("Zebra eats " + food);
                   }
               }
               Zebra zebra = new Zebra();
               zebra.eat(food);
               ...
Hier ist ein Beispiel:

Zoo zoo = new Zoo();
zoo.feed("zebra", "apple");
Wenn Sie den Code für die Methode „feed()“ nicht sehen würden , würden Sie nicht einmal vermuten, dass eine lokale Klasse existiert, oder? Eine lokale Klasse kann nicht static oder transient sein , aber sie kann als abstrakt oder final markiert werden (eines ODER das andere, aber nicht beides, da die gleichzeitige Verwendung dieser beiden Modifikatoren einen Konflikt erzeugt). 4. Anonyme Klassen Wir haben oben bereits über anonyme Klassen gesprochen, und wie Sie sich erinnern werden, können sie aus zwei Quellen erstellt werden – Schnittstellen und Klassen. Gründe für ihre Verwendung Es werden verschachtelte statische und nicht statische Klassen verwendet, da es manchmal besser ist, kleine Klassen in allgemeinere Klassen einzubetten und sie zusammenzuhalten, damit sie einen höheren Zusammenhalt und einen gemeinsamen Zweck haben. Grundsätzlich können Sie mit verschachtelten Klassen die Kapselung Ihres Codes erhöhen. Sie können sich für die Verwendung einer lokalen Klasse entscheiden, wenn die Klasse ausschließlich innerhalb einer einzelnen Methode verwendet wird. Müssen wir in diesem Fall den Code über die Anwendung verteilen? Nein. Allerdings möchte ich hinzufügen, dass ich meiner Erfahrung nach noch nie jemanden gesehen habe, der lokale Klassen verwendet, denn ob sie benötigt werden oder nicht, ist höchst umstritten. Sie können anonyme Klassen verwenden, wenn eine bestimmte Implementierung einer Schnittstelle oder einer abstrakten Klasse nur einmal benötigt wird. In diesem Fall ist es nicht erforderlich, eine separate, vollwertige Klasse mit Implementierung zu erstellen. Stattdessen haben wir es einfach gehalten und die Methode(n), die wir benötigen, mithilfe einer anonymen Klasse implementiert, das Objekt verwendet und es dann vergessen (der Garbage Collector hat es natürlich nicht vergessen). Ihr Verständnis verschachtelter Klassen wird durch den Artikel hier verbessert.

51. Welche Zugriffsmodifikatoren kann eine Klasse haben?

Es gibt verschiedene Arten von Klassen und für sie gelten unterschiedliche Zugriffsmodifikatoren:
  • Eine äußere Klasse kann den öffentlichen Zugriffsmodifikator oder überhaupt keinen Modifikator (den Standardmodifikator) haben .
  • Eine innere Klasse (nicht statische verschachtelte Klasse) kann einen der vier Zugriffsmodifikatoren haben.
  • Eine verschachtelte statische Klasse kann einen beliebigen Zugriffsmodifikator außer protected haben , da dieser Modifikator eine Vererbung impliziert, was jedem statischen Mitglied der Klasse widerspricht (statische Mitglieder werden nicht vererbt).
  • Eine lokale Klasse kann nur den Standardmodifikator haben (dh überhaupt keinen Modifikator).
  • Eine anonyme Klasse hat keine Klassendeklaration und daher überhaupt keinen Zugriffsmodifikator.
Hier enden wir für heute. Bis bald!Erkundung der Fragen und Antworten aus einem Vorstellungsgespräch für eine Stelle als Java-Entwickler.  Teil 5 - 6
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION