Heim  >  Artikel  >  Java  >  Grundlegende Fragen zu Java-Hochfrequenzinterviews

Grundlegende Fragen zu Java-Hochfrequenzinterviews

王林
王林nach vorne
2020-08-26 15:38:172234Durchsuche

Grundlegende Fragen zu Java-Hochfrequenzinterviews

1. Ist es möglich, aus einer statischen Methode heraus einen Aufruf einer nicht statischen Methode durchzuführen?

(Empfohlenes Video-Tutorial: Java-Kurs)

Nein. Da nicht-statische Methoden Objekten zugeordnet sind, muss ein Objekt erstellt werden, bevor Methodenaufrufe für das Objekt durchgeführt werden können. Statische Methoden müssen jedoch beim Aufruf kein Objekt erstellen und können direkt aufgerufen werden. Mit anderen Worten: Wenn eine statische Methode aufgerufen wird, wurde möglicherweise kein Instanzobjekt erstellt. Wenn ein Aufruf einer nicht statischen Methode von einer statischen Methode ausgegeben wird, welchem ​​Objekt ist die nicht statische Methode zugeordnet? Diese Logik kann nicht eingerichtet werden, daher gibt eine statische Methode intern einen Aufruf an eine nicht statische Methode aus.

2. Der Unterschied zwischen Integer und int

int ist einer der 8 primitiven Datentypen, die von Java bereitgestellt werden. Java stellt Wrapper-Klassen für jeden primitiven Typ bereit. Integer ist die von Java bereitgestellte Wrapper-Klasse für int. Der Standardwert von int ist 0, während der Standardwert von Integer null ist. Das heißt, Integer kann den Unterschied zwischen nicht zugewiesenem Wert und Wert 0 unterscheiden, während int die Situation eines nicht zugewiesenen Werts nicht ausdrücken kann.

Zum Beispiel: Wenn Sie den Unterschied zwischen der Nichtteilnahme an der Prüfung und einem Prüfungsergebnis von 0 ausdrücken möchten, können Sie nur Ganzzahl verwenden. In der JSP-Entwicklung ist der Standardwert von Integer null. Wenn also der EL-Ausdruck zur Anzeige im Textfeld verwendet wird, ist der Wert eine leere Zeichenfolge, und der Standardwert von int ist 0, wenn also der EL-Ausdruck verwendet wird Um es im Textfeld anzuzeigen, ist das Ergebnis 0, sodass int nicht als Formulardatentyp der Webebene geeignet ist.

Wenn in Hibernate die OID als Integer-Typ definiert ist, kann Hibernate basierend darauf bestimmen, ob ein Objekt temporär ist. Wenn die OID als int-Typ definiert ist, muss sie auch in der hbm-Zuordnungsdatei festgelegt werden. Das Attribut „Nicht gespeicherter Wert“ ist 0.

Darüber hinaus bietet Integer mehrere ganzzahlbezogene Operationsmethoden, z. B. die Konvertierung einer Zeichenfolge in eine Ganzzahl, und definiert auch Konstanten, die den Maximal- und Minimalwert von Ganzzahlen darstellen.

3. Was ist Math.round(-11.5) gleich?

Die Math-Klasse bietet drei Methoden zum Runden: Decke, Boden, Runde Diese Methoden sind Die Funktionen entsprechen der Bedeutung ihrer englischen Namen.

Zum Beispiel ist die englische Bedeutung von „ceil“ „decke“, diese Methode bedeutet Aufrunden, das Ergebnis von Math.ceil(11.3) ist 12, das Ergebnis von „Math.ceil(-11.3)“ ist –11; die englische Bedeutung von „floor“. ist Boden, Diese Methode bedeutet Abrunden, das Ergebnis von Math.ceil(11.6) ist 11, und das Ergebnis von Math.ceil(-11.6) ist -12; am schwierigsten zu beherrschen ist die Rundungsmethode, die „Rundung“ bedeutet ", und der Algorithmus ist Math.floor(x+0.5), das heißt, addiere 0,5 zur ursprünglichen Zahl und runde dann ab. Daher ist das Ergebnis von Math.round(11.5) 12 und das Ergebnis von Math.round (-11,5) ist -11.

