《Java核心技术卷1》第四章笔记


识别类

“找名词与动词的原则”:识别类的简单规则是在分析问题的过程中寻找名词,而方法对应着动词。

类之间的关系

依赖:

如果一个类的方法操纵另一个类的对象,我们就说一个类。在设计程序的过程中,应该要把这种相互依赖的类减至最少——让类之间的耦合度最小。

聚合:

类A的对象包含类B的对象。

继承:

一般而言, 如果类 A 继承类 B, 类 A 不但包含从类 B 继承的方法,还会拥有一些额外的功能。

对象与对象变量

一个对象变量并没有实际包含一个对象,而仅仅引用一个对象。可以将 Java 的对象变量看作 C++ 的对象指针。

LocalDate类

import java.time.LocalDate;
import java.util.Date;

public class Main {
	public static void main(String[] args) {
		LocalDate now = LocalDate.now();// 当前日期
		LocalDate sp = LocalDate.of(2000, 05, 05);// 构造特定的日期
		Date dot = new Date();// 时间点
		System.out.println(dot);
		System.out.println(now);
		System.out.println(sp);
		System.out.println(sp.getYear());//得到年
		System.out.println(sp.getMonthValue());//得到月
		System.out.println(sp.getDayOfMonth());//得到日
		System.out.println(sp.plusDays(1000));//x天之后的日期
	}
}

表示日期用LocalDate类,而不是Date类,让日期与时间分开处理。

访问器方法与更改器方法

访问器方法只能访问对象,而不会修改对象。而更改器方法可以修改对象。

隐式参数与显式参数

一个类的方法有两个参数:隐式参数,显式参数。隐式参数是该类的一个对象,显式参数是括号里的数值。可以用关键字this表示隐式参数。

克隆

注意不要编写返回类中的可变对象的访问方法(因为它可能会受到该可变对象的类的更改器方法的修改,封装性受到了破坏),如果需要,可以返回它的克隆,即它的拷贝。

私有方法

如果方法是公有的,就不能将其删去,因为其他的代码很可能依赖它。而如果方法是私有的,就可以确定它不会被外部的其他类操作调用,可以将其删去。

final实例域

final只是确保被修饰过的对象不会被更改位置,但可以更改该位置上的值。比如StringBuilder类中的append方法。

静态方法

静态方法不能访问实例域,但可以访问静态域(其他方法也可以访问静态域,不仅仅是静态方法)。所以当不需要访问对象状态(如Math.pow),或者只需要访问静态域,就可以用静态方法。

值传递

java总是值传递。当传递一个对象时,只是拷贝了这个对象变量,当对对象变量进行操作时,原来的对象变量不会改变。不过对该对象变量指向的对象实例进行操作,会发生变化。这一点很像c语言里的指针。

#include <iostream>
using namespace std;

void swap(int *x, int *y) {
	cout << &x << " " << &y << endl;
	int *t = x;
	x = y;
	y = t;
	cout << x << " " << y << endl;
}

int main() {
	int c = 10;
	int d = 20;
	int *a = &c;
	int  *b = &d;
	cout << &a << " " << &b << endl;
	swap(a, b);
	cout << a << " " << b << endl;
	cout << &a << " " << &b << endl;
	return 0;
}

可知,无论是传递c里面的指针还是传递java里面的对象,都只是copy了那个实参,而对象的状态发生变化,只是因为形参所指向的还是原来的位置,当去操作那个位置上的值,最后肯定是会被改变的。但形参所在的地址和实参的地址是不一样的(形参相当于拷贝了实参,但也仅仅是拷贝。。。),所以形参变化时,并不会对实参产生影响。所以这是值传递,或者说是指针传递。

重载

除了构造器,java允许重载任何方法,但前提是有相同的方法名,不同的参数。当有两个名字相同,参数类型相同,但返回类型不同的方法,会报错的,因为返回类型不属于方法的签名,不能用来描述方法。

构造器

当类中没有提供任何构造器时,系统就会提高一个无参数,实例域为默认值的构造器。但如果提供了至少一个构造器,这个系统默认的构造器则不会提供,当然,也可以自己手动添加。

调用另一个构造器

可以在一个构造器中通过this关键字调用类中的另一个构造器。

public Employee(double s)
{
   // calls Employee(String, double)
      this("Employee #" + nextld, s);
      nextld++;
}

调用构造器的处理步骤

1.执行初始化语句和初始化块。

2.执行构造器内的语句。

类的导入

当需要导入不同包的相同名称的类时,如java.util.Date和java.sql.Date,可以使其中一个缺省,比如java.sql.Date,这样就可以确定用的是util包里的Date类了。当然,也可以在使用时加上完整的包名。

java.util.Date deadline = new java.util.Date();
java.sql.Date today = new java.sql.Date(...);

导入静态方法和静态域

这样可以不必加上类名的前缀,比如Math.sqrt()可以省略Math。(不常用)


文章作者: 淡夜
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 淡夜 !
评论
  目录