JavaRush /Java-Blog /Random-DE /Analyse von Fragen und Antworten aus Interviews für Java-...

Analyse von Fragen und Antworten aus Interviews für Java-Entwickler. Teil 5

Veröffentlicht in der Gruppe Random-DE
Hallo Hallo! Heutzutage sind Java-Entwickler sehr gefragt. Natürlich kann ich Ihnen keine freie Stelle vermitteln, aber ich werde versuchen, Ihnen dabei zu helfen, neues Wissen zu erlangen und Lücken zu schließen. Deshalb analysieren wir weiterhin über 250 Interviewfragen für Java-Entwickler. Links zu früheren Teilen der Analyse finden Sie am Ende des Artikels.Analyse von Fragen und Antworten aus Interviews für Java-Entwickler.  Teil 5 - 1

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

Ich habe Zugriffsmodifikatoren bereits in der Frage zu Java-Kapselungselementen beschrieben. 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. Zugriffsmodifikatoren können sein:
  • public – ein Element mit diesem Modifikator ist öffentlich zugänglich. Diese. Felder und Methoden, Klassen, die mit dem öffentlichen Modifikator deklariert wurden, sind für andere Klassen sowohl aus dem aktuellen Paket als auch aus externen Paketen sichtbar;
  • protected – Auf ein Element mit diesem Modifikator kann von überall in der aktuellen Klasse des aktuellen Pakets oder in untergeordneten Klassen zugegriffen werden, auch wenn diese sich in anderen Paketen befinden;
  • default oder fehlender Modifikator – dieser Modifikator wird implizit verwendet, wenn der Zugriffsmodifikator überhaupt nicht angegeben ist. Es ähnelt dem vorherigen, außer dass die Sichtbarkeit in abgeleiteten Klassen zulässig ist, die sich in anderen Paketen befinden.
  • private ist der privateste aller Modifikatoren und ermöglicht den Zugriff auf das Element nur innerhalb der aktuellen Klasse.
Analyse von Fragen und Antworten aus Interviews für Java-Entwickler.  Teil 5 - 2

40. Nennen Sie das Hauptmerkmal statischer und variabler Methoden