Hier gibt es einige Schreibfehler. Die englische Bedeutung von „floor“ bedeutet, dass das Ergebnis von Math.floor(11.6) 11 ist und das Ergebnis von Math.floor(-11.6) ist.

(Weitere Empfehlungen für verwandte Interviewfragen: Java-Interviewfragen und -antworten)

4 Was ist der Unterschied zwischen Overload und Override? Kann die Overloaded-Methode den Typ des Rückgabewerts ändern?

Overload bedeutet Überladung und Override bedeutet Überschreiben, also Neuschreiben.

Überlastung bedeutet, dass es in derselben Klasse mehrere Methoden mit demselben Namen geben kann, die Parameterlisten dieser Methoden jedoch unterschiedlich sind (dh die Anzahl oder Art der Parameter ist unterschiedlich).

Überschreiben bedeutet, dass die Methode in der Unterklasse denselben Namen und dieselben Parameter wie eine Methode in der übergeordneten Klasse haben kann. Wenn diese Methode über das von der Unterklasse erstellte Instanzobjekt aufgerufen wird, wird die in der Unterklasse definierte Methode aufgerufen Da es genau dieselbe Methode überschreibt, die in der übergeordneten Klasse definiert ist, ist dies auch eine Manifestation von Polymorphismus in der objektorientierten Programmierung. Wenn eine Unterklasse die Methoden der übergeordneten Klasse überschreibt, kann sie nur weniger Ausnahmen auslösen als die übergeordnete Klasse oder Unterausnahmen der von der übergeordneten Klasse ausgelösten Ausnahmen auslösen, da die Unterklasse einige Probleme der übergeordneten Klasse lösen kann und dies nicht kann besser als die Elternklasse. Es gibt mehr Fragen. Die Zugriffsrechte von Unterklassenmethoden können nur größer als die der übergeordneten Klasse sein, nicht kleiner. Wenn die Methode der übergeordneten Klasse vom privaten Typ ist, gibt es in der Unterklasse keine übergeordnete Einschränkung, was dem Hinzufügen einer brandneuen Methode zur Unterklasse entspricht.

Was die Frage betrifft, ob die Overloaded-Methode den Typ des Rückgabewerts ändern kann, hängt es davon ab, was Sie fragen möchten? Dieses Thema ist sehr vage. Wenn die Parameterlisten mehrerer überladener Methoden unterschiedlich sind, können natürlich auch ihre Rückgabetypen unterschiedlich sein. Aber ich denke, die Frage, die Sie stellen möchten, lautet: Wenn die Parameterlisten der beiden Methoden genau gleich sind, können ihre Rückgabewerte unterschiedlich sein, um eine Überladung zu implementieren? Dies ist nicht möglich, um dieses Problem zu veranschaulichen, da wir beim Aufrufen einer Methode manchmal keine Rückgabeergebnisvariable definieren müssen, das heißt, uns ist das Rückgabeergebnis egal.

Wenn wir beispielsweise die Methode „map.remove(key)“ aufrufen, definieren wir normalerweise keine Variable zum Empfangen des Rückgabeergebnisses. Gehen wir zu diesem Zeitpunkt davon aus, dass es zwei Namen und Parameter gibt Listen in der Klasse, die genau gleich sind, haben nur unterschiedliche Rückgabetypen. Java kann nicht bestimmen, welche Methode der Programmierer aufrufen möchte, da es nicht anhand des Rückgabeergebnistyps beurteilen kann.

Override kann als Override übersetzt werden. Von der wörtlichen Bedeutung her bedeutet es, dass es eine Methode abdeckt und sie umschreibt, um verschiedene Funktionen zu erreichen. Die für uns bekannteste Abdeckung ist die Implementierung von Schnittstellenmethoden. Im Allgemeinen werden nur Methoden in der Schnittstelle deklariert, und wenn wir sie implementieren, müssen wir alle von der Schnittstelle deklarierten Methoden implementieren. Zusätzlich zu dieser typischen Verwendung können wir bei der Vererbung auch Methoden in der übergeordneten Klasse in der Unterklasse überschreiben. Beachten Sie beim Überschreiben die folgenden Punkte:

