11. Ist es möglich, einen Aufruf einer nicht statischen Methode aus einer statischen Methode heraus durchzuführen?
Nein. Da nicht statische Methoden mit Objekten verknüpft sind, muss ein Objekt erstellt werden, bevor Methodenaufrufe für das Objekt durchgeführt werden können. Beim Aufruf statischer Methoden ist es nicht erforderlich, ein Objekt zu erstellen, sondern können direkt aufgerufen werden. (Empfohlene Studie: Java-Interviewfragen)
Mit anderen Worten: Wenn eine statische Methode aufgerufen wird, wurde möglicherweise kein Instanzobjekt erstellt, wenn eine nicht statische Methode von einer statischen Methode ausgegeben wird Methode: Welchem Objekt ist beim Aufruf einer Methode 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.
12. 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 einer 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 OID als Integer-Typ definiert ist, kann Hibernate anhand dessen, ob sein Wert null ist, bestimmen, ob ein Objekt temporär ist. Wenn OID als int-Typ definiert ist, muss es auch in hbm zugeordnet werden Setzen Sie das Attribut „Nicht gespeicherter Wert“ in der Datei auf 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.
13. Was ist Math.round(11.5) gleich?
Die Math-Klasse stellt drei verwandte Funktionen bereit zu Rundungsmethoden: Decke, Boden, Rund, die Funktionen dieser Methoden entsprechen der Bedeutung ihrer englischen Namen.
Zum Beispiel lautet die englische Bedeutung von „ceil“ und diese Methode bedeutet Aufrunden. Das Ergebnis von Math.ceil(11.3) ist 12 und das Ergebnis von Math.ceil(-11.3) ist -11 ;
Die englische Bedeutung von floor ist „floor“. Das Ergebnis von Math.ceil(-11.6) ist –12 >
Am schwierigsten zu beherrschen ist die Rundungsmethode, die „Rundung“ bedeutet. Der Algorithmus ist Math.floor(x+0,5), was bedeutet, dass zur ursprünglichen Zahl 0,5 addiert und dann abgerundet wird. das Ergebnis von Math.round(11.5) ist 12 , das Ergebnis von Math.round(-11.5) ist -11.14. 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. Überladung 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 ein von der Unterklasse erstelltes Instanzobjekt aufgerufen wird, wird die Definition in der Unterklasse verwendet aufgerufene Methode, die dem Überschreiben genau derselben Methode entspricht, die in der übergeordneten Klasse definiert ist. Dies ist auch eine Manifestation von Polymorphismus in der objektorientierten Programmierung. Wenn eine Unterklasse die Methode der übergeordneten Klasse überschreibt, kann sie nur weniger Ausnahmen als die übergeordnete Klasse oder Unterausnahmen der von der übergeordneten Klasse ausgelösten Ausnahmen auslösen, da die Unterklasse einige davon lösen kann Die Probleme der übergeordneten Klasse können nicht mehr Probleme haben als die übergeordnete Klasse. Die Zugriffsrechte von Unterklassenmethoden können nur größer als die der übergeordneten Klasse sein, nicht weniger. 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?
Diese Frage ist sehr vage. Wenn die Parameterlisten mehrerer Overloaded-Methoden unterschiedlich sind, können ihre Rückgabetypen natürlich unterschiedlich sein. Aber ich denke, die Frage, die Sie stellen möchten, lautet: Wenn die Parameterlisten zweier Methoden genau gleich sind, können ihre Rückgabewerte dann 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 egal Ergebnis zurückgeben. Wenn wir beispielsweise die Methode „map.remove(key)“ aufrufen, definieren wir normalerweise keine Variable, um das Rückgabeergebnis zu erhalten Es gibt zwei Namen in der Klasse und Die Parameterliste der Methode ist genau gleich, aber der Rückgabetyp ist unterschiedlich. Java kann nicht bestimmen, welche Methode der Programmierer aufrufen möchte, da es nicht anhand des Rückgabeergebnistyps beurteilen kann.Override kann als Abdeckung übersetzt werden. In der wörtlichen Bedeutung deckt es eine Methode ab und schreibt sie neu, um verschiedene Funktionen zu erreichen.
Die für uns bekannteste Abdeckung ist die Implementierung von Schnittstellenmethoden. Im Allgemeinen werden nur die 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 Abdecken die folgenden Punkte:
1. Das Flag der überschriebenen Methode muss vollständig mit dem Flag der überschriebenen Methode übereinstimmen.
2 Die Methode muss mit dem Rückgabewert der überschriebenen Methode übereinstimmen. Die von der überschriebenen Methode ausgelöste Ausnahme muss mit der von der überschriebenen Methode ausgelösten Ausnahme übereinstimmen >
4. Die überschriebene Methode darf nicht privat sein, sonst wird in ihrer Unterklasse eine neue Methode definiert, ohne sie zu überschreiben. Überladung ist uns möglicherweise bekannt und kann als Überladung übersetzt werden. Dies bedeutet, dass wir einige Methoden mit demselben Namen definieren, diese Methoden durch die Definition unterschiedlicher Eingabeparameter unterscheiden und dann die VM aufrufen können basierend auf verschiedenen Parameterstilen zur Ausführung ausgewählt werden. 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. Das Überladen kann nicht durch Zugriffsberechtigungen, Rückgabetypen und ausgelöste Ausnahmen erfolgen. 3 >4. Wenn eine Methode in der übergeordneten Klasse über privilegierten Zugriff verfügt, kann sie in der Unterklasse nicht überladen werden. Es wird nur eine neue Methode definiert.
15. 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 Rolle von Schnittstellen und abstrakten Klassen verstehen, sind diese Fragen leicht zu beantworten. Würden Sie als Designer der Java-Sprache solche Unterstützung leisten? Wenn nicht. Wenn ja, gibt es einen 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.
16. Was ist der Mechanismus zur Implementierung von Polymorphismus in Java?Wenn Sie sich auf die von der übergeordneten Klasse oder Schnittstelle definierte Referenzvariable verlassen, können Sie auf das Instanzobjekt der Unterklasse oder einer bestimmten Implementierungsklasse verweisen, und die vom Programm aufgerufene Methode ist zur Laufzeit dynamisch gebunden Die Referenzvariable, auf die verwiesen wird Die Methode des spezifischen Instanzobjekts ist die Methode des im Speicher ausgeführten Objekts und nicht die Methode, die im Typ der Referenzvariablen definiert ist.
17. Was ist der Unterschied in der Syntax zwischen abstrakter Klasse und Schnittstelle?1. Abstrakte Klassen können Konstruktoren haben, Schnittstellen jedoch nicht. 2. In abstrakten Klassen kann es gewöhnliche Mitgliedsvariablen geben, aber in Schnittstellen gibt es keine gewöhnlichen Mitgliedsvariablen.
3 Abstrakte Klassen können nicht abstrakte gewöhnliche Methoden enthalten, und alle Methoden in Schnittstellen muss sein Es ist abstrakt und kann keine nicht-abstrakten gewöhnlichen Methoden haben.
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 sein öffentliche Typen, und der Standardwert ist öffentlicher abstrakter Typ.
5. Abstrakte Klassen können statische Methoden enthalten, Schnittstellen können keine statischen Methoden enthalten.
6 Sowohl abstrakte Klassen als auch Schnittstellen können statische Mitgliedsvariablen enthalten, und statische Mitgliedsvariablen in abstrakten Klassen sind Der Zugriffstyp kann beliebig sein, aber die in der Schnittstelle definierten Variablen können nur vom endgültigen Typ publicstatic sein, und der Standardwert ist der endgültige Typ publicstatic.
7. Eine Klasse kann mehrere Schnittstellen implementieren, aber nur eine abstrakte Klasse erben.
18. Kann die abstrakte Methode gleichzeitig statisch, nativ und synchronisiert sein?Die abstrakte Methode kann nicht statisch sein Unterklassen, und static 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.
Zum Beispiel muss sich die FileOutputSteam-Klasse mit Hardware befassen, und die zugrunde liegende Implementierung verwendet die betriebssystembezogene API-Implementierung. Sie ist beispielsweise in der C-Sprache in Windows implementiert, wenn Sie sich also die Quelle ansehen Im JDK-Code finden Sie die Datei zum Öffnen von FileOutputStream. Die Methode ist wie folgt definiert:
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 eine C-Sprachfunktion gemäß den Anforderungen von Java schreiben, und dann ruft unsere C-Sprachfunktion die einer anderen Person auf C-Sprachfunktion.
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 Für die Methode in Java muss kein spezifischer Code geschrieben werden, sie muss jedoch zuvor als nativ deklariert werden.
Was das Problem der gemeinsamen Verwendung von synchronisiert und abstrakt betrifft, halte ich es nicht für in Ordnung, da ich in meinen mehrjährigen Studien- und Entwicklungsjahren diese Situation noch nie gesehen habe und ich denke, dass synchronisiert in einem verwendet werden sollte spezifisch Es macht nur methodisch Sinn.
Darüber hinaus ist dies das Synchronisationssperrobjekt, das von der synchronisierten Synchronisation für die Methode verwendet wird, und es ist unmöglich zu bestimmen, was dies für die abstrakte Methode ist.
19. 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 statisch 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 , zum Beispiel der folgende Code:
rrree20. String s = "Hello"; s = s + "world!"; String-Objekt hat sich 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 existiert nicht mehr . Zeigen Sie darauf.
Aus der obigen Erklärung können wir leicht eine andere Schlussfolgerung ableiten. Wenn Zeichenfolgen häufig auf verschiedene Weise oder unvorhergesehene Änderungen vorgenommen werden, verursacht die Verwendung von Zeichenfolgen zur Darstellung von Zeichenfolgen viel Speicheraufwand.
Da das String-Objekt nach seiner Erstellung nicht mehr geändert werden kann, wird ein String-Objekt benötigt, 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 Sie nicht jedes Mal einen neuen String erstellen müssen, wenn Sie 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:
class Outer { static int x; static class Inner { voidtest(){ syso(x); } } }
anstelle von
public class Demo { private String s; ... public Demo { s = "Initial Value"; } ... }
Letzteres ruft jedes Mal den Konstruktor auf, um ein neues Objekt zu generieren. Dies hat eine geringe Leistung und einen hohen Speicheraufwand und ist bedeutungslos, da das String-Objekt nicht geändert werden kann. Daher ist für Strings mit demselben Inhalt nur ein String-Objekt erforderlich sie zu vertreten.
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 eine Manifestation objektorientierten Denkens ist.
Unveränderliche Klassen haben einige Vorteile. Da ihre Objekte beispielsweise schreibgeschützt sind, gibt es kein Problem beim gleichzeitigen Zugriff durch mehrere Threads. 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 Java-Interviewfragen (2). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!