Open
Description
2019-10-19~2019-10-26 周分享总结
1、分享人:邓思远 | 分享日期:2019-10-19
提问:下面调用sout(SubClass.value);输出的是什么? 为什么?
public class SuperClass{
static {
System.out.println("SuperClass init!");
}
public static int value = 123;
}
public class SubClass extends SuperClass {
static {
System.out.println("SubClass init!");
}
}
回答:
SuperClass init!
123
2、分享人:袁乙文 | 分享日期:2019-10-20
提问:StringBuffer、StringBuilder、String哪个是final类型的?
回答:都是final类,都不允许被继承;String类长度是不可变的,StringBuffer和StringBuilder类长度是可以改变的;
3、分享人:孙鹏翔 | 分享日期:2019-10-21
提问:final, finally, finalize的区别是什么?
回答:final用于声明属性,方法和类,表示属性不可变,方法不可覆盖,类不可继承。内部类要访问局部变量,局部变量必须定义成final类型。finally是异常处理语句结构的一部分,表示总是执行。finalize是Object类中的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,如关闭文件等。但是jvm不能保证此方法总被调用。
4、分享人:王增益 | 分享日期:2019-10-22
提问:可变参数是什么?
回答:可变参数关于对相同类型,但是若干个不确定蛋参数(数组都可以传)的方法。(参数类型... 参数名),函数里面可以通过foreach调用或者x.length调用。
5、分享人:姚秋鸿 | 分享日期:2019-10-23
提问:这代码序运行时有无问题?
Map<String,Boolean> map = new HashMap<String, Boolean>();
Boolean b = (map!=null ? map.get("test") : false);
回答:
6、分享人:袁乙文 | 分享日期:2019-10-24
提问:这代码序运行时有无问题?
public class Test implements Runnable {
private int b = 1;
@Override
public void run() {
System.out.println("A is begin");
while(true) {
if(b==2) {
breeak;
}
}
System.out.println("A is finish");
}
public static void main(String[] args) {
Test a = new Test();
new Thread(a,"A").start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
a.b = 2;
}
}
回答:此问题和并发编程的可见性有关,主线程虽然修改了a.b=2,但是这个值对于子线程并不是可见的。因为他的修改只改了自己的本地内存和主内存,但是并没有强制子线程更新这个值。所以子线程的判断结果一直都是false。
A is begin
7、分享人:杨兴旺 | 分享日期:2019-10-25
提问:1.volatile能使得一个非原子操作变成原子操作吗? 2.volatile是否完全具有原子性 图中的输出结果每次是否一样?
public class VolatileDemo {
private long value;
public void incre(){
value++;
System.out.println(value);
}
public static void main(String[] args){
final VolatileDemo volatileDemo = new VolatileDemo();
for (int i = 0; i< 10; i++){
new Thread(new Runnable() {
@Override
public void run() {
volatileDemo.incre();
}
}).start();
}
}
}