wait、notify、notifyAll方法只能在同步控制方法或同步控制块(synchronized)中使用,否则即使能通过编译,但在运行时会抛出IllegalMonitorStateException异常,因为这些方法在调用时会操作锁。sleep可以在非同步控制方法中调用,因为它没有操作锁
try-finally中包含return的情况:
public static void main(String[] args) {
int r = f();
System.out.println("return:" + r);
}
public static int f() {
int i = 0;
try {
return ++i;
} finally {
System.out.println("finally:" + i);
}
}
/**
* finally:1
* return:1
*/
public static void main(String[] args) {
int r = f();
System.out.println("return:" + r);
}
public static int f() {
int i = 0;
try {
return ++i;
} finally {
System.out.println("finally:" + ( ++i ));
}
}
/**
* finally:2
* return:1
*/
/**
* 从以上的结果我们可以得出结论:
* 1. 针对return statement;语句来说,statement比finally先执行,执行完毕后先将返回值保存到局部变量中,也就是说finally中的执行语句不会影响到返回值,除了引用变量外
* 2. 接着执行finally中的语句,最后返回之前保存的局部变量的值
*/
public static void main(String[] args) {
int r = f();
System.out.println("return:" + r);
}
public static int f() {
int i = 0;
try {
return i;
} finally {
return ++i;
}
}
/**
* return:1
* 如果try、finally语句中均有return,忽略try的return,使用finally的return
*/
构造函数的执行顺序:父类静态成员属性默认初始化值 -> 父类静态成员属性显示初始化值 -> 父类的静态代码块 -> 子类静态成员属性默认初始化值 -> 子类静态成员显示初始化值 -> 子类的静态代码块 -> 父类成员属性默认初始化值 -> 父类成员属性显示初始化值 -> 父类的构造代码块 -> 父类构造函数 -> 子类成员属性默认初始化值 -> 子类成员属性显示初始化值 -> 子类的构造代码块 -> 子类构造函数
finally不会被执行的情况
// 方式1:使用Sytem.exit直接退出程序
public static void main(String[] args) {
try {
System.out.println("Hello World");
System.exit(0);
} finally {
System.out.println("1");
}
}
/**
* Hello World
*/
// 方式2:try语句块未被执行到,那么finally自然也就不会被执行到
public static void main(String[] args) {
System.out.println(f(true));
}
public static int f (boolean flag) {
if (flag) {
return 1;
}
try {
System.out.println("hello");
}finally {
System.out.println("world");
}
return 0;
}
/**
* 1
*/
// 方式3:finally所在的守护线程被中止,不好举例...
// 方式4:关闭CPU
dependencyManagement与dependencies区别:dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显式的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。dependencies即使在子模块中不写该依赖项,那么子模块仍然会从父项目中继承该依赖项(全部继承).
通常使用的Spring全家桶属于Java EE范畴.
HotSpot为什么要分为新生代和老年代?因为有的对象寿命长,有的对象寿命短。应该将寿命长的对象放在一个区,寿命短的对象放在一个区,不同的区采用不同的垃圾收集算法,寿命短的区清理频次高一点,寿命长的区清理频次低一点,提高效率.
原文:https://www.cnblogs.com/zlia/p/14165598.html