Cracking the coding interview--14.1-14.6 - Java
inner finally:finally
In terms of inheritance, what is the effect of keeping a constructor private?
译文:
在继承方面,保持一个构造函数私有的作用是什么?
解答14.1
使构造函数私有可以使类只供内部使用,只被调用一次,生成的实例是单一的,单例模式就是一个很好的例子。
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的异常体系
try-catch-finally句子的规律:
1、finally语句块的代码是必定会执行的,而catch语句块的代码只有发生异常时才能执行
2、方法执行碗try中的return之后不会终止,会继续执行catch(try中抛出异常时)、finally块
3、方法必须确保返回值,且该值唯一。
4、return语句的优先级是finally最大,且try、catch两者之一的return会被执行,为保证第3条原则,返回优先级最大的值。
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 } } }输出结果:start String:start
inner finally:finally
returnString:finally
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(){} 代表此方法不能被重写
2、finally关键字用在异常处理中,用于处理异常后的清理工作,实际中一般用于关闭文件流,释放资源等操作。
3、finalize方法,为Object基类自带方法,在实际中还没用上,在垃圾回收之前由这个方法进行清理工作,重写Object的这个方法自定义整理工作。
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是共享的。
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反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
题目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()方法总数将都会累加在这个静态变量中。
Cracking the coding interview--14.1-14.6 - Java乍一看,这似乎工作。然而,如果我们的多个实例map呢?如何计算每个地图对象的总数吗?
这是最简单的解决方案定义静态计算变量。静态变量只被创建一次,多个map调用的get(),put()方法总数将都会累加在这个静态变量中。