首页 > 编程 > Java > 正文

Java核心技术笔记-第4章

2019-11-08 01:08:37
字体:
来源:转载
供稿:网友

第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只会对数据域进行初始化,而不会对局部数据变量进行初始化。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表