题目14.1
原文:
In terms of inheritance, what is the effect of keeping a constructor private?
译文:
在继承方面,保持一个构造函数私有的作用是什么?
解答14.1
使构造函数私有可以使类只供内部使用,只被调用一次,生成的实例是单一的,单例模式就是一个很好的例子。
class Singleton { private static Singleton instance; //私有化构造函数 private Singleton() {} public static synchronized Singleton getInstance() { if(instance == null) { instance = new Singleton(); } return instance; } }
题目14.2
原文:
In Java, does the finally block gets executed if we insert a return statement inside the try block of a try-catch-finally?
译文:
在Java中,如果我们在try语句try-catch-finally插入一个返回语句,finally块还会执行么?
解答14.2
方法执行到return语句便会返回结果但不会终止,特例就是Java的异常体系,例子如下:
class ExceptionTest{ @SuppressWarnings("finally") public String test(){ String returnStr ="start"; try { System.out.println("start String:"+returnStr); returnStr="try innner"; throw new Exception("inner Exception"); } catch (Exception e) { returnStr ="catch inner"; return returnStr; }finally{ returnStr = "finally"; System.out.println("inner finally:"+returnStr); return returnStr; } } public static void main(String[] args) { ExceptionTest exceptionTest = new ExceptionTest(); try { String test= exceptionTest.test(); Thread.sleep(300); System.out.println("returnString:"+test); } catch (InterruptedException e) { // TODO: handle exception } } }
returnString:finally
try-catch-finally句子的规律:
1、finally语句块的代码是必定会执行的,而catch语句块的代码只有发生异常时才能执行
2、方法执行碗try中的return之后不会终止,会继续执行catch(try中抛出异常时)、finally块
3、方法必须确保返回值,且该值唯一。
4、return语句的优先级是finally最大,且try、catch两者之一的return会被执行,为保证第3条原则,返回优先级最大的值。
题目14.3
原文:
What is the difference between final, finally, and finalize?
译文:
怎样区分final、finally和finalize?
解答14.3
1、final这个关键字在Java中代表不可改变的,可用来修饰类,方法,变量。
对class来说,用法如:final class A{}代表类A为终极类,不能被继承,也就没有子类之说与接口实现者之说。
对method来说,用法如:public final void test(){} 代表此方法不能被重写。
对argument来说,先看看这个测试类:
1 |
public class Test { |
2 |
int i = 1 ; |
3 |
final Test t = new Test(); // Test对象引用变量t不能再指向其他Test对象。但可以通过t来改变此对象中的非常量属性值。 |
4 |
public final void test(){ |
5 |
final int i = 1 ; //final修饰的变量必须在声明时赋值,且不能在改变。 |
6 |
t.i++; |
7 |
} |
8 |
} |
2、finally关键字用在异常处理中,用于处理异常后的清理工作,实际中一般用于关闭文件流,释放资源等操作。
01 |
System.out.println( "----game start----" ); |
02 |
try |
03 |
{ |
04 |
System.out.println( "----try----" ); |
05 |
return ; |
06 |
} catch (NullPointerException e){ |
07 |
System.out.println( "----catch----" ); |
08 |
} finally { |
09 |
System.out.println( "----finally----" ); |
10 |
} |
11 |
System.out.println( "----game over----" ); |
打印结果:
1 |
----game start---- |
2 |
---- try ---- |
3 |
---- finally ---- |
3、finalize方法,为Object基类自带方法,在实际中还没用上,在垃圾回收之前由这个方法进行清理工作,重写Object的这个方法自定义整理工作。
01 |
public class Test { |
02 |
public static void main(String[] args) { |
03 |
// TODO Auto-generated method stub |
04 |
for ( int i= 0 ;i< 6 ;i++){ |
05 |
System.gc(); |
06 |
Test t = new Test(); |
07 |
} |
08 |
System.gc(); // 若注释此语句,则只打印0-4,这就是Java垃圾回收机制的一个简单验证。 |
09 |
} |
10 |
11 |
static int count; |
12 |
13 |
protected void finalize() throws Throwable { |
14 |
// TODO Auto-generated method stub |
15 |
super .finalize(); |
16 |
System.out.println( "-----------finalize----------" +count++); |
17 |
} |
18 |
} |
打印如下:
1 |
-----------finalize---------- 0 |
2 |
-----------finalize---------- 1 |
3 |
-----------finalize---------- 2 |
4 |
-----------finalize---------- 3 |
5 |
-----------finalize---------- 4 |
6 |
-----------finalize---------- 5 // |
原文:http://my.oschina.net/thinkerfan/blog/189688
题目14.4
原文:
Explain the difference between templates in C++ and generics in Java.
译文:
解释C++与Java的泛型模板的区别。
解答14.4
C++与Java的泛型模板有以下几点区别:
1.C++的类和函数能够模板化;Java的类和方法能泛型。(两者差不多的)
2.C++模板参数可以是任何类型;Java只能是引用类型,不能是基本类型。不过有自动装箱和拆箱,使用Byte等也很方便。
3.C++中,对于各个参数,类和函数是分别编译的;Java中,都编译为一个版本,对于所有类型都能工作。
4.C++运行时,不同类型参数的类的对象是不同的类型;Java有所谓的擦除,运行时不同类型参数的类的对象是同一类型。
5.C++中实现源代码必须include才能使用;Java不同机制。
6.C++不同类型参数的类中static量不是共享的;Java是共享的。
题目14.5
原文:
Explain what object reflection is in Java and why it is useful.
译文:
解释Java中对象反射机制是什么,为什么它有用?
解答14.5
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
详细:Java反射——Class对象:http://www.cnblogs.com/penghongwei/p/3300047.html
题目14.6
原文:
Suppose you are using a map in your program, how would you count the number of times the program calls the put() and get() functions?
译文:
假如你正在程序中使用map类,你怎么样计算程序中调用put()和get()函数的次数?
解答14.6
一个简单的解决方法是当调用get()和put()方法的同时,进行计数。我们也可以做到这一点通过扩展现有的map库和重写get()和put()方法。
乍一看,这似乎工作。然而,如果我们的多个实例map呢?如何计算每个地图对象的总数吗?
这是最简单的解决方案定义静态计算变量。静态变量只被创建一次,多个map调用的get(),put()方法总数将都会累加在这个静态变量中。
---EOF---