`
lixw
  • 浏览: 196078 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

学习臧圩人Java面试题解惑系列总结

阅读更多

     以下内容为学习臧圩人 系列文章的简单总结:

 

1、类的初始化顺序

  • 没有继承关系:静态变量、静态初始化块->变量、初始化块->构造器。
  • 涉及继承关系:父类静态变量、父类静态初始化块->子类静态变量、子类静态初始化块->父类变量、父类初始化块->父类构造器->子类变量、子类初始化块->子类构造器。

注意:顿号隔开的部分初始化顺序与它在代码中的先后位置有关。

 

2、到底创建了几个String对象

 

     Java虚拟机中的字符串池缓存字符串对象,对它的理解主要是对intern()方法的理解:

public native String intern();

     从它的注释中我们可以看到:通过值比较(equals)判断str是否已经存在于字符串缓冲池上,如果是,则返回它的引用,否则新创建一个对象加入缓冲池,再将它的引用返回。

 

3、变量(属性)覆盖

     private修饰的属性和方法,不会被子类继承,子类的同名属性是对父类相应属性的隐藏,而子类的同名方法是对父类相应方法的覆盖。所以对于:

ParentClass p = SubClass();

     访问的是父类被覆盖的属性和子类覆盖后的方法。

     对于静态属性和静态方法,推荐使用类名来访问,如果利用对象来访问,决定于这个对象的类型(上面规则的特例)。

 

4、final, finally, finalize的区别

     final可以修饰变量(基本类型和对象)、方法参数、方法和类。

     修饰基本类型,表示基本类型的值不可变,修饰对象,表示引用不可变,但指向的对象属性可以发生改变。final修饰变量和方法参数,表示只可以被赋值一次(JVM的默认值除外)。final修饰的变量具有更高效率,推荐使用。

     final修饰方法,表示该方法不可以被重写,但能够被子类继承。

     final修饰的类不能够被继承,它的所有方法被当作final的来处理,但它的属性可以被修改。

 

     finally总会早于return, continue, break执行。

臧圩人 写道
finalize()方法是在GC清理它所从属的对象时被调用的,如果执行它的过程中抛出了无法捕获的异常(uncaught exception),GC将终止对改对象的清理,并且该异常会被忽略;直到下一次GC开始清理这个对象时,它的finalize()会被再次调用。

     并且finally内部的return 结果会覆盖之前执行return的结果。

 

5、传了值还是传了引用     

臧圩人 写道
  • 基本类型和基本类型变量被当作参数传递给方法时,是值传递。在方法实体中,无法给原变量重新赋值,也无法改变它的值。
  • 对象和引用型变量被当作参数传递给方法时,在方法实体中,无法给原变量重新赋值,但是可以改变它所指向对象的属性。

 

    来自《The Java Programming Language》2.6.5. Parameter Values一节中的这段话说明了一切:

原文: All parameters to methods are passed "by value." In other words, values of parameter variables in a method are copies of the values the invoker specified as arguments.。。。。。You should note that when the parameter is an object reference, it is the object reference not the object itself that is passed "by value." Thus, you can change which object a parameter refers to inside the method without affecting the reference that was passed. But if you change any fields of the object or invoke methods that change the object's state, the object is changed for every part of the program that holds a reference to it.
翻译: 所有方法的参数都是“值传递”。换句话说,方法参数变量的值作为调用者参数的拷贝……你需要注意:当参数是一个对象引用时,它是作为值传递的对象的引用而非对象本身。所以,你可以在方法内修改引用指向哪个对象但并不会影响传递过来的引用。但是如果你修改对象的任意字段或者调用方法修改对象的状态,在所有持有对象引用的程序部分对象都会发生改变。

 

6、字符串(String)杂谈

     在GBK编码方式下,一个汉字占2个byte,一个英文字母占一个byte。在Java中一个char类型占2个byte。所以char同时可以表示中文汉字和英文字母。

     java.lang.StringBuffer提供了使用的方法反转字符串:

public StringBuffer reverse()

     java.lang.StringBuilder也提供了与StringBuffer类似的方法,只不过StringBuilder的效率更高,但是它缺少StringBuffer的同步。

 

7、日期和时间的处理

 

 

8、聊聊基本类型

臧圩人 写道
byte、char、short、int四种基本类型以及它们的包装类(需要Java5.0/1.5以上版本支持)都可以用于switch语句。

     int型的值(不是int型的变量)可以赋值给所有数值类型的变量,包括char:

臧圩人 写道
public class Test {
   public static void main(String[] args) {
      byte b = (int) 1;
      short s = (int) 1;
      int i = (int) 1;
      long l = (int) 1;
      float f = (int) 1;
      double d = (int) 1;
      char c = (int) 1;
   }
} 
 

 

9、继承、多态、重载和重写

臧圩人 写道
      将一个方法调用同这个方法所属的主体(也就是对象或类)关联起来叫做绑定,分前期绑定和后期绑定两种。下面解释一下它们的定义:
      1. 前期绑定:在程序运行之前进行绑定,由编译器和连接程序实现,又叫做静态绑定。比如static方法和final方法,注意,这里也包括private方法,因为它是隐式final的。
      2. 后期绑定:在运行时根据对象的类型进行绑定,由方法调用机制实现,因此又叫做动态绑定,或者运行时绑定。除了前期绑定外的所有方法都属于后期绑定。

      多态就是在后期绑定这种机制上实现的。

 

10、话说多线程

臧圩人 写道
Lock是一个接口,它位于Java 5.0新增的java.utils.concurrent包的子包locks中。concurrent包及其子包中的类都是用来处理多线程编程的。实现 Lock接口的类具有与synchronized关键字同样的功能,但是它更加强大一些。 java.utils.concurrent.locks.ReentrantLock是较常用的实现了Lock接口的类。下面是 ReentrantLock类的一个应用实例:
private Lock lock = new ReentrantLock();
   public void testLock() {
      // 锁定对象
      lock.lock();
      try {
         // do something
      } finally {
         // 释放对对象的锁定
         lock.unlock();
      }
}
lock()方法用于锁定对象,unlock()方法用于释放对对象的锁定,他们都是在Lock接口中定义的方法。位于这两个方法之间的代码在被执行时,效果等同于被放在synchronized同步块中。一般用法是将需要在lock()和unlock()方法之间执行的代码放在try{}块中,并且在finally{}块中调用unlock()方法,这样就可以保证即使在执行代码抛出异常的情况下,对象的锁也总是会被释放,否则的话就会为死锁的产生增加可能。

    自定义ThreadPool的思路,以及java.util.concurrent包提供的并发框架,更加详细可参考【这里

 

11、这些运算符你是否还记得?

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics