文章目录

  • 1、文件名与类名
  • 2、类中的实例字段
  • 3、构造器
  • 4、使用null引用
  • 5、字段封装
  • 参考


1、文件名与类名

  • 源文件名必须与public类名相匹配。在一个源文件中,只能有一个公共类,但可有任意数目的非公共类。

    如上,源文件名为EmployeeTest.java,里面有两个类(EmployeeTest、Employee),public类名与源文件名匹配。
    编译这段代码时,编译器会在目录下创建两个类文件:EmployeeTest.class,Employee.class。

2、类中的实例字段

  • 类中的实例字段尽量使用private标记,若使用public就破坏了其封装性。
    如上图中的,name\salary\hireDay。要访问他们,会在类中写相关的字段访问器。

3、构造器

  • 构造器
    1、构造器与类同名;
    2、每个类可以有一个以上的构造器;
    3、构造器可以有0、1或多个参数;
    4、构造器没有返回值;
    5、构造器总是伴随着new操作符一起调用。

4、使用null引用

  • 一个对象包含一个对象的引用,定义一个类时,最好清楚地知道哪些字段可能为null。否则可能出现NullPointerException异常。
  • 两种解决方法:
    一是宽容型,把null参数转换为一个适当的非null值;
    if(n == null) name = “unknown”; else name = n;
    Java9中,Objects类提供Objects.requireNonNullElse(n, “unknown”);方法
    二是严格型,拒绝null参数,Objects.requireNonNull(n, “The name cannot be null”);

5、字段封装

  • 获取或者设置实例字段的值,需提供三项内容:
    一个私有的数据字段;
    一个公共的字段访问器方法;
    一个公共的字段更改器方法;
class Employee
{
	private Date hireDay;
	public Date getHireDay()
	{
		return (Date)hireDay.clone();
	}
	public void setHireDay()
	{
		...
	}
}
  • 警告:不要编写返回可变对象引用的访问器方法!!!
    因为这会破坏封装性
    若上面一段代码是return hireDay;那么返回的是一个引用对象中的一个私有对象,本来我们只能调用setHireDay()去改变对象的hireDay的值,但是现在返回的是这个对象,那么我可以在外部对这个对象做修改,就改变了其私有状态。如下图,d就是返回的私有对象,直接指向了引用对象的私有字段。

    所以,如果需要返回一个可变数据字段的副本,应该对它进行克隆。

参考

《Java核心技术 卷Ⅰ》