Eine sehr seltsame Formulierung – „variable Methoden“. Dies bezieht sich sicherlich auf gewöhnliche, nicht statische Methoden. Der Hauptunterschied besteht also darin, dass statische Methoden zur Klasse gehören und Sie für sie tatsächlich keine Instanz dieser Klasse erstellen müssen: Sie kann nur über den Klassentyp aufgerufen werden. Wir haben zum Beispiel eine statische Methode, um die Katze zu streicheln:
public class CatService {
   public static void petTheCat(Cat cat) {
       System.out.println("Погладить кота - " + cat.getName());
   }
Wir benötigen keine Instanz der CatService- Klasse, um es aufzurufen :
Cat cat = new Cat(7, "Bobi");
CatService.petTheCat(cat);
Während gewöhnliche Methoden an ein Objekt gebunden sind (zu ihm gehören), müssen Sie zum Aufrufen eine Instanz (ein Objekt) haben, auf der die Methode aufgerufen wird. Beispielsweise verfügt eine Katze über eine nicht statische Methode – das Miauen:
class Cat {
   public void mew() {
       System.out.println("Meow! Meow! Meow!");
   }
Um diese Methode aufzurufen, benötigen wir eine bestimmte Instanz der Katze:
Cat cat = new Cat(7, "Bobi");
cat.mew();

41. Was sind die wichtigsten Einschränkungen für statische und „variable“ Methoden?

Wie ich bereits sagte, besteht die Hauptbeschränkung einer regulären Methode darin, dass es immer eine Instanz geben muss, auf der diese Methode aufgerufen wird. Eine statische Methode erfordert dies jedoch nicht, sie kann jedoch nicht auf diese Referenz – auf die Elemente des aktuellen Objekts – verweisen, da das aktuelle Objekt für sie nicht existiert.

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

Ein durch das Schlüsselwort static bezeichnetes Element gehört nicht zu einem Objekt der Klasse, sondern zu der Klasse und wird geladen, wenn die Klasse selbst geladen wird. Statische Elemente sind die einzigen für das gesamte Programm und reguläre Elemente sind die einzigen für ein bestimmtes Objekt. Statisch kann sein:
  • Klassenfelder;
  • Klasseninitialisierungsblock;
  • Klassenmethode;
  • interne Klassen einer Klasse (das ist jedoch immer noch 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?

Das habe ich bereits im vorherigen Artikel erwähnt: Eine Methode kann nicht gleichzeitig abstrakt und statisch sein. Die Abstraktheit einer Methode bedeutet, dass sie im Nachfolger überschrieben werden muss. Gleichzeitig gehört eine statische Methode zur Klasse und kann nicht überschrieben werden: Dies führt zu einem Widerspruch, den der Compiler erkennt und zu verfluchen beginnt. Wenn Sie sich in einer solchen Situation befinden, sollten Sie ernsthaft über die Korrektheit der Architektur Ihrer Anwendung nachdenken (schließlich stimmt eindeutig etwas nicht).Analyse von Fragen und Antworten aus Interviews für Java-Entwickler.  Teil 5 - 3

44. Ist es möglich, statische Methoden inmitten regulärer Methoden zu verwenden? Und umgekehrt? Warum?

Statische Methoden können in regulären Methoden verwendet werden, da dem nichts entgegensteht. Gleichzeitig ist die umgekehrte Situation unmöglich: Eine statische Methode kann keine reguläre Methode verwenden, ohne einen Verweis auf eine bestimmte Instanz dieser Klasse zu haben. Und wie wir uns erinnern, ist die this- Referenz für statische Klassenmitglieder nicht verfügbar: Es können so viele spezifische Objekte der Klasse vorhanden sein, wie Sie möchten, und jedes von ihnen enthält eine Referenz auf sich selbst – this . Und wie verstehen Sie dann, welchen bestimmten Link Sie nehmen müssen? Aber auf keinen Fall. Daher können statische Elemente nicht auf nicht statische Elemente verweisen, ohne auf ein bestimmtes Objekt zu verweisen. Tatsächlich kann eine statische Methode nur dann eine nicht statische Methode verwenden, wenn sie einen Verweis auf ein bestimmtes Objekt hat. Zum Beispiel das, was als Argument kam:
public static void petTheCat(Cat cat) {
   System.out.println("Погладить кота - " + cat.getName());
}
Hier sehen wir, dass die statische Methode petTheCat die normale, nicht statische Methode des Cat- Objekts aufruft – getName .

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

Wie wir uns erinnern, gibt es in Java keine Mehrfachvererbung. Schnittstellen sind so etwas wie eine Alternative dazu. Die Schnittstelle sieht aus wie eine sehr abgespeckte Klasse. Sie definieren Funktionalität ohne eine spezifische Implementierung, die von Klassen implementiert wird, die diese Schnittstellen implementieren (implementieren). Schnittstellenbeispiel:
public interface Animal {
    void voice();
}
Ein Beispiel für eine Schnittstellenimplementierung durch eine Klasse:
class Cat implements Animal {

   @Override
   public void voice() {
       System.out.println("Meow! Meow! Meow!");
   }
}
Das Wichtigste, was Sie über die Verwendung von Schnittstellen wissen müssen, ist:
  1. Schnittstellenmethoden sollten nur einen Header ohne einen bestimmten Methodenkörper enthalten, d. h. muss abstrakt sein (aber ohne das Schlüsselwort abstract zu verwenden ). Eine Ausnahme hiervon bilden statische Methoden und Standardmethoden, die einen Methodenkörper erfordern.
  2. Eine Klasse kann viele Schnittstellen implementieren (wie gesagt, dies ist eine Alternative zur Mehrfachvererbung), die durch Kommas getrennt geschrieben werden: Klasse Lion implementiert Animal, Wild .
  3. Schnittstellen werden mit dem Schlüsselwort -interface erstellt .
  4. Bei der Implementierung einer Schnittstelle durch eine Klasse lautet das Schlüsselwort „implementiert“ .
  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 (die Fähigkeit von Objekten, viele Formen anzunehmen) zu implementieren.
  7. In der Regel werden Zugriffsmodifikatoren für Methoden nicht in die Schnittstelle geschrieben: Sie sind standardmäßig öffentlich , und andere Modifikatoren als public können nicht angegeben werden. Seit Java 9 können Sie private Modifikatoren für Methoden verwenden.
  8. Schnittstellenvariablen sind standardmäßig statisch final , also Konstanten: Sie müssen immer direkt in der Schnittstelle initialisiert werden.
  9. Sie können kein Schnittstellenobjekt erstellen.
Die Antwort auf die Frage, ob Schnittstellen endgültig sein können, lautet natürlich nicht. Denn das Wesentliche an Schnittstellen ist die Implementierung. Und wie wir uns alle sehr gut erinnern, macht final auf Klassenebene es nicht vererbbar und im Fall einer Schnittstelle nicht umsetzbar. Warum brauchen wir eine Schnittstelle, die nicht implementiert und genutzt werden kann? Genau, das ist nicht nötig! Und der Compiler glaubt das)) Analyse von Fragen und Antworten aus Interviews für Java-Entwickler.  Teil 5 - 4Die Bedeutung erschien erst mit der Einführung statischer Methoden in Schnittstellen mit Java 8, was jedoch nichts an der Tatsache änderte, dass die Schnittstelle nicht endgültig sein kann. Ich habe sehr oberflächlich über Schnittstellen gesprochen, weil... das ist ein weites Thema. Lesen Sie mehr dazu in den Artikeln über Schnittstellen in Java und den Unterschied zwischen abstrakten Klassen und Schnittstellen .

46. ​​​​Wo kann ich statische Felder initialisieren?

Statische Felder können initialisiert werden:
  • direkt bei der Deklaration, durch das Gleichheitszeichen = ;
  • im statischen Initialisierungsblock;
  • in einem nicht statischen Initialisierungsblock, aber Sie müssen verstehen, dass jedes Mal, wenn ein Objekt erstellt wird, dieses Feld von diesem Initialisierungsblock überschrieben wird;
  • im Klassenkonstruktor. Jedes Mal, wenn dieser Konstruktor aufgerufen wird (d. h. wenn ein Objekt über diesen Konstruktor erstellt wird), wird dieses Feld überschrieben.
  • in statischen Methoden;
  • in nicht statischen Methoden;
  • in internen 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, habe ich erwähnt, dass Sie kein Schnittstellenobjekt erstellen können: Sie können nur ein Objekt einer Klasse erstellen, die die Schnittstelle implementiert. Was ist, wenn Sie keine Schnittstelle in einer Klasse implementieren möchten, aber dennoch ein Objekt des Schnittstellentyps benötigen? Und höchstwahrscheinlich wird dies ein einziger Fall der Verwendung dieses Objekts sein. Und Sie müssen keine vollständige Implementierungsklasse erstellen. Wie machen Sie das? Rechts! Durch eine anonyme Klasse! Analyse von Fragen und Antworten aus Interviews für Java-Entwickler.  Teil 5 - 5Nehmen wir an, wir haben eine Animal- Schnittstelle :
public final interface Animal {
   public void voice();
}
Wenn wir diese Schnittstelle über eine anonyme Klasse instanziieren möchten:
Animal cat = new Animal() {
   @Override
   public void voice() {
       System.out.println("Meow! Meow! Meow!");
   }
};
Und dann können Sie dieses Objekt und seine implementierte Methode – Stimme – sicher verwenden . Das heißt, eine anonyme Klasse implementiert diese Schnittstelle und alle ihre abstrakten Methoden genau hier und jetzt. Andernfalls können wir kein Interface/abstraktes Klassenobjekt erstellen, da es nicht implementierte/abstrakte Methoden gibt. Wie bereits erwähnt, werden anonyme Klassen nicht nur zur Implementierung abstrakter Methoden einer Schnittstelle verwendet, sondern auch zur Implementierung abstrakter Methoden einer abstrakten Klasse. Dieser Ansatz eignet sich für Situationen, in denen ein Objekt einmal verwendet wird oder eine bestimmte Implementierung von Methoden nur einmal benötigt wird und keine Notwendigkeit besteht, eine separate Klasse zu erstellen, die die erforderliche abstrakte Klasse/Schnittstelle implementiert. Ich möchte aber auch anmerken, dass die Verwendung anonymer Klassen in der Arbeit selten vorkommt: In der Regel werden gewöhnlichen Klassen immer noch der Vorzug gegeben. Weitere Informationen zu anonymen Klassen finden Sie in diesem Artikel .

48. Was sind primitive Klassen?

Für mich ist das eine sehr seltsame Frage und vielleicht eine Falle, denn in Java gibt es keine primitiven Klassen: außer vielleicht das Konzept der primitiven Typen, das wir bereits früher betrachtet haben. Wie wir uns erinnern, gibt es in Java 8 primitive Typen: byte , short , int , long , float , double , char , boolean .Analyse von Fragen und Antworten aus Interviews für Java-Entwickler.  Teil 5 - 6

49. Was ist die „Wrapper“-Klasse?

Das Hauptproblem bei der Verwendung primitiver Typen in Java besteht darin, dass es sich immer noch nicht um Klassen handelt und Java immer noch eine OOP-Sprache ist. Das heißt, in dieser Sprache geschriebene Programme beschränken sich auf die Interaktion zwischen Objekten. Nun, Grundelemente sind keine Objekte. Sie haben keine Methoden, nicht einmal die Standardmethoden der Object- Klasse . Was wäre, wenn wir in Map ein Grundelement als Schlüssel verwenden müssten ? Dann müssen Sie die Methode hashCode aufrufen . Sie können dort auch die Methode equals aufrufen . Was dann? Es kann sehr, sehr viele Momente geben, in denen es eine Klasse und kein Grundelement geben sollte, wodurch Grundelemente zu ungenutzten und unerwünschten Elementen im Programm werden, weil dies die eigentliche Idee von OOP zerstört. Aber nicht alles ist so schlimm, wie es scheint. Schließlich verfügt Java über das Konzept eines primitiven Wrappers. Jeder primitive Typ hat eine analoge 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
Dies ist eine Darstellung einfacher Typen, jedoch in Form vollwertiger Klassen mit einer Reihe vielfältiger und funktionaler Methoden. Zur bequemen Nutzung dieser Klassen wurden die Konzepte Autoboxing und Unboxing eingeführt. Autoboxing – automatische Konvertierung eines primitiven Typs in eine analoge Klasse, falls erforderlich (z. B. int in Integer ). Beim Unboxing handelt es sich um den umgekehrten Vorgang des vorherigen: die automatische Konvertierung einer primitiven Wrapper-Klasse in einen primitiven Typ (z. B. Integer in int ). Dank der Einführung primitiver Wrapper-Klassen und der Autoboxing- und Unboxing- Prozesse konnten primitive Typen zu vollwertigen Mitgliedern der OOP-Sprache – Java – werden. Analyse von Fragen und Antworten aus Interviews für Java-Entwickler.  Teil 5 - 7Um mehr über dieses Thema zu erfahren, empfehle ich dringend, diesen Artikel zu lesen .

50. Was ist eine Nested-Klasse? Wann wird es verwendet?

Eine verschachtelte Klasse ist eine innere Klasse, die Mitglied einer anderen Klasse ist. In Java gibt es 4 Arten solcher internen Klassen: 1. Innere Klasse Dieser Klassentyp wird direkt im Hauptteil einer anderen Klasse deklariert. Eine verschachtelte innere Klasse kann auf jedes private Feld oder jede private Methode einer Instanz der äußeren Klasse zugreifen. Lassen Sie uns als Beispiel einen Zoo erstellen, in dem wir ein Tier haben werden – ein Zebra:
public class Zoo {
   class Zebra {
       public void toFeed(String food) {
           System.out.println("Дать зебре - " + food);
       }
   }
}
Nichts Kompliziertes, oder? Schauen wir uns ein Beispiel für die Erstellung eines inneren Klassenobjekts an:
Zoo.Zebra zebra = new Zoo().new Zebra();
zebra.toFeed("яблоко");
Wie Sie bereits gesehen haben, ist es zwingend erforderlich, ein Objekt der Rahmenklasse zu erstellen, auf dessen Referenz Sie ein Objekt der inneren Klasse erstellen können. Ich möchte auch darauf hinweisen, dass eine verschachtelte innere Klasse keine statischen Methoden oder statischen Felder haben kann. Dies liegt daran, dass eine innere Klasse implizit mit dem Objekt ihrer äußeren Klasse verknüpft ist und keine statischen Methoden in sich selbst deklarieren kann. 2. Statisch verschachtelte Klassen Diese Klasse ähnelt der vorherigen, verfügt jedoch über einen statischen Zugriffsmodifikator in der Nähe der Klassendeklaration. Da diese Art von Klasse keinen Zugriff auf nicht statische Felder der äußeren Klasse hat, ähnelt sie eher dem statischen Teil der äußeren Klasse als einer inneren Klasse. In diesem Fall haben die Klassendaten Zugriff auf alle statischen Mitglieder der äußeren Klasse, auch auf private. Beispiel einer statisch verschachtelten Klasse:
public class Zoo {
   static class Zebra {
       public void toFeed(String food) {
           System.out.println("Дать зебре - " + food);
       }
   }
}
Die Erstellungsmethode unterscheidet sich geringfügig von der vorherigen:
Zoo.Zebra zebra = new Zoo.Zebra();
zebra.toFeed("яблоко");
Hier benötigen wir kein Objekt einer äußeren Klasse, um ein Objekt einer verschachtelten statischen Klasse zu erstellen. Von der äußeren Klasse benötigen wir nur ihren Typ, damit wir den Speicherort der verschachtelten Klasse ermitteln können. 3. Lokale Klassen Lokale Klassen sind Klassen, die im Rumpf einer Methode deklariert werden und die Erstellung und Verwendung eines Objekts einer lokalen Klasse ausschließlich innerhalb dieser Methode möglich ist. Beispiel:
public class Zoo {
   public void toFeed(String animal, String food) {
       switch(animal){
           case "зебра":
               class Zebra {
                   void toFeedZebra(String food) {
                       System.out.println("Дать зебре - " + food);
                   }
               }
               Zebra zebra = new Zebra();
               zebra.toFeedZebra(food);
               ...
Anwendungsbeispiel:
Zoo zoo = new Zoo();
zoo.toFeed("зебра", "яблоко");
Ohne den Code für die toFeed -Methode zu sehen , würden Sie nicht einmal die Existenz einer lokalen Klasse vermuten, oder? Eine lokale Klasse kann nicht static oder transient sein , sie kann jedoch als abstrakt oder final markiert werden (nur ODER, da die Verwendung dieser beiden Modifikatoren zu einem Konflikt führt). 4. Anonyme Klassen Wir haben oben bereits über anonyme Klassen gesprochen, und wie Sie sich erinnern, können sie aus zwei Quellen erstellt werden – Schnittstellen und Klassen. Gründe für die Verwendung Interne statische und nicht statische Klassen werden verwendet, weil es manchmal besser ist, kleine Klassen in größere einzubetten und sie zusammenzuhalten: Auf diese Weise haben sie einen höheren Zusammenhalt und einen gemeinsamen Zweck. Tatsächlich erhöht die Verwendung verschachtelter Klassen die Codekapselung. Der Grund für die Auswahl lokaler Klassen kann sein, dass eine bestimmte Klasse ausschließlich innerhalb einer einzelnen Methode verwendet wird. Ist es in diesem Fall notwendig, den Code in der gesamten Anwendung zu verteilen? Nein. Gleichzeitig möchte ich jedoch hinzufügen, dass ich in meiner Praxis noch nie die Verwendung lokaler Klassen gesehen habe, weil Ihre Notwendigkeit ist höchst umstritten. Nun, der Grund für die Verwendung anonymer Klassen könnte sein, dass eine bestimmte Implementierung einer Schnittstelle oder abstrakten Klasse nur einmal benötigt wird, sodass keine Notwendigkeit besteht, hierfür eine separate, vollwertige Klasse mit einer Implementierung zu erstellen. Stattdessen haben wir auf einfache Weise die von uns benötigten Methoden über eine anonyme Klasse implementiert, dieses Objekt verwendet und es vergessen (naja, der Garbage Collector hat sich daran erinnert). Dieser und dieserAnalyse von Fragen und Antworten aus Interviews für Java-Entwickler.  Teil 5 - 8 Artikel helfen Ihnen dabei, interne Klassen detaillierter zu studieren .

51. Welche Zugriffsmodifikatoren kann eine Klasse haben?

Wie wir uns erinnern, gibt es verschiedene Arten von Klassen und auf sie sind unterschiedliche Zugriffsmodifikatoren anwendbar:
  • Eine äußere Klasse kann den Zugriffsmodifikator public haben oder keinen Modifikator haben (Standardmodifikator).
  • die innere Klasse unterstützt alle 4 Zugriffsmodifikatoren;
  • Die verschachtelte statische Klasse unterstützt alle Zugriffsmodifikatoren außer protected , weil Dieser Modifikator impliziert eine Vererbung, was dem statischen Mitglied der Klasse widerspricht (statische Elemente werden nicht vererbt).
  • eine lokale Klasse kann nur einen Standardmodifikator haben (d. h. überhaupt keinen Modifikator);
  • Anonyme Klasse : Wenn keine Klassentypdeklaration vorhanden ist, gibt es überhaupt keine Zugriffsmodifikatoren.
Hier werden wir heute anhalten. Bis bald!Analyse von Fragen und Antworten aus Interviews für Java-Entwickler.  Teil 5 - 9
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION