Cracking the coding interview--14.1-14.6

题目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  
        }  
    }  
}  

输出结果:start String:start
          inner finally:finally   

          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

一个例子让你了解Java反射机制  http://blog.csdn.net/ljphhj/article/details/12858767
 

题目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---

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值