1. Das Flag der überschriebenen Methode muss vollständig mit dem Flag der überschriebenen Methode übereinstimmen.

2 Der Rückgabewert der überschriebenen Methode muss mit dem Flag von übereinstimmen Die überschriebene Methode ist konsistent.

3 Die von der überschriebenen Methode ausgelöste Ausnahme oder ihre Unterklasse darf nicht privat sein. andernfalls wird nur eine neue Methode in ihrer Unterklasse definiert und nicht überschrieben.

Überlastung ist uns möglicherweise bekannt und kann als Überladung übersetzt werden. Dies bedeutet, dass wir einige Methoden mit demselben Namen definieren und diese Methoden durch die Definition verschiedener Eingabeparameter unterscheiden können. Beim erneuten Aufruf wählt die VM den Parameterstil aus geeignete Methode zur Ausführung. Bitte beachten Sie bei der Verwendung von Überladung die folgenden Punkte:

1. Bei Verwendung von Überladung können Sie nur unterschiedliche Parameterstile verwenden. Zum Beispiel unterschiedliche Parametertypen, unterschiedliche Anzahl von Parametern, unterschiedliche Parameterreihenfolge (natürlich müssen mehrere Parametertypen in derselben Methode unterschiedlich sein, zum Beispiel kann es fun(int, float) sein, aber es kann nicht fun(int) sein , int ));

2. Eine Überladung kann nicht durch Zugriffsberechtigungen, Rückgabetypen und ausgelöste Ausnahmen erfolgen.

3 Hat privilegierten Zugriff in der übergeordneten Klasse, kann es in der Unterklasse nicht überladen werden. Wenn es definiert ist, definiert es nur eine neue Methode und erzielt keinen Überladungseffekt.

5. Können abstrakte Klassen Schnittstellen erben? Kann es eine statische Hauptmethode in einer abstrakten Klasse geben?

Schnittstellen können Schnittstellen erben. Abstrakte Klassen können Schnittstellen implementieren und abstrakte Klassen können konkrete Klassen erben. Abstrakte Klassen können statische Hauptmethoden haben. Hinweis: Solange Sie die Natur und Funktion von Schnittstellen und abstrakten Klassen verstehen, sind diese Fragen leicht zu beantworten. Wenn Sie ein Java-Sprachentwickler wären, würden Sie diese Unterstützung leisten? Würdest du das tun? Was ist der Grund? Wenn Sie keinen Grund haben, diese nicht bereitzustellen, lautet die Antwort „Ja“.

Denken Sie daran, dass der einzige Unterschied zwischen abstrakten Klassen und gewöhnlichen Klassen darin besteht, dass keine Instanzobjekte erstellt werden können und abstrakte Methoden zulässig sind.

6. Was ist der Mechanismus zur Implementierung von Polymorphismus in Java?

basiert auf der Tatsache, dass die von der übergeordneten Klasse oder Schnittstelle definierten Referenzvariablen auf das Instanzobjekt der Unterklasse oder einer bestimmten Implementierungsklasse verweisen können und die vom Programm aufgerufene Methode zur Laufzeit dynamisch gebunden ist, was die Methode von ist Das spezifische Instanzobjekt, auf das die Referenzvariable zeigt, dh die Methode des im Speicher ausgeführten Objekts und nicht die im Typ der Referenzvariable definierte Methode.

7. Was ist der Unterschied in der Syntax zwischen abstrakten Klassen und Schnittstellen?

2. Es können gewöhnliche Mitgliedsvariablen in Schnittstellen vorhanden sein.

3 Alle Methoden in Schnittstellen müssen abstrakt sein. abstrakte Methoden. Gewöhnliche Methode.

