CodeGym /Java-Blog /Germany /21 Fragen und Antworten zur Java-Programmierung
Autor
Milan Vucic
Programming Tutor at Codementor.io

21 Fragen und Antworten zur Java-Programmierung

Veröffentlicht in der Gruppe Germany
Es gibt Unmengen von Interviewfragen zu Java und wir können nicht alle in einem Artikel sammeln. Aber hier findest du einige nach Angaben von Personalverantwortlichen in IT-Unternehmen sehr häufig gestellte Java-Interviewfragen. 21 Fragen und Antworten zur Java-Programmierung - 1
  1. Erklären Sie den Ausdruck public static void main(String args[]).

    Dies ist eine der gängigsten Java-Interviewfragen zur Gesprächseröffnung, und eine sehr einfache.

    • public ist ein Zugriffsmodifikator. Wir nutzen ihn, um den Zugriff auf diese Methode zu spezifizieren. Hier ist der Modifikator „public“, also kann jede Klasse auf diese Methode zugreifen.

    • static. Dieses Java-Schlüsselwort bedeutet, dass wir diese Methode verwenden, ohne ein Objekt der Klasse zu erstellen.

    • Void ist der Rückgabetyp der Methode. Das bedeutet, dass die Methode keinen Wert zurückgibt.

    • main ist der Name der Methode. Die JVM betrachtet diesen Namen als Einstiegspunkt in die Anwendung (er muss eine bestimmte Signatur haben). Main ist die Methode, in der die eigentliche Ausführung stattfindet.

    • String args[]. Das ist der Parameter, der an die main-Methode übergeben wird. Hier haben wir Argumente vom Typ String, die unsere Java-Anwendung entgegennimmt, wenn wir sie ausführen. Du kannst sie in der Konsole eingeben.

  2. Was ist der Unterschied zwischen equals() und == ?

    Zunächst einmal ist == ein Operator und equals() eine Methode. Den Operator == verwenden wir für einen Referenzvergleich (oder Adressvergleich), während wir die Methode equals() für einen Inhaltsvergleich nutzen. Das heißt, dass == überprüft, ob beide Objekte auf den gleichen Speicherplatz verweisen, während equals() die Werte der Objekte vergleicht.

  3. Können wir ein Programm ohne die main()-Methode ausführen?

    Viele grundlegende Java-Interviewfragen sind wirklich einfach. Wie diese. Die kurze Antwort ist: Ja, das können wir. Zum Beispiel können wir das mit einem statischen Block realisieren.

    Du kannst einen statischen Block verwenden, um ein statisches Daten-Member zu initialisieren. Es wird vor der main Methode ausgeführt, wenn die Klassen geladen werden.

    
    class Example{  
     Static{
    System.out.println("static block is invoked");
    }  
      public static void main(String args[]){  
       System.out.println("Now main method");  
      }  
    }
    

    Die Ausgabe ist:

    
    static block is invoked
    Now main method
    

    Was passiert, wenn die main-Methode völlig fehlt? Wenn du versuchst, eine gewöhnliche Klasse ohne eine main-Methode zu starten, erhältst du den folgenden Fehler: Main method not found in class Test, please define the main method as: public static void main (String [] args) or a JavaFX application class must extend javafx.application.Application. Der Fehler selbst sagt, dass es möglich ist, wenn es sich um eine JavaFX-Anwendung handelt und die Klasse von javafx.application.Application erbt.

  4. Was ist ein immutable Objekt? Können Sie immutable Objekt erstellen?

    Du kannst Objekte einer immutable Klasse nach ihrer Erstellung nicht mehr verändern. Mit anderen Worten, wenn du sie einmal erstellt hast, kannst du sie nicht mehr ändern. Wenn du versuchst, ein Immutable Objekt zu verändern, erhältst du ein neues Objekt (Klon) und veränderst diesen Klon während der Erstellung.

    Ein gutes Beispiel ist String. Es ist in Java immutable. Das bedeutet, dass du ein String-Objekt selbst nicht verändern kannst, aber du kannst die Referenz auf ein Objekt ändern.

  5. Wie viele Objekte werden im folgenden Code erstellt?

    Das ist eine technische Java-Interviewfrage, welche Frage 4 oben ersetzen könnte.

    
    String s1="Hello";  
    String s2="Hello";  
    String s3="Hello";  
    

    Die Antwort ist „nur eins“, weil Java einen String-Pool besitzt. Wenn wir ein String-Objekt mit dem new()-Befehl erzeugen, erzeugt Java ein neues Objekt im Heap-Speicher. Wenn wir ein String-Literal verwenden, wie in unserem Beispiel oben, kann Java ein Objekt aus dem String-Pool zurückgeben, wenn bereits eines existiert.

  6. Wie viele Objekte werden im folgenden Code erstellt?

    
    String s = new String("Hello");
    

    Hier werden 2 Objekte erstellt. Eins befindet sich im Pool der String-Konstanten und das andere im Heap.

  7. Was ist der Unterschied zwischen den Klassen String, StringBuilder und StringBuffer in Java?

    Das ist eine der wichtigsten Java-Interviewfragen.

    Zunächst einmal ist String eine unveränderliche Klasse. Das bedeutet, dass du den einmal erstellten Inhalt nicht mehr ändern kannst. StringBuffer und StringBuilder sind dagegen veränderbare Klassen, die du später verändern kannst. Wenn wir versuchen, den Inhalt eines String-Objekts zu ändern, erstellt die JVM einen neuen String, während der ursprüngliche String nicht verändert wird. Aus diesem Grund ist die Leistung bei Verwendung von StringBuffer besser als bei String.

    Der Hauptunterschied zwischen StringBuffer und StringBuilder besteht darin, dass die Methoden von StringBuffer synchronisiert sind, während die von StringBuilder nicht synchronisiert sind.

  8. Gibt es einen Unterschied zwischen einem String, der als Literal erstellt wurde, und einem line, der mit dem new()-Befehl erstellt wurde?

    Ja, den gibt es. Wenn wir einen String mit dem new()-Befehl erstellen, erscheint er im Heap und wird nicht zum String-Pool hinzugefügt. Wenn wir einen String als Literal erstellen, wird er im string-Pool erstellt, der im PermGen-Bereich des Heaps liegt.

  9. Kann man eine private- oder static-Methode in Java überschreiben?

    Das ist für Einsteiger eine knifflige Java-Interviewfrage. Du kannst eine private- oder static-Methode in Java tatsächlich nicht überschreiben.

    Du kannst private-Methoden nicht überschreiben, da der Geltungsbereich der private-Zugriffsspezifikation auf den Bereich innerhalb der Klasse beschränkt ist. Um etwas zu überschreiben, brauchen wir eine Eltern- und Kindklasse. Wenn die Methode einer Oberklasse private ist, kann eine Unterklasse sie nicht verwenden, und die Methoden in der Unterklasse werden als neue Methoden behandelt (nicht überschrieben).

    Static-Methoden können ebenfalls nicht überschrieben werden, da static-Methoden eil der Klasse selbst sind. Sie sind nicht Teil eines Objekts der Klasse. Klar, du kannst dieselbe static-Methode mit derselben Signatur in Unterklassen deklarieren, aber auch hier werden diese als neue Methoden behandelt.

  10. Was ist der Unterschied zwischen einer Abstract Class und einem Interface

    Das ist eine beliebte Interviewfrage für Java-Entwickler, bei denen OOP-Prinzipien eine Rolle spielen. Zunächst einmal definiert in Java ein interface ein Verhalten, während eine abstract class eine Hierarchie erstellt.

    Abstrakte KlasseInterface
    Es ist möglich, einen Methodenrumpf (nicht-abstrakte Methoden) in einer abstrakten Klasse zu haben. Ein Interface kann nur abstrakte Methoden besitzen. In Java 8 und neueren Versionen ist es möglich, Standardmethoden zu definieren und diese direkt in einem Interface zu implementieren. Außerdem können Interfaces seit Java 8 statische Methoden besitzen.
    Eine abstrakte Klasse kann Instanzvariablen haben. Ein Interface kann keine Instanzvariablen haben.
    Konstruktoren sind erlaubt. Ein Interface kann keinen Konstruktor haben.
    Statische Methoden sind erlaubt. Statische Methoden sind nicht erlaubt.
    Eine Klasse kann nur eine abstrakte Oberklasse haben. Ein Interface kann von mehreren Klassen implementiert werden.
    Eine abstrakte Klasse kann die Implementierung des Interfaces bereitstellen. Ein Interface kann nicht die Implementierung einer abstrakten Klasse bereitstellen.
    Eine abstrakte Klasse kann eine andere Java-Klasse erweitern und mehrere Java-Interfaces implementieren. Ein Interface darf nur ein anderes Java-Interface erweitern.
    Eine abstrakte Java-Klasse kann private- und protected-Member besitzen. Member eines Java-Interfaces sind standardmäßig public.
  11. Können wir static Variablen und Methoden in einer abstract Klasse deklarieren?

    Ja, es ist möglich, static Variablen und Methoden in einer abstract Klasse zu deklarieren. Für den Zugriff auf den statischen Kontext ist es nicht erforderlich, ein Objekt zu erstellen. Beispielsweise ist es uns erlaubt, auf den innerhalb einer abstract Klasse deklarierten statischen Kontext zuzugreifen, indem wir den Namen der abstract Klasse verwenden.

  12. Welche Arten von Speicherbereichen werden von der JVM zugewiesen?

    Der Klassenbereich speichert Strukturen pro Klasse, z. B. einen Pool von Laufzeitkonstanten, Felder, Methodendaten und den gesamten Code für Methoden.

    Der Heap ist ein Laufzeitdatenbereich, in dem den Objekten Speicher zugewiesen wird.

    Der Stack speichert Frames. Er enthält lokale Variablen und Zwischenergebnisse und ist an Methodenaufrufen und -rückgaben beteiligt. Jeder Thread hat einen privaten JVM-Stack, der zur gleichen Zeit wie der Thread erstellt wird. Jedes Mal, wenn eine Methode aufgerufen wird, wird ein neuer Frame erstellt. Ein Frame wird zerstört, wenn sein Methodenaufruf abgeschlossen ist.

    Das Programmzählerregister enthält die Adresse des Befehls der virtuellen Java-Maschine, der gerade ausgeführt wird.

    Der Native Method Stack enthält alle nativen Methoden, die in der Anwendung verwendet werden.

  13. Warum ist Mehrfachvererbung in Java nicht erlaubt?

    Sie wäre wirklich kompliziert. Stell dir einmal drei Klassen A, B und C vor, wobei C von A und B erbt. Nun nehmen wir an, die Klassen A und B haben dieselbe Methode und du rufst sie von einem Objekt der Unterklasse aus auf... Welche wird dann aufgerufen? Die von A oder die von B? Das ist nicht klar definiert.

    Wenn du versuchst, zwei Klassen zu vererben, generiert Java einen Kompilierzeitfehler.

  14. Können wir die main()-Methode überladen?

    Sicher, wir können viele main-Methoden in einem Java-Programm haben, indem wir die Methodenüberladung verwenden. Probiere es aus!

  15. Können wir einen Konstruktor als final deklarieren?

    Nein. Ein Konstruktor kann nicht als final deklariert werden, weil er nicht vererbt werden kann. Es macht also keinen Sinn, Konstruktoren als final zu deklarieren. Wenn du es trotzdem versuchst, erhältst du einen Kompilierfehler von Java.

  16. Können wir ein Interface als final deklarieren?

    Nein, das können wir nicht. Ein Interface kann nicht final sein, da ein Interface von irgendeiner Klasse entsprechend seiner Definition implementiert werden muss. Daher macht es keinen Sinn, ein Interface final zu machen. Wenn du es trotzdem versuchst, wird der Compiler einen Fehler ausgeben.

  17. Was ist der Unterschied zwischen static binding und dynamic binding?

    binding, das zur Kompilierungszeit vom Compiler aufgelöst werden kann, wird als static oder frühes Binding bezeichnet. Das Binding aller static-, private- und final-Methoden erfolgt zur Kompilierzeit.

    Beim Dynamic binding kann der Compiler nicht bestimmen, welche Methode aufgerufen werden soll. Das Methodenüberschreiben ist ein perfektes Beispiel für dynamic binding. Bei der Methodenüberschreibung haben sowohl Eltern- als auch Kindklassen dieselbe Methode.

    
    Static Binding
    class Cat{  
     private void talk()
    {System.out.println("cat is mewing...");
    }  
      
     public static void main(String args[]){  
      Cat cat=new Cat();  
      cat.talk();  
     }  
    }  
    Dynamic Binding
    class Animal{  
     void talk(){
    System.out.println("animal is talking...");
    }  
    }  
      
    class Cat extends Animal{  
     void talk(){
    System.out.println("cat is talking...");
    }    
     public static void main(String args[]){  
      Animal animal=new Cat();  
      animal.talk();  
     }  
    }
    
  18. Wie erstellt man eine schreibgeschützte Klasse in Java?

    Dazu kann man alle Felder der Klasse private machen. Eine schreibgeschützte Klasse hat nur Getter-Methoden, welche die private-Eigenschaften der Klasse an die main-Methode zurückgeben. Sie können diese Eigenschaften nicht ändern, da es keine Setter gibt.

    
    public class HockeyPlayer{    
    private String team ="Maple leaf";    
    public String getTeam(){    
    return team;    
    }    
    }
    
  19. Wie erstellt man eine lesegeschützte Klasse in Java?

    Auch hier muss man alle Felder der Klasse private machen. Diesmal darf deine lesegeschützte Klasse nur Setter-Methoden und keine Getter haben. Wir können also die Eigenschaften der Klasse nicht lesen.

    
    public class HockeyPlayer{       
    private String team;    
    public void setTeam(String college){    
    this.team = team;    
    }    
    }    
    
  20. Auf jeden try-Block muss ein catch-Block folgen, richtig?

    Nein. Das ist keine Notwendigkeit. Ein try-Block muss nicht unbedingt einen catch-Block haben. Auf den try-Block kann ein catch-Block oder ein finally-Block folgen, oder keins von beidem.

    
    public class Main{  
         public static void main(String []args){  
            try{  
                int variable = 1;   
                System.out.println(variable/0);  
            }  
            finally  
            {  
                System.out.println("the other part of the program...");  
            }  
         }  
    }
    

    Ausgabe:

    
    Exception in thread main java.lang.ArithmeticException:/ by zero
    the other part of the program...
    

    Ein weiteres Beispiel:

    
    class Main {
            public static void main(String[] args) throws IOException {
                try(InputStreamReader inputStreamReader = new InputStreamReader(System.in);
                    BufferedReader reader = new BufferedReader(inputStreamReader)){
                    System.out.println("test");
                }
            }
        }
    

    Ausgabe:

    
    test
    

    P. S. Vor Java 8 konnten Methoden in Interfaces nur abstrakt sein. Ab Java 8 wurde es möglich, Standardmethoden zu definieren und diese direkt in einem Interface zu implementieren
  21. Was ist der Unterschied zwischen den Schlüsselwörtern throw und throws?

    Throws wird zur Deklaration einer Ausnahme verwendet, funktioniert also ähnlich wie ein try-catch-Block. Das Schlüsselwort Throw wird verwendet, um eine Ausnahme explizit aus einer Methode oder einem anderen Codeblock heraus auszulösen.

    Auf Throw folgt eine Instanz der Klasse Exception, aber auf throws folgen die Namen von Ausnahmeklassen.

    Throw wird in einem Methodenrumpf zum Auslösen einer Ausnahme verwendet. Throws wird in einer Methodensignatur verwendet, um die Ausnahmen zu deklarieren, die in den in der Methode vorhandenen Ausdrücken auftreten können.

    Du kannst jeweils eine Ausnahme auslösen (throw), aber du kannst mehrere Ausnahmen behandeln, indem du sie mit dem Schlüsselwort throw deklarierst. Du kannst mehrere Ausnahmen deklarieren, z. B. public void method()throws IOException, SQLException.

Hier haben wir nur einige wenige Fragen und Antworten zu Java betrachtet. Dieser Artikel ist der erste in einer Serie über Interviews. Der nächste (folgt bald) wird sich mit Fragen zu Datenstrukturen befassen.
Dieser Beitrag ist auf Englisch verfügbar.
Read the English version of this article to practice responding to Java interview questions in English. Understanding these concepts in English can only help your employment prospects!
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION