avatar

目录
JAVA核心技术卷I(对象与类)

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(第六章)。

java
/**
* 对象的封装性:
* 并未设置Person的set方法,但是他的状态被改变了。破坏了封装性
*/
@Test
public void testGetMethod() {
class Item {
private String name = "init";

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}
class Person {
private Item item = new Item();

public Item getItem() {
return item;
}
}

Person person = new Person();
System.out.println(person.getItem().getName());
Item tmp = person.getItem(); // 这里返回了一个堆中的引用,和Person中的是同一个对象
tmp.setName("Apple");
System.out.println(person.getItem().getName());
}
---------------------------------
运行结果:
init
Apple

2.2 final 实例字段

final关键字只是表示存储在evaluations变量中的对象引用不会再指示另一个不同的StringBuilder对象,不过这个对象可以改变!

java
private final StringBuilder evaluations;	// 不允许改变对象引用
evaluations = new StringBilder();

public viod sayHello() {
evalations.append("Hello!\n"); // 允许对象内容改变
}

三、静态字段与静态方法

3.1 工厂方法

类似于LocalDate.now(),就使用了静态工程的方法来构造对象。P117

四、方法参数

方法参数(两种)

  • 基本数据类型(数字、布尔值)
  • 对象引用

Java程序设计语言总是采用 按值调用 (不论是上面说的哪种类型参数)!也就是说,方法得到的是所有参数值的一个副本。(有人说JAVA对象是采用引用调用这是不对的)P123

解释

java
public class SwapDemo {
static class Person {
public String name;
public Person(String name) {
this.name = name;
}
}

// 并不能实现交换的效果。这里的x和y是
public static void swap(Person x, Person y) {
Person temp = x;
x = y;
y = temp;
}

public static void main(String[] args) {
// 在堆分配了2个空间
Person p1 = new Person("P1");
Person p2 = new Person("P2");

swap(p1, p2);

System.out.println(p1.name);
System.out.println(p2.name);
}
}
----------------------
运行结果:
P1
P2

可以看到结果并没有被改变:

avatar

原因是x和y只是原来p1和p2的对象引用的副本,虽然x和y确实进行了交换,但是!在退出swap函数之后,x和y被丢弃了,而原来的p1和p2还是指向原始的堆空间。因此并没有发生交换效果。

总结

  • 方法不能修改基本数据类型的参数
  • 方法可以改变对象参数的状态(通过对象引用的副本修改所引用对象的状态)
  • 方法不能让一个对象参数引用一个新的对象

五、对象构造

5.1 重载

有相同的名字、不同的参数。(方法签名:方法名+参数类型,注意返回类型不是签名的一部分)

5.2 默认字段初始化

如果没有显示的赋值,那么会被赋值初始值:数值为0,布尔值为false,对象引用为null。

不过确保每个实例字段都有一个有意义的初值,总是一个好主意。

5.3 初始化块

首先运行初始化块,然后才运行构造器的主体部分。

java
public class Person {
// 字段定义
private String name;
// 先执行
{
name = ""
}
// 后执行
public Person(){}
}

不允许读取在后面初始化的字段,建议总是将初始化块放在字段定义之后。

静态初始化块

如果类的静态字段需要很复杂的初始化代码,可以用静态初始化块:

java
static {
// ...
}

六、包

6.1 包中的类

包名和目录没有任何的联系,但是如果一个包名和目录路径不匹配,但是包中引用了其他包的类。那么就有可能造成找不到类的错误。

6.2 包访问

  • public:可以由任意类使用
  • private:只能由定义他们的类使用
  • 无:这个部分(类、方法、变量)可以被同一个包中的所有方法访问。

6.3 类路径

https://blog.csdn.net/qq_37284484/article/details/80776810

七、类设计技巧

  1. 一定要保证数据私有(绝对不要破坏封装性)
  2. 一定要堆数据进行初始化
  3. 不要再类中使用过多的基本类型
  4. 不是所有的字段都需要单独的字段访问器和字段更改器
  5. 分解由过多指责的类
  6. 类名和方法名要能够体现他们的职责
  7. 优先使用不可变的类
文章作者: IT小王
文章链接: https://wangbowen.cn/2020/05/12/JAVA%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF%E5%8D%B7I%EF%BC%88%E5%AF%B9%E8%B1%A1%E4%B8%8E%E7%B1%BB%EF%BC%89/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 IT小王

评论