4. Die Zugriffstypen abstrakter Methoden in abstrakten Klassen können öffentlich, geschützt und sein (Standardtyp, obwohl

unter Eclipse kein Fehler gemeldet wird, sollte dies jedoch nicht funktionieren), abstrakte Methoden in Schnittstellen können jedoch nur öffentlich sein Typ. Und der Standardwert ist der öffentliche abstrakte Typ.

5. Abstrakte Klassen können statische Methoden enthalten, aber Schnittstellen können keine statischen Methoden enthalten.

6 Der Zugriffstyp statischer Mitgliedsvariablen in abstrakten Klassen kann beliebig sein Die definierten Variablen können nur vom finalen Typ publicstatic sein, und der Standardwert ist der finale Typ publicstatic.

7. Eine Klasse kann mehrere Schnittstellen implementieren, aber nur eine abstrakte Klasse erben.

(Empfohlene verwandte Tutorials:

Einführung in Java-Tutorial

)

8. Kann die abstrakte Methode gleichzeitig statisch, nativ und synchronisiert sein?

Die abstrakte Methode kann nicht statisch sein, da abstrakte Methoden es sein müssen Wird von Unterklassen implementiert und statisch hat nichts mit Unterklassen zu tun!

Die native Methode bedeutet, dass die Methode in einer anderen plattformabhängigen Programmiersprache implementiert werden soll. Es gibt kein Problem bei der Implementierung durch eine Unterklasse. Daher kann sie nicht abstrakt sein und nicht mit abstrakter Sprache gemischt werden. Beispielsweise muss sich die FileOutputSteam-Klasse mit der Hardware befassen, und die zugrunde liegende Implementierung verwendet die betriebssystembezogene API-Implementierung. Sie ist beispielsweise in der C-Sprache in Windows implementiert. Daher können Sie Folgendes feststellen: dass die open-Methode von FileOutputStream wie folgt definiert ist:

private native void open(Stringname) throwsFileNotFoundException;

Wenn wir Java verwenden möchten, um eine von anderen geschriebene C-Sprachfunktion aufzurufen, können wir sie nicht direkt aufrufen. Wir müssen ein C schreiben Die Sprachfunktion entspricht den Anforderungen von Java, und unsere C-Sprachfunktionen rufen die C-Sprachfunktionen anderer Personen auf. Da unsere C-Sprachfunktion gemäß den Anforderungen von Java geschrieben ist, kann unsere C-Sprachfunktion mit Java verbunden werden. Die Docking-Methode auf der Java-Seite besteht darin, die unserer C-Funktion entsprechende Methode zu definieren Es muss kein spezifischer Code geschrieben werden, aber er muss vorher als nativ deklariert werden.

Was das Problem der gemeinsamen Verwendung von Synchronisiert und Abstrakt betrifft, halte ich dies nicht für möglich, da ich in meinen mehrjährigen Studien- und Entwicklungsjahren diese Situation noch nie gesehen habe und ich denke, dass Synchronisiert in einer bestimmten Methode verwendet werden sollte. Bedeutung. Darüber hinaus ist dies das Synchronisationssperrobjekt, das für die synchronisierte Synchronisation in der Methode verwendet wird, und es ist unmöglich zu bestimmen, was dies in der abstrakten Methode ist.

9. Kann eine innere Klasse auf Mitglieder ihrer enthaltenden Klasse verweisen? Gibt es Einschränkungen?

Absolut. Wenn es sich nicht um eine statische innere Klasse handelt, gibt es keine Begrenzung!

Wenn Sie eine statische verschachtelte Klasse als Sonderfall einer inneren Klasse behandeln, können Sie in diesem Fall nicht auf die gewöhnlichen Mitgliedsvariablen der äußeren Klasse zugreifen, sondern nur auf die statischen Mitglieder der äußeren Klasse. der folgende Code:

class Outer
{
static int x;
static class Inner
    {
        voidtest()
        {
              syso(x);
        }
    }
}

10. String s = „Hallo“; s = s + „world!“ Hat sich der Inhalt im ursprünglichen String-Objekt geändert?

Nein. Da String als unveränderliche Klasse konzipiert ist, sind alle seine Objekte unveränderliche Objekte. In diesem Code zeigte s ursprünglich auf ein String-Objekt mit dem Inhalt „Hallo“, und dann führten wir eine +-Operation für s aus. Hat sich das Objekt, auf das s zeigt, geändert? Die Antwort ist nein. Zu diesem Zeitpunkt zeigt s nicht mehr auf das Originalobjekt, sondern auf ein anderes String-Objekt mit dem Inhalt „Hallo Welt!“. Das Originalobjekt existiert noch im Speicher, aber die Referenzvariable s zeigt nicht mehr darauf.

Aus der obigen Erklärung können wir leicht eine andere Schlussfolgerung ableiten. Wenn häufig verschiedene oder unvorhergesehene Änderungen an der Zeichenfolge vorgenommen werden, verursacht die Verwendung von String zur Darstellung der Zeichenfolge einen hohen Speicheraufwand. Da das String-Objekt nach seiner Erstellung nicht mehr geändert werden kann, ist ein String-Objekt erforderlich, um jede einzelne Zeichenfolge darzustellen. Zu diesem Zeitpunkt sollten Sie die Verwendung der StringBuffer-Klasse in Betracht ziehen, die Änderungen ermöglicht, anstatt für jede andere Zeichenfolge ein neues Objekt zu generieren. Darüber hinaus ist es sehr einfach, diese beiden Objekttypen zu konvertieren.

Gleichzeitig können wir auch wissen, dass wir nicht jedes Mal einen neuen String erstellen müssen, wenn wir einen String mit demselben Inhalt verwenden möchten. Wenn wir beispielsweise eine String-Referenzvariable mit dem Namen s im Konstruktor initialisieren und als Anfangswert festlegen möchten, sollten wir Folgendes tun:

public class Demo {
private String s;
...
public Demo {
s = "Initial Value";
}
...
}

anstelle von

s = new String("Initial Value");

Letzteres ruft den Konstruktor jedes Mal auf und generiert Neue Objekte weisen eine geringe Leistung und einen hohen Speicheraufwand auf und sind bedeutungslos, da String-Objekte nicht geändert werden können. Daher ist für Strings mit demselben Inhalt nur ein String-Objekt erforderlich, um sie darzustellen. Mit anderen Worten: Wenn Sie den obigen Konstruktor mehrmals aufrufen, um mehrere Objekte zu erstellen, verweisen alle Attribute vom Typ String auf dasselbe Objekt.

Die obige Schlussfolgerung basiert auch auf der Tatsache, dass Java bei String-Konstanten bei gleichem Inhalt davon ausgeht, dass sie dasselbe String-Objekt darstellen. Wenn Sie den Konstruktor mit dem Schlüsselwort new aufrufen, wird immer ein neues Objekt erstellt, unabhängig davon, ob der Inhalt derselbe ist.

Der Grund, warum die String-Klasse als unveränderliche Klasse konzipiert werden sollte, hängt von ihrem Zweck ab. Tatsächlich sind nicht nur String, sondern auch viele Klassen in der Java-Standardklassenbibliothek unveränderlich. Bei der Entwicklung eines Systems müssen wir manchmal unveränderliche Klassen entwerfen, um eine Reihe verwandter Werte zu übergeben, was auch ein Ausdruck objektorientierten Denkens ist. Unveränderliche Klassen haben einige Vorteile, da ihre Objekte beispielsweise schreibgeschützt sind und es keine Probleme beim gleichzeitigen Zugriff mehrerer Threads gibt. Natürlich gibt es auch einige Nachteile. Beispielsweise benötigt jeder unterschiedliche Zustand ein Objekt, um ihn darzustellen, was zu Leistungsproblemen führen kann. Daher bietet die Java-Standardklassenbibliothek auch eine variable Version, StringBuffer.

Das obige ist der detaillierte Inhalt vonGrundlegende Fragen zu Java-Hochfrequenzinterviews. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen