Think in Java 中该章节的内容只是初步介绍了一些语法层面的内容,具体的细节需要参考之后的另一本书周志明的《深入理解Java虚拟机》
参数的顺序

class Demo{
int i = 0;
Demo increment(){
i++;
return this;
}
void print(){
System.out.println("i = "+i);
}
public static void main(String[] args){
Demo demo = new Demo();
demo.increment().increment().increment().print();
}
}
//output
//i = 3
class Demo{
int i = 123;
}
class Demo{
int i = fun();
int j = fun2(i);
int fun2(int in){
return 2*in;
}
int fun(){
return 11;
}
}
class Counter{
int i;
Counter(){
i = 7;
}
}
我们无法阻止自动初始化的进行,它将在构造器被调用之前发生。就是 i首先会被置0,然后变成7。对于所有基本类型和引用类型,包括在定义的时候已经指定初始值的变量,这种情况都是成立的。
所以我们在并发的时候要考虑到,对象只进行了自动初始化,构造器还尚未调用的情况,这时候的产生的对象是不完整的对象。
1 静态对象先初始化(如果之前该类已经实例化过,静态对象就不会再次加载了)
2 然后是非静态对象
3 最后是构造器
1 查找*.class文件
2 载入class文件 创建一个Class对象 然后所有静态对象初始化
3 new 对象的时候,首先在堆上分配足够的内存 (静态属性都加载完了)
4 将这块内存区域空间置0 (自动初始化的结果,所有数据先开始是0或者空)
5 执行类中定义的赋值操作 (所有非静态属性有了设定的值)
6 指定构造器 (构造器被调用,可能导致对象的属性发生变化,还可能会导致父类被调用。。。)
class Cup{
static Cpu cup1;
static Cpu cup2;
static {
cup1 = new Cup();
cup2 = new Cup();
}
}
class Cup{
Cpu cup1;
Cpu cup2;
{
cup1 = new Cup();
cup2 = new Cup();
}
}
class Demo{
void fun(Object... objs){
//objs 就是一个数组
}
}
public enum Smile{
HAHA,XIXI,HEHE
}
class Demo{
public static void main(String[] args){
for(Smile s: Smile.values()){
System.out.println(s + ". ordinal " + s.ordinal());
}
}
}
//output
// HAHA. ordinal 0
// XIXI. ordinal 1
// HEHE. ordinal 2
switch(Smile){
case HAHA: sout(1111) break;
case XIXI: sout(2222) break;
case HEHE: sout(3333) break;
default: sout(4444);
}原文:https://www.cnblogs.com/Pikzas/p/12164323.html