本篇文章更偏向于笔记,是阅读Java核心卷(一)以后的记录:java
1. 一个类可能的组成部分:git
1. 成员变量github
2. 成员函数函数
3. 构造函数工具
4. 代码块this
5. 静态变量,静态函数,静态代码块spa
2. 初始化成员变量的方法:翻译
1. 声明时直接赋值debug
2. 代码块赋值3d
3. 构造函数中赋值
三种初始化方式的顺序:
构造 > 声明或代码块
先声明仍是先代码块看他们在代码中的顺序
能够在new 的 地方打个断点,调试一下更清楚
最后输出 “ 构造函数赋值”。
把构造函数注掉就会输出 “代码块赋值”
把声明和代码块的顺序变一下就会输出“声明时赋值”
此处再也不演示。
3. 构造函数
关于构造函数须要注意的点是:
1. 只有当类没有提供任何构造器的时候,系统才会默认提供一个空参的构造函数
2. 能够在构造函数中利用this调用其余的构造函数
当你已经写过构造函数以后,再调用Employee会报错。
this构造函数就没什么好说的了
4. 方法参数(Java 只有值传递)
Java方法中的参数传递都是值传递,没有引用传递,看起来像引用传递的对象传参也只是把引用复制了一份,而后指向了相同的对象。
举一个反例:
最后输出e1.name 仍是雇员1。
若是真的是引用传递的话,e1 应该就指向了雇员2那个对象了。
因此咱们所认为的引用传递实际上也是值传递,只不过传递的是引用。既然指向了同一个对象,那么当对象的内容发生变化的时候,好比你把雇员的名字给改了,那么原来的对象天然也被修改了,这看上去
很想引用传递,但其实不是。
5. static
静态的成员变量和代码块都只会初始化一次。
static 成员变量: 就是全部对象共享的变量,static常与final合用变成静态常量,例如Math类,有至关多的数学常量在里面,例如PI
static 代码块: static代码块中固然就不能对成员变量进行初始化了,通常来讲就是对static成员变量进行处理的代码块。
加载顺序:
强烈建议能够debug看一下,能够发现其实在执行static代码块的时候还并无id这个成员变量,这里猜想静态变量以及它的初始化是在类加载的时候就执行了
因此说静态的东西加载都比非静态要早。
可是这里变量的声明和代码块的初始化的顺序是不能颠倒的:
6. 静态方法
静态方法的用途:我的理解就是不须要实例化就可以使用的方法,或者说不涉及到成员变量操做的方法,又或者说涉及到了,可是对于每个对象来讲须要对成员变量进行的操做是同样的。
例如在Math类中,它的方法基本上都是Math类的,由于Math根本就不让你初始化,它的方法都是涉及到一些数学公式的计算,对于全部想要使用这个方法的人来讲都是同样的,并不存在差别化
还有一些工具类中可能更常见:例如说Arrays中的asList方法。
静态工厂方法:
在一些类中,咱们会使用静态工厂方法来替代构造方法。在effective-Java 3rd 中 第一条建议就是这个(GitHub上一个自发的翻译项目,因此可能翻译质量没法保证):
这里面详述了不少条静态工厂替代构造方法的优势和缺点,大部分暂时还看不太懂,这里只简单小结两点(Java 核心卷上总结的两点):
1. 使用静态工厂方法相比构造函数更具备语义性,构造函数只能根据参数的不一样来产生不一样的对象,而若是有一个名字的话,会清晰许多,例如LocalDate.now() LocalDate.of()
2. 使用构造函数就只能返回本类型,可是使用静态工厂,返回的类型没有限制了,因此咱们能够返回其子类,例如:
NumberFormat currencyInstance = NumberFormat.getCurrencyInstance();