您的位置:首页 > 编程语言 > Java开发

Java核心技术笔记-第4章

2017-02-21 16:20 274 查看

第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 技术 对象 class