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

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、这些运算符你是否还记得?

学习臧圩人Java面试题解惑系列总结相关推荐

  1. 读《臧圩人的Java面试题解惑系列》

    原文:http://zangweiren.javaeye.com/blog/208122 读了臧圩人的Java面试题解惑系列第一章:类的初始化顺序 总结: 1,(静态变量.静态初始化块)>(变量 ...

  2. JAVA面试题解惑系列(十)——话说多线程

    JAVA面试题解惑系列(十)--话说多线程 关键字: java 面试题 多线程 thread 线程池 synchronized 死锁 作者:臧圩人(zangweiren) 网址:http://zang ...

  3. 臧圩人:java面试题解惑系列(一)——类的初始化顺序学习笔记

    1.对于静态变量.静态初始化块.变量.初始化块.构造器,它们的初始化顺序依次是 (静态变量.静态初始化块)>(变量.初始化块)>构造器 2. 父类--静态变量 父类--静态初始化块 子类- ...

  4. JAVA面试题解惑系列(四)——final、finally和finalize的区别

    final.finally和finalize的区别是什么? 这是一道再经典不过的面试题了,我们在各个公司的面试题中几乎都能看到它的身影.final.finally和finalize虽然长得像孪生三兄弟 ...

  5. JAVA面试题解惑系列(八)——聊聊基本类型(内置类型)

    基本类型,或者叫做内置类型,是JAVA中不同于类的特殊类型.它们是我们编程中使用最频繁的类型,因此面试题中也总少不了它们的身影,在这篇文章中我们将从面试中常考的几个方面来回顾一下与基本类型相关的知识. ...

  6. java面试题解惑_JAVA面试题解惑系列(五)——传了值还是传了引用?

    作者:臧圩人(zangweiren) 网址:http://zangweiren.javaeye.com >>>转载请注明出处! < < < JAVA中的传递都是值传 ...

  7. java 百分比相加_2019年Java面试题基础系列228道(5),快看看哪些你还不会?

    2019年Java面试题基础系列228道 Java面试题(一) 第一篇更新1~20题的答案解析 第二篇更新21~50题答案解析 第三篇更新51~95题答案解析 Java面试题(二) 第四篇更新1~20 ...

  8. Java面试题基础系列

    Java面试题基础系列 1.面向对象的特征有哪些方面? 面向对象的特征主要有以下几个方面:抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面.抽象只关注对象有哪些属性和 ...

  9. Java面试题基础系列228道(2),查漏补缺

    上一篇更新1~20题的答案解析 本次更新Java 面试题(一)的21~50题答案 21.描述一下 JVM 加载 class 文件的原理机制? JVM 中类的装载是由类加载器(ClassLoader)和 ...

最新文章

  1. 【开源项目】之智能鞋柜(STM32)
  2. python ctypes实现api测试_Python与C之间的相互调用(Python C API及Python ctypes库)
  3. [译] NSCollectionView 入门教程
  4. bootstrap的td可以增加title样式_3.CSS样式的三种使用方式
  5. python脚本语言采用声音作为手段_LKJ自动化测试脚本定义及生成技术研究
  6. MySQL 主主配置
  7. MeeGo、Ubuntu Touch、Sailfish、Tizen系统历史关系
  8. 软件工程结对编程博客
  9. 学大伟业:学习物理竞赛的学生如何快速掌握所需要的高数知识?
  10. 盗版xp成功验证成正版,享受正版增值服务!
  11. 微信小程序之头像裁剪,添加字幕,生成新图片下载等 解决真机调试和开发者工具 图片不显示等问题
  12. android 最好的gtd软件,这9款高质量APP让你工作效率提高50%!
  13. 击穿面试官的套路:经典面试问题剖析
  14. 【零基础深度学习教程第一课:深度学习基础】
  15. Lambda表达式-常见的函数式接口
  16. 大家小心了,做寄生虫排名骗子
  17. java实现踢下线用户_浅谈踢人下线的设计思路!(附代码实现方案)
  18. 【转载】单片机入门经验
  19. 【转自Mster HaKu的博文】UML设计初步 - 基本概念一(actor, use case)
  20. PHP实现棱形代码(PHP练习)

热门文章

  1. python训练营 朋友圈点赞收费吗_千万不要随便在朋友圈点赞!
  2. 安装了office但是新建没有
  3. 黑苹果安装教程及相关问题处理心得
  4. mac如何强制退出程序?强制退出程序的六种方法
  5. Error:All flavors must now belong to a named flavor dimension. Learn more at
  6. 以软件测试的角度测试一支笔,软件测试面试:如何测试一支笔(铅笔,钢笔,中性笔)...
  7. 280. 陪审团 - AcWing (拔河DP,反推过程)
  8. DirectX12_入门之三角形
  9. 通向财富自由——斜杠青年与自由职业者
  10. feedback算法C语言,Learner Reviews Feedback for 计算导论与C语言基础 Course | Coursera