JAVA核心技术卷I(对象与类)
一、LocalDate 日期类
常见API(JDK8):
static LocalDate now():构造一个当前日期对象
static LocalDate of(int year, int month, int day):指定日期
int getYear()
int geyMonthValue()
int getDayOfMonth()
得到当前日期的年、月、日
DayOfWeek getDayOfWeek():获取星期几(1=星期一,7=星期日)
LocalDate plusDays(int n)
LocalDate minusDays(int n)
返回一个新的日期,N天后和N天前(年、月操作一样)
二、自定义类
2.1 封装性的破坏
警告:不要编写返回可变对象引用的访问器方法。这里有个经验,如果需要返回已给可变数据字段的副本,就应该使用clone(第六章)。
/** |
2.2 final 实例字段
final关键字只是表示存储在evaluations变量中的对象引用不会再指示另一个不同的StringBuilder对象,不过这个对象可以改变!
private final StringBuilder evaluations; // 不允许改变对象引用 |
三、静态字段与静态方法
3.1 工厂方法
类似于LocalDate.now(),就使用了静态工程的方法来构造对象。P117
四、方法参数
方法参数(两种)
- 基本数据类型(数字、布尔值)
- 对象引用
Java程序设计语言总是采用 按值调用
(不论是上面说的哪种类型参数)!也就是说,方法得到的是所有参数值的一个副本。(有人说JAVA对象是采用引用调用这是不对的)P123
解释
public class SwapDemo { |
可以看到结果并没有被改变:
原因是x和y只是原来p1和p2的对象引用
的副本,虽然x和y确实进行了交换,但是!在退出swap函数之后,x和y被丢弃了,而原来的p1和p2还是指向原始的堆空间。因此并没有发生交换效果。
总结
- 方法不能修改基本数据类型的参数
- 方法可以改变对象参数的状态(通过对象引用的副本修改所引用对象的状态)
- 方法不能让一个对象参数引用一个新的对象
五、对象构造
5.1 重载
有相同的名字、不同的参数。(方法签名:方法名+参数类型,注意返回类型不是签名的一部分)
5.2 默认字段初始化
如果没有显示的赋值,那么会被赋值初始值:数值为0,布尔值为false,对象引用为null。
不过确保每个实例字段都有一个有意义的初值,总是一个好主意。
5.3 初始化块
首先运行初始化块,然后才运行构造器的主体部分。
public class Person { |
不允许读取在后面初始化的字段,建议总是将初始化块放在字段定义之后。
静态初始化块
如果类的静态字段需要很复杂的初始化代码,可以用静态初始化块:
static { |
六、包
6.1 包中的类
包名和目录没有任何的联系,但是如果一个包名和目录路径不匹配,但是包中引用了其他包的类。那么就有可能造成找不到类的错误。
6.2 包访问
- public:可以由任意类使用
- private:只能由定义他们的类使用
- 无:这个部分(类、方法、变量)可以被同一个包中的所有方法访问。
6.3 类路径
https://blog.csdn.net/qq_37284484/article/details/80776810
七、类设计技巧
- 一定要保证数据私有(绝对不要破坏封装性)
- 一定要堆数据进行初始化
- 不要再类中使用过多的基本类型
- 不是所有的字段都需要单独的字段访问器和字段更改器
- 分解由过多指责的类
- 类名和方法名要能够体现他们的职责
- 优先使用不可变的类