1 f1 G- K) \. g9 @3 Q: Z( o 断言是一个包含布尔表达式的语句,在执行这个语句时假定该表达式为 true。如果表达式计算为 false,那么系统会报告一个 AssertionError。它用于调试目的: ! Z2 v; R) X w9 l4 _
6 L- w# c. M$ o8 w- Rassert(a > 0); // throws an AssertionError if a <= 0 : n$ G: B$ _0 _6 l' K* f( O7 r7 z# M5 B5 x3 O% k; J: ^
断言可以有两种形式: 7 |$ O/ k8 C+ t% o
* A2 C/ D0 J/ C assert Expression1 ; * X' j" \% Q! Y5 `
assert Expression1 : Expression2 ; * C$ @+ g" ?$ v
! M; E2 p7 J3 v! M
Expression1 应该总是产生一个布尔值。 - b. k+ |7 H- l. _ Z9 v7 `
Expression2 可以是得出一个值的任意表达式。这个值用于生成显示更多调试信息的 String 消息。 7 Z/ o6 F, A) Z/ X% Y: I
断言在默认情况下是禁用的。要在编译时启用断言,需要使用 source 1.4 标记: & Y6 q; M* y( e0 P% O. G. `# ^* H7 Q7 L1 J$ N
javac -source 1.4 Test.java 8 }" r. a' Y$ T2 [3 @9 I/ k+ q 9 n3 _3 w; X5 b: } 要在运行时启用断言,可使用 -enableassertions 或者 -ea 标记。 ' r7 ~# z p: z2 t8 x8 Z; |9 x
要在运行时选择禁用断言,可使用 -da 或者 -disableassertions 标记。 * b8 e1 {" L2 H) i1 @ 要系统类中启用断言,可使用 -esa 或者 -dsa 标记。还可以在包的基础上启用或者禁用断言。 - ` i! W& ?' M8 H
" c5 A/ ]: B$ n( E 可以在预计正常情况下不会到达的任何位置上放置断言。断言可以用于验证传递给私有方法的参数。不过,断言不应该用于验证传递给公有方法的参数,因为不管是否启用了断言,公有方法都必须检查其参数。不过,既可以在公有方法中,也可以在非公有方法中利用断言测试后置条件。另外,断言不应该以任何方式改变程序的状态。 V9 t; v+ C* [8 b. x2 ?
. w+ B5 _' N7 \, `8 ^6 H
/ Z" P# Z& a3 z
第八,GC是什么? 为什么要有GC? (基础)。 7 _ P& k( j( w) p3 o! x6 l , t. X+ z- e w/ B! }! s; W, q GC是垃圾收集器。Java 程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一: 7 l7 R* q+ H* S: X; r9 B - ?! z& ^4 G' D) y6 v: `- s System.gc() 3 v% e1 `% a4 ^, J Runtime.getRuntime().gc() 2 }1 n1 r! I$ R! x 6 @% _! F% J+ V 第九,String s = new String("xyz");创建了几个String Object? : Y8 d3 t2 Y3 {& u. k; q6 `
" W0 s, O7 v9 Z. I: {! B1 k, z; W
两个对象,一个是“xyx”,一个是指向“xyx”的引用对象s。 7 Y1 p. a3 r& ~
0 s! m8 A+ I! @* C; F) l 第十,Math.round(11.5)等於多少? Math.round(-11.5)等於多少? E) P# d2 H% |! u5 ]! L- i0 u! E
! a) Z& @4 N$ d4 \' R
Math.round(11.5)返回(long)12,Math.round(-11.5)返回(long)-11; 9 z7 d7 {. N1 |" q 5 o+ U9 o. ^9 r/ `& q _ 第十一,short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? ; S5 q k3 w5 b9 \4 S8 c3 k; H: U1 ]. m8 y# M& M' e0 a
short s1 = 1; s1 = s1 + 1;有错,s1是short型,s1+1是int型,不能显式转化为short型。可修改为s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正确。 ( Z, W! H& U; J
" X$ `: V7 [, f0 u" F5 A
第十二,sleep() 和 wait() 有什么区别? 搞线程的最爱 * {& P& e1 u: T5 M, m6 q6 L
0 n* l) c0 \$ ?+ e, g1 s! O4 d
sleep()方法是使线程停止一段时间的方法。在sleep 时间间隔期满后,线程不一定立即恢复执行。这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非(a)“醒来”的线程具有更高的优先级,(b)正在运行的线程因为其它原因而阻塞。 . x4 C1 _8 { e& q3 H) z3 R) h# Z8 ] O- i6 E
wait()是线程交互时,如果线程对一个同步对象x 发出一个wait()调用,该线程会暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到。 8 T* n! @* @( f% {& x0 b+ }" V* n1 f
6 n6 S. k1 }" Z7 V; ?' ^5 b
第十三,Java有没有goto? 1 d' V% ^. Z, m
( i O7 \0 f2 p
Goto?java中的保留字,现在没有在java中使用。 ( a+ d; [5 y3 F O& F 8 A( N) [$ B/ U 第十四,数组有没有length()这个方法? String有没有length()这个方法? " h; c! B+ k7 F- s0 X" m/ }; I- ~2 {% E2 X X; ~6 ^5 i% a
数组没有length()这个方法,有length的属性。 7 m p7 Y7 T, U: R3 ^7 Q3 L String有有length()这个方法。 * `3 ~7 N! E0 ~: k+ A, ~
% k) Y. L5 |& s; r
第十五,Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型? + R) I, R, k4 }& Z$ w" M M
( ^% O/ f0 N1 F0 O 方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。 % M0 A* {! ^1 g
|- B5 j5 o& y) o# I 第十六,Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别? " C, }/ m) J; e4 ` 8 [9 W1 B _7 W7 K& g9 r& I" b Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。 ! t0 B6 Z0 k: R! N% }8 n% B# g/ t! E* T
- a! s! ?1 H$ O( X, k equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。 1 @0 w0 h+ w! T4 U+ N8 F/ S
7 x6 O" z5 S' U 第十七,给我一个你最常见到的runtime exception。 " c: O! O* W- w2 Q O* g1 }& P1 p. C: m/ I* n& f
ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, 6 B7 t9 x2 F f+ m
CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException, - h: @" g1 M! G, ^3 ^DOMException, EmptyStackException, IllegalArgumentException, IllegalMonitorStateException, # }6 h7 k- h: J8 A, l3 |+ D2 X2 w6 e
IllegalPathStateException, IllegalStateException, ( U# y! V$ r+ n2 DImagingOpException, $ {6 E2 l$ ]/ D/ _* h/ T+ [. qIndexOutOfBoundsException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, $ |% ^, u9 T% @ d
NullPointerException, ProfileDataException, ProviderException, - h# C6 Y2 F5 l( y/ t& V RasterFormatException, SecurityException, SystemException, 1 N; b( X: |+ {8 R8 g
UndeclaredThrowableException, 9 D7 N# J" G+ o" L M
UnmodifiableSetException, UnsupportedOperationException - Y# y- G3 J L( h& e : \8 H, h" j6 W, c9 m. G2 d* c# z+ C 第十八,error和exception有什么区别? ( U: ]% D8 d- u8 h 7 j, Q0 n7 u( _; Y. ~ error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。 % p; e Y7 M& U, h : }2 Q$ y2 V9 B# w- A! _ V exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。 : B+ Q& M! a7 i" K/ W+ h 3 W- b+ h. `8 W7 \' M! h% t% F6 Z+ Q
第十九,List, Set, Map是否继承自Collection接口? ( {9 x; q7 n& _; g& Z- ^: d0 S4 ]+ ^0 t! e
List,Set是 ' g6 f. f* E: g, E: z2 [ V) n, ~
1 n+ l1 c2 \( |
Map不是 / r! h( o4 A) x& J7 x* B
, h' z- c0 R. b0 O! X
第二十,abstract class和interface有什么区别? * t( J2 B* e0 I# \
9 T4 R6 k% o, [6 v* ^) y5 X 声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。 " l# ^/ P" V, x, @ Z0 l& A 4 s% P$ X% F' T8 R 接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。 7 O* ]; Q# S- Z' k1 A; n " P9 W) f8 W' ^* ?* W7 h0 H6 r 第二十一,abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized? ; N$ Z5 F% a* C, u4 f" D2 w! B9 M
8 S. b9 a' w$ R ~% ?8 Z T
都不能 ' B8 t7 m3 h0 C, N0 i% p! a
8 m! w- Q9 _! r0 M7 v4 o" w9 }
第二十二,接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)? 7 I. L8 ]- J+ ]3 v& }9 L; i% } : F0 v! M3 J/ B! ? 接口可以继承接口。抽象类可以实现(implements)接口,抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数。 H& T8 T0 H4 d% r/ f; o; X. T& @, b) Q6 K, C) W9 |4 d# W
第二十三,启动一个线程是用run()还是start()? 4 q7 y% u! n- G5 ]% K) I
+ Y) M7 `' K* s. k+ t! w" W o9 H 启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。 : ~( W, {8 F# Z& c) @1 `4 G ( J" v" S$ ^. {& b8 H& [/ T2 B( y3 s( p1 Z0 \# D' Q$ {
0 Y# K! Y0 w' o! @ g8 z* q+ n) X# B 第二十四,构造器Constructor是否可被override? . Y% B; [3 p; h- Y9 q; e2 w0 f h: C8 G* I2 t' }8 Q8 S3 E
构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading。 , J" f! m q7 }5 Z6 a ; T" s% n+ q2 ?/ ], E 第二十五,是否可以继承String类? " C* B' d' d5 G% p* z; w) v
# T: ^1 O: L7 [6 }) n% ] String类是final类故不可以继承。 4 J7 g' ^7 z3 t& Y. b7 Y7 n% w% x
第二十六,当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? ! I: M7 c. c- f% A6 Z; G( _7 V / a1 U3 ?4 p1 r9 |% l3 z 不能,一个对象的一个synchronized方法只能由一个线程访问。 ; n! ^/ f) @2 B0 F
+ _" ?1 d) H6 B4 u1 f/ v9 P4 d
第二十七,try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? " u+ z8 [8 |$ W9 m+ a) \9 ~
4 Y6 Y. k( {: ?. y
会执行,在return前执行。 1 y1 h8 H; d1 ~- c) c" b9 B
/ D4 H& ~9 J2 _ 第二十八,编程题: 用最有效率的方法算出2乘以8等於几? . v$ N' D6 p$ N. t. ]# N: L6 z% ]5 r( n \5 `! c1 {/ X% d
有C背景的程序员特别喜欢问这种问题。 . g8 n; o5 a/ `8 C @* Q: ? B: J8 L4 h# v( E, d2 c9 S
2 << 3 + V* D+ `# _& a0 u! }, i4 N
2 F( W* \, ^! T 第二十九,两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对? 7 D' i3 W% P4 J3 p r
G$ r |6 I s
不对,有相同的hash code。 ; {8 V3 D' w, X
- b0 }% i0 n) Z3 ]; F7 R9 L
第三十,当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? " q4 K" {8 ?* Y1 ?2 d
; H {* ]$ A. p% o 是值传递。Java 编程语言只由值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。 ; h5 h4 j, z3 T c. J( J. r+ T4 E: E6 t l4 L9 V4 c