Java核心技术笔记-第4章

第4章 对象与类

1.不要编写返回引用可变对象的访问器方法

例如:

class Employee
{
    private Date hireDay;
    public Date getHireDay()
    {
        return hireDay;
    }
}
Employee e = ...;
Date d = e.getHireDay();

此时,d就是e的hireDay,对d的更改会直接造成e的hireDay的更改。

2.如果两个对象属于同一个类,那么一个对象的方法可以访问另一个对象的私有数据。

也就是说,Employee类的方法可以访问Employee类的任何一个对象的私有域。例如:

class Employee
{
    ...
    public boolean equals(Employee other)
    {
        return name.equals(other.name);
    }
}

调用:if(harry.equals(boss))…
此时,不仅访问了harry的私有域,而且访问了boss的私有域。

3.private final Date hiredate;仅仅意味着hiredate变量中的对象 引用 在对象构造之后不能被改变。hiredate的非final数据域是可以更改的。

4.静态方法是一种不能向对象实施操作的方法,也就不能访问静态域,但是可以访问静态域。
例如:Math.pow(x,a);
在以下3种情况可以使用静态方法:
(1)一个方法不需要访问对象状态,其所需参数都是通过显式参数提供的。
(2)一个方法只需要访问类的静态域。
(3)像NumberFormat类一样,使用工厂方法创建不同类型的对象。

NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance();//静态方法
NumberFormat percentFormatter = NumberFormat.getPercentInstance();//静态方法

5.每一个类都可以有一个main方法。

这是一个对类用于单元测试的技巧。
例如,Employee类有一个main方法,Application类是一个更大的类,也有一个main方法。此时想要独立测试Employee类,只需java Employee;而使用java Application时,只会调用Application的main方法,不会执行Employee的main方法。

6.隐式参数和显示参数
例如,number007.raiseSalary(5);其中number007就是隐式参数,而5就是显示参数。
this可以用来表示隐式参数。

7.方法参数。
两种:值调用和引用调用
Java中在函数参数中采用的对象引用,属于值调用,而不是引用调用。就是说无法让对象参数引用一个新的对象。
总结:(1)方法的参数是一个引用类型时,对参数的数据域的更改,会直接造成真正的对象的数据域发生改变。
(2)

 public static void swap(Employee x, Employee y)
   {
        Employee temp = x;
        x = y;
        y = temp;
   }

执行语句swap(employee1, employee2);
注意:此时employee1和employee2所引用的对象并没有发生交换。

8.仅当类没有提供任何构造器的时候,系统才会提供一个没有参数的默认构造器。

9.在一个构造器中,可以使用this来调用另一个构造器。例如,

public Employee(double s)
{
    this("Employee #" + nextId, s);
    nextId++;
}

在调用Employee(double)构造器时,同时会调用Employee(String, double)构造器。

10.初始化块

初始化数据域三种方式:(1)在声明中赋值 (2)在构造器中赋值 (3)使用初始化块
像下面这样的成为初始化块:

class Employee
{
    private static int nextId;

    private int id;

    //初始化块
    //只要构造类的对象,初始化块就会被执行
    {
        id = nextId;
        nextId++;
    }
    //静态的初始化块(静态初始化块会优先执行)
    static
    {
        Random generator = new Random();
        nextId = generator.nextInt(10000);
    }

    //构造器
    ...
}

初始化数据域顺序:先执行初始化块(先执行静态的),再调用构造器。

11.包
(1)一个类可以使用所属包中的所有类,以及其他包中的公有类。
(2)不能导入以java为前缀的所有包,例如import java.*;这样是不行的。
(3)import语句不仅可以导入包和类,还可以导入类中的静态域和静态方法。例如import static java.lang.System.out;
(4)编译命令:javac com/mycompany/PayrollApp.java
而解释器命令: java com.mycompany.PayrollApp 使用的是.而不是/
(5)如果一个类的包名写错,可以正常编译这个源文件(如果不依赖于其他包),但是将无法执行,因为虚拟机找不到.class类文件。
(6)包作用域。变量标记为public的可以被任意类访问;标记为private的只可以被定义他们的类使用;如果没有指定,则可以被同一个包中的方法访问。

12.Java只会对数据域进行初始化,而不会对局部数据变量进行初始化。

你可能感兴趣的:(Java核心技术笔记)