一、《Java核心技术》91~146页 第四章 对象和类
对象和类
- 对象变量并没有实际包含一个对象,而仅仅引用一个对象。
- 局部变量不会自动初始化为null,如果使用,必须通过调用new或者把它设置为null初始化后才能使用。
- 所有的Java对象都存储在堆中。
- 在一个源文件中,只能有一个公有类,但是可以有任意数目的非公有类。
LocalDate类
建立当前月的日历,并把今天用*标出
import java.time.*;
public class CalendarTest {
public static void main(String[] args) {
//LocalDate不是构造器,而是静态工厂方法
LocalDate date = LocalDate.now();
//Date也有getDay和getMonth以及getYear等方法,但是不推荐使用。
int month = date.getMonthValue();
int today = date.getDayOfMonth();
//减去参数
date = date.minusDays(today - 1);
DayOfWeek weekday = date.getDayOfWeek();
//1为周一 ... 7为周末
int value = weekday.getValue();
System.out.println("Mon Tue Wed Thu Fri Sat Sun");
for (int i = 1; i < value; i++) {
System.out.print(" ");
}
while (date.getMonthValue() == month) {
System.out.printf("%3d", date.getDayOfMonth());
if (date.getDayOfMonth() == today) {
System.out.print("*");
} else {
System.out.print(" ");
}
date = date.plusDays(1);
if (date.getDayOfWeek().getValue() == 1) {
System.out.println();
}
}
}
}
运行结果
用户自定义类
- 不要编写返回引用可变对象的访问方法。如果需要返回一个可变对象的引用,首先要对它进行克隆(clone)。例如:Date对象通过setTime可变,需要克隆后才不会出错。
- Java的所有方法都在类中。但并不表示它们是内联方法。是否将某个方法设置为内联方法是Java虚拟机的任务。。即时编译器会监视调用那些简洁、经常被调用、没有被重载以及可优化的方法。
- 方法中包含隐式参数和显式参数。每非静态方法中方法中,关键词this表示隐式参数。
静态域和静态方法
-
在绝大多数面向对象程序设计语言中,静态域被称作类域。术语“static”这是沿用了C++的叫法,无实际意义。表示属于类且不属于类对象的变量和方法。
-
静态方法不能向对象实施操作,只能访问类的静态域。
class Employee{ ... private static int nextId = 1; ... public static int getNextId(){ return nextId; } ... } 调用静态方法的两种办法: 1、直接通过类名调用 int n = Employee.getNextId(); 2、使用对象调用静态方法 Employee hurry = new Employee(); int n = hurry.getNextId(); 建议直接通过类名调用静态方法,避免混淆。因为getNextId()的计算与对象hurry无关。
-
使用静态方法的情况:
1、方法不需要访问对象状态,其需要的参数都是通过显式参数提供的。如:Math.pow()
2、方法只需要访问静态域。如:Employee.getNextId()
-
工厂方法
-
main方法:不对任何对象进行操作。实际上,在启动程序时还没有任何一个对象。静态的main方法将执行并创建程序所需的对象。
方法参数
Java程序设计语言总是采用按值调用。方法得到的是所有参数值的一个拷贝。方法不能修改传递给它的任何参数变量的内容。但是当参数是一个对象引用时,因为对象引用及其他的拷贝同时引用同一个对象,当修改拷贝的引用对象时,对象本身也被修改。
Java中方法参数的使用情况:
- 一个方法不能修改一个基本数据类型的参数(即数值型或布尔型)
- 一个方法可以改变一个对象的状态
- 一个方法不能让对象参数引用一个新的对象(swap(Employee x,Employee y) 不会交换x,y)
对象构造
重载:多个方法具有相同的方法名,不同的参数,便产生了重载。编译器通过用各个方法给出的参数类型与待定的方法调用所使用的值类型进行匹配来挑选出相应的方法。
方法的签名:方法名+参数类型。注意,返回类型不是方法签名的一部分。
默认构造器:只用类里没有提供任何构造器时,系统才会提供一个默认的构造器。将数值型初始化为0,布尔型初始化为false,对象引用为null
显式初始化:在类中直接将一个值赋给一个实例域。当一个类的所有构造器都希望把相同的值赋予某个特定的实例域时,这种方法特别有用。
初始化块:建议放在域定义之后。
类中的一些特性:
-
重载构造器
-
用this(…)调用另一个构造器
-
无参数构造器
-
对象初始化块
-
静态初始化块
-
实例域初始化
java有自动垃圾回收器,不支持析构器。
包
建议命名:因特网域名以逆序形式作为包名
导入包:import 包名;如果导入两个包具有相同的类,并且都要使用,需要具体写使用的包是哪一个类的。
java.util.Date deadline = new java.util.Date();
java.sql.Date today = new java.sql.Date(...);
文档注释
生成一个注释组成的文档
类的设计技巧
- 一定要保证数据私有
- 一定要对数据初始化。Java不对局部变量初始化,但是会对对象的实例域进行初始化。最好不要用系统的默认值,而是显式的初始化所有的数据。
- 不要在类中使用过多的基本类型。用一个其他类来代替多个相关的类。
- 不是所有的域都需要独立的域访问器和域修改器。
- 将职责过多的类进行分解。
- 类名和方法名要能够体现他们的职责。
- 优先使用不可变类。