java 面试问题-- Wie man die Java-Kenntnisse von Bewerbern überprüft
今天在网上看到一篇java面试问题,是从面试官的角度来写的,觉得很不错,发来给大家看看Wie man die Java-Kenntnisse von Bewerbern überprüft
Ich unterteile die Fragen in drei Schwierigkeitsstufen: “A” bedeutet ziemlich schwierig, eher nur für Experten oder “Freaks”, “C” bedeutet: muss man wissen, ansonsten sollte man doch lieber Visual Basic programmieren…
Design, Interfaces
Ein wichtiges Hilfsmittel für das objekt-orientierte Design (und damit die Grundlage für sinnvolle Softwareentwicklung mit Java) sind Interfaces. Also frage ich:
Was sind Interfaces? Wozu verwendet man sie?
Verwendet um Schnittstellen zwischen Modulen welcher Grössenordnung auch immer zu definieren. Enthalten public abstract Methoden, eventuell globale Konstanten (public static final) und eingebettete Typen.
Und man kann dann auch genauer nachhaken, welche Schlüsselworte denn für die Methoden und Felder, die innerhalb einer Interface-Definition verwendet werden, angewendet werden können. Man fragt dann noch, ob man diese Schlüsselworte auch (teilweise) weglassen kann und was das zu bedeuten hat.
public, static, final können weggelassen werden, dann werden sie vom Compiler eingefügt.
Raffinierter ist die Frage: welche “Dinge” können in einer Interface-Definition enthalten sein? Also Methoden und…?
Die meisten vergessen hier, dass auch eingebettete Typen in einer Interface-Definition verwendet werden können. Man kann also etwa eine Klasse in einem Interface definieren. Diese ist dann automatisch eine static Klasse, auch wenn man nicht static dazu schreibt; damit ist dies eine “nested”, aber keine “inner” Klasse.
Nested classes
Damit ist man dann auch schon beim nächsten Thema: was ist der Unterschied zwischen eingebetteten und inneren Klassen?
Erste sind mit static definiert, zweitere ohne und benötigen eine Instanz der äußeren Klasse.
Hier sind dann Beispiele interessant wie:
Aussen.Innen in = new Aussen().new Innen();
Ist so etwas von der Syntax her richtig oder nicht?
Ja, ist es, allerdings ist das schon sehr fortgeschrittenes Java, das mindestens 99% der Bewerber nicht kennt.
Was man bei “inneren” Klassen schon wissen sollte, ist wie man anonyme innere Klassen anlegt, was man damit tut, wie man normale eingebettete Klassen anlegt und ob das eigentlich Sinn macht.
Runnable r = new Runnable(){ public void run() { /* whatever */ } };
class A { class B {…} … }
class A { static class B {…} … }
Static nested classes sollten nur sehr spärlich eingesetzt werden. Sie sind ganz normale Top-Levelklassen, bieten also keine spezielle Verknüpfung zur einschließenden Klasse (außer über den Namen).
Exceptions, Assertions
Wichtig für die Qualitätssicherung ist der richtige Umgang mit Exceptions und Assertions. Einige mögliche Fragen zu diesem Gebiet:
Was sind checked und was sind unchecked Exceptions? Wo verwendet man checked und wo unchecked Exceptions? Das ist auch eine nette Frage, um herauszufinden, ob der Bewerber Beiträge in Newsgruppen liest oder auf entsprechenden Java-Webseiten, da diese Frage schon recht alt und heiß umstritten ist.
unchecked: RuntimeException und ihre Subtypen, müssen nicht in der throws-Klausel stehen.
Was ist der Unterschied zwischen Exception, Throwable und Error?
Throwable ist der Supertyp, Exception und Error sind jeweils Subklassen von Throwable. Error entspricht Fehlern, die man üblicherweise nicht mehr abfangen kann, Exceptions entspricht Fehlern, die man abfangen sollte. Methoden sollten nie so deklariert sein, dass sie Throwable werfen, sondern immer nur die Exception, die maximal auftreten kann (also Exception im allgemeinsten Fall). Erstaunlicherweise gibt es tatsächlich Bibliotheken (wahrscheinlich von Java-Fakern entwickelt), deren Methoden so deklariert sind, dass sie Throwable werfen.
Wann verwendet man Exceptions und wann Assertions?
In Java schaltet man mit -ea die Assertions ein. Üblicherweise sollten Assertions nur während der Entwicklung aktiv sein, so dass die Entwickler frühzeitig Probleme erkennen. Dieser Gebrauch unterscheidet sich eventuell von dem in anderen Programmiersprachen.
Assertions entsprechen auch einer zusätzlichen Dokumentation. So können am Start einer Methode etwa diejenigen Methodenargumente mit assert überprüft werden, von denen man ausgeht, dass sie immer bestimmte Werte haben. Das macht oft bei private Methoden Sinn. Bei public Methoden hingegen sollten die Methodenargumente über normale if Statements etc überprüft werden und dann entsprechend reagiert werden (ignorieren, Rückgabewert, Exceptions):
public foo( String s ) {
if ( s == null )
throw new IllegalArgumentException(
"Argument s is null." );
gee( s );
}
private void gee( String s ) {
assert s != null;
...
}
Man kann asserts an vielen Stellen verwenden: Am Anfang der Methode um zu definieren und zu dokumentieren, wie der Zustand beim Methodenaufruf sein muss. Am Ende der Methode um den Zustand nach dem Methodenaufruf zu definieren. Innerhalb einer Methode um Zwischenergebnisse zu dokumentieren.
Wie aktiviert man Assertions im Tomcat?
Ganz normal:-) Man muss nur -ea im Startscript angeben.
Threads
Thread-Programmierung ist ein heikles Thema. Die meisten Java-Entwickler, die hauptsächlich Webapplikationen entwickeln, haben nichts oder nur sehr wenig mit Threads zu tun. Interessante Fragen wären nun nicht, nur was Threads eigentlich sind und was man damit tut, sondern etwa:
Was ist ThreadLocal und wozu verwendet man es?
Map pro Thread.
Wie ist bei Verwendung von ThreadLocal in Webapplikationen (etwa in Tomcat) zu beachten?
Werte in ThreadLocal nur pro Requestabarbeitung, die in einem bestimmten Thread erfolgt, verwenden.
Was bietet die neue Thread-Bibliothek in Java 5?
Hier reichen einige Beispiele prinzipieller Natur, wobei nicht die genauen Namen der Klassen gewusst werden müssen.
Collection Library
Auch das Thema der Collection Library ist ergiebig. Man kann etwa fragen, was der Bewerber eher benutzt um Variablen zu deklarieren: Hashtable, Map, oder HashMap oder etwas anderes? Und was ist denn der Unterschied zwischen all diesen Dingen? Wie hängen ein HashSet und eine HashMap zusammen?
Üblicherweise verwendet man Interfaces für die Deklaration der Variablen, also etwa:
Map<String,Person> list
= new HashMap<String,Person>();
Hashtable wird kaum noch verwendet. Sie entspricht einer synchronisierten HashMap.
Ein HashSet ist als HashMap definiert mit null als Werten und den Einträgen des Sets als Schlüssel.
Wie sortiert man einen Array? Wie wandelt man einen Array in eine Liste um und wie eine Liste in einen Array?
Collections.sort( array, comparator );
List<String> list = Arrays.asList(array);
array = list.toArray( new String[ 0 ] );
javadoc
Eine Basisfrage ist, wie javadoc funktioniert, bzw. welche Formatierungen und Kommandos man in einem javadoc-Kommentar verwenden kann.
Mit /** den Kommentar beginnen. @param, @return, @author, @see, <br>, <b> etc…
Annotations
Weiters ist noch interessant, ob der Bewerber weiß, was Annotations sind und wie man sie verwenden kann.
Welche zwei Hauptarten von Annotations gibt es (in bezug darauf, wann die Annotations aktiv sind) und wie kann man aus Annotations z.B. Textdateien erzeugen?
Annotations, die zur Runtime abgefragt werden können, und Annotations, die nur im Source Code vorhanden sind. Die Annotations, die im Bytecode vorhanden sind, haben zur Zeit keine Bedeutung in der Praxis.
Mit dem Tool apt kann man aus Source Code-Annotations Textdateien erzeugen.
Welche vordefinierten Annotations verwendet man üblicherweise recht häufig?
@Override
@SuppressWarnings( “deprecated” )
Enumerations
Was sind Enumerations (enum) in Java 5 und wozu und wie verwendet man sie?
Aufzählungstypen. Ersetzen die berühmten int-Konstanten… Können in switch-Statements verwendet werden. Können keine Subtypen sein außer von Enum. Können Felder haben, die ihre Werte im Constructor zugewiesen bekommen.
Generics
Ein umfangreiches Gebiet sind die generischen Typen, die es in Java 5 (und später) gibt. Hier kann man relativ leicht Fragen stellen, die auch der erfahrenste Entwickler nicht immer richtig beantworten kann, also muss man vorsichtig sein und nur allgemeine oder praxisbezogene Fragen stellen wie etwa:
Wofür beispielsweise setzt man generische Typen / generics ein?
Bei Collections, damit diese einfacher und sicherer verwendet werden können.
Was bedeutet “T” bei einer Klasse und was bei einer Methode?
T ist ein formaler Typparameter. Bei einer Methode bezieht er sich nur auf die Methode, kann also nur innerhalb der Methode verwendet werden. Die Methode kann nur aufgerufen werden, wenn man ein entsprechendes Typ-Argument für T angibt. Bei einer Klasse bezieht sich T auf die gesamte Klassendefinition, also u.a. auf alle Methoden. Eine Instanz der Klasse kann nur angelegt werden, wenn man ein entsprechendes Typ-Argument für T angibt.
Was ist type erasure?
Parametrisierte Typen haben keine Runtime-Information darüber, durch welchen konkreten Typ der Typparameter ersetzt worden ist. Also List<String> list = new ArrayList<String>() erzeugt eine Liste, in der nirgends die zur Runtime verfügbare Information enthalten ist, dass nur Strings in dieser Liste abgespeichert werden dürfen.
Wieso kann man nicht new T[ 3 ] sagen?
Aufgrund von type erasure wäre es dann möglich, einem Array von einem bestimmten Typ Elemente eines anderen Typs zuzuweisen.
/* Die folgende Zeile kompiliert nicht,
aber wenn es ginge: */
List<Integer>[] listArray = new ArrayList<Integer>[ 23 ];
Object[] objects = listArray;
// wäre die folgende Zeile dann möglich:
objects[ 0 ] = new ArrayList<String>();
// und man hätte einen String-Liste als Element
// eines Arrays von Integer-Listen
Welche Typen können keine Typparameter haben?
Enumerations, Exceptions, anonyme innere Klassen.
Ist List<Object> ein Supertyp von List<String>?
Nein. Siehe type erasure…
Was bedeutet List<?> und was List<? super Person>?
List<?> heißt, dass der Typparameter undefiniert ist. Man kann also einen belibigen Typparameter verwenden. Bei List<? super Person> muss der Typparameter ein Supertyp von Person sein.
Worauf ist bei generischen Typen in bezug auf statische Felder und Methoden zu achten?
In statischen Elementen sind die Typparameter nicht verfügbar.
Abschluss
Und noch eine kleine und leichte Frage zum Abschluss. Mit welcher Klasse sortiert man Strings richtig, also länder- und sprachenspezifisch?
Collator. getInstance( locale ). compare…
http://www.agila.info/2008/03/03/java-kenntnisse-von-bewerbern/
[ 本帖最后由 红酒蛋糕 于 2008-6-2 14:42 编辑 ] 大家也来说说,面试中遇到哪些专业问题。 java 和c++的比较 这要应聘什么职位才要问的这么细啊 you can find all the answers in "thinking in java" 问下红酒MM, 是INFO专业的吗?今年INFO就业形势怎么样呢 原帖由 lucily 于 2008-6-17 01:02 发表 http://www.dolc.de/forum/images/common/back.gif
问下红酒MM, 是INFO专业的吗?今年INFO就业形势怎么样呢
我是学info的,info就业应该来说还可以吧。 有没有类似的C++的面试问题啊?
页:
[1]