Java 再学习 模糊的知识 (二)

对象与类

1. 实现封装的关键在于绝对不能让类中的方法直接地访问其他类的实例域,程序仅通过对象的方法与对象数据进行交互。
2. 一个对象变量并没有实际包含一个对象,而仅仅引用一个对象。在Java中,任何对象变量的值都是对存储在另外一个地方的一个对象的引用。new操作符的返回值也是一个引用。
3. 有关日期的注意点
//Thu Sep 01 00:00:00 CST 2016
//2016
public static void dateTest() {
	//已知年月日,创建相应的Date对象
	GregorianCalendar gc = new GregorianCalendar(2016,8,1);//GregorianCalendar 月份为0-11
	Date date = gc.getTime();
	System.out.println(date);
	//有Date,希望获得年月日
	GregorianCalendar gc2 = new GregorianCalendar();
	gc2.setTime(date);
	int year = gc2.get(gc2.YEAR);
	System.out.println(year);
}
4. 无特殊需求,尽可能不要编写返回引用可变对象的访问器方法,可以克隆后返回。
public static void employeeTest() {
	Employee employee = new Employee("Hzf",2019,12,28);
	System.out.println(employee.toString());
	Date date = employee.getDate();
	date.setMonth(2);
	System.out.println(employee.toString());	
}
/*
直接返回引用可变对象
Employee [name=Hzf, date=Sat Dec 28 00:00:00 CST 2019]
Employee [name=Hzf, date=Thu Mar 28 00:00:00 CST 2019]
访问器克隆后返回或者(date)employee.getDate().clone();
Employee [name=Hzf, date=Sat Dec 28 00:00:00 CST 2019]
Employee [name=Hzf, date=Sat Dec 28 00:00:00 CST 2019]
*/
5. 实例域定义为final,构建对象时必须初始化这样的域。即必须确保在每一个构造器执行之后,这个域的值被设置,并且在后面的操作中,不能够再对它进行修改。final修饰符大都应用于基本类型域或不可变类的域。

PS. 如果类中的每个方法都不会改变其对象,这种类就是不可变的类。

6. 静态方法是一种不能向对象实施操作的方法,即静态方法中没有this参数,不能在静态方法中访问实例域,但可以访问自身类中的静态域。常常在以下两种情况使用静态方法:
  • 一个方法不需要访问对象状态,其所需参数都是通过显示参数提供。
  • 一个方法只需访问类的静态域。
  • 工厂模式中使用。
7. Java中方法参数的使用为按值调用,当参数为对象引用时,得到的是对象引用的拷贝,故可以改变对象参数的状态,但无法使其引用一个新的对象。
  • 一个方法不能修改基本数据类型的参数(即数值型和布尔型)。
  • 一个方法可以改变一个对象参数的状态。
  • 一个方法不能让对象参数引用一个新的对象。
8. 必须明确地初始化方法中的局部变量。但是,如果没有初始化类中的域,将会被初始化为默认值(0、false 或null)。
9. 当一个类的所有构造器都希望把相同的值赋予某个特定的实例域时,可以在类定义中,直接将一个值赋给这个特定的域。这个值不一定都是一样的,可以是调用方法产生不同的值。
public class Employee {
	private String name = "Nicholas";
	...
}
//这个值不一定都是一样的,可以是调用方法产生不同的值。
public class Employee {
	private static int id_static;
	private int id = getId();
	private static int getId(){
		int r = id_static;
		id_static++;
		return r;
	}
	...
}
10. 在一个构造器中调用另一个构造器
public class Employee {
	public Employee() {
		//该语句必须是构造器的第一条语句,它将在一个构造器中调用另一个构造器
		//采用这个方式使用this关键字,对公共的构造器代码仅需编写一次
		this("Nicholas",5);
	}
	public Employee(String name,int age) {
		this.name = name ;
		this.age = age;
	}
	...
}
11. 初始化块。在一个类的声明中,可以包含多个代码块。只要构造类的对象,这些块就会被执行。
12. 调用了构造器,具体的处理步骤为:

1)所有数据域被初始化为默认值(0、false或null)。
2)按照在类声明中出现的次序,依次执行所有域初始化语句和初始化块。
3)如果构造器第一行调用了第二个构造器,则执行第二个构造器主体。
4)执行这个构造器的主体。

13. import 语句不仅可以导入类,还增加了导入静态方法和静态域的功能。
14. 类的设计技巧
  • 保证数据私有
  • 对数据初始化
  • 不再类中使用过多基本类型(用其他类代替多个相关的基本类型的使用)
  • 不是所有域都需要独立的域访问器和域修改器
  • 分解职责过多的类
  • 类名和方法名要见名知意

学习整理自《Java 核心技术 卷一 基础知识》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章