java静态域静态方法

  1.基于类的访问权限:方法可以访问所属类的私有特性( feature )

class Employee
{

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

典型的调用方式是

    if (harry.equals(boss)) . . .

这个方法访问 harry 的私有域, 这点并不会让人奇怪,然而, 它还访问了 boss 的私有域。这是合法的, 其原因是 boss 是 Employee 类对象, 而 Employee 类的方法可以访问 Employee 类的任何一个对象的私有域。

    2.final 实例域

实例域定义为 final。 构建对象时必须初始化这样的域。也就是说, 必须确保在每一个构造器执行之后, 这个域的值被设置, 并且在后面的操作中, 不能够再对它进行修改。

Employee 类中的 name 域声明为 final, 因为在对象构建之后, 这个值不会再被修改, 即没有 setName 方法。

final 修饰符大都应用于基本 (primitive) 类型域,或不可变(immutable) 类的域(如果类中的每个方法都不会改变其对象, 这种类就是不可变的类。 例如,String类就是一个不可变的类)。

对于可变的类, 使用 final 修饰符可能会对读者造成混乱。例如,private final StringBuiIcier evaluations;
在 Employee 构造器中会初始化为evaluations = new StringBuilder();  final 关键字只是表示存储在 evaluations 变量中的对象引用不会再指示其他 StringBuilder对象。 不过这个对象可以更改:
public void giveGoldStar()
{
   evaluations.append(LocalDate.now() + ": Gold star!\n");
}

3.静态域与静态方法

域定义为 static, 每个类中只有一个这样的域。而每一个对象对于所有的实例域却都有自己的一份拷贝。
class Employee
{
    private static int nextld = 1;
    private int id;
}//每一个雇员对象都有一个自己的 id 域, 但这个类的所有实例将共享一个 nextld 域。换句话说, 如果有 1000 个 Employee 类的对象, 则有 1000 个实例域 id。 但是, 只有一个静态域 nextld。即使没有一个雇员对象, 静态域 nextld 也存在。它属于类,而不属于任何独立的对象。              在绝大多数的面向对象程序设计语言中, 静态域被称为类域。


静态常量:采用 Math.PI 的形式获得这个常量。如果关键字 static 被省略, PI 就变成了 Math 类的一个实例域。需要通过 Math 类的对象访问 PI,并且每一个 Math 对象都有它自己的一份 PI 拷贝。

多次使用的静态常量是 System.out。它在 System 类中声明:
public class System
{
public static final PrintStream out = . . .;//由于每个类对象都可以对公有域进行修改, 所以,最好不要将域设计为 public。然而,
}//公有常量(即 final 域)却没问题。 因为 out 被声明为 final, 所以,不允许再将其他打印流陚给它:

System.out = new PrintStrean(. . •); // Error out is final

静态方法不能访问 Id 实例域, 因为它不能操作对象。   使用用静态方法:
•一 方法不需要访问对象状态,其所需参数都是通过显式参数提供(例如: Math.pow ) 
•一个方法只需要访问类的静态域(例如:Employee.getNextld)

不需要使用对象调用静态方法。例如,不需要构造 Math 类对象就可以调用Math.pow,main 方法也是一个静态方法。main 方法不对任何对象进行操作。事实上,在启动程序时还没有任何一个对象。静态的main 方法将执行并创建程序所需要的对象。

  • 对象变量的值都是对存储在另外一个地方的一个对象的引用,new 操作符的返回值也是一个引用。Date deadline = new Date(); 一个对象变量并没有实际包含一个对象。

保存时间与给时间点命名分开。用来表示时间点的 Date 类;另一个是用来表示大家熟悉的日历表示法的 LocalDate 类。          不要使用构造器来构造 LocalDate 类的对象。使用静态工厂方法 (factory method) 代表你调用构造器。                                   Local Date.now()会构造一个新对象, 表示构造这个对象时的日期。

  • 对象中的数据称为实例域,类实例(对象)。

  • 对象的状态 (state)—当施加那些方法时(对象的行为),对象如何响应?

LocalDate aThousandDaysLater = newYearsEve.plusDays(1000);调用之后 newYeareEve不变,plusDays 方法会生成一个新的 LocalDate 对象,然后把这个新对象赋给 aThousandDaysLater变量。

plusDays 方法没有更改调用这个方法的对象。

String 类的 toUpperCase 方法。在一个字符串上调用 toUpperCase 时, 这个字符串仍保持不变,会返回一个将字符大写的新字符串。

只 访 问 对 象 而 不 修 改 对 象 的 方 法 有 时 称 为 访 问 器 方 法。

在 C++ 中, 带有 const 后缀的方法是访问器方法;默认为更改器方法。

  • 方法中不要命名与实例域同名的变量

public void raiseSalary(double byPercent)//在每一个方法中, 关键字 this 表示隐式参数, 出现在方
{
    double raise = this.salary * byPercent / 100;//法名前的Employee 类对象。 把隐式参数称为方
    this.salary += raise;//法调用的目标或接收者。

}//这样可以将实例域与局部变量明显地区分开来。

getName 方法、 getSalary 方法和 getHireDay 方法, 典型的访问器方法。由于它们只返回实例域值, 因此又称为域访问器。

public Date getHireDay()//不要编写返回引用可变对象的访问器方法
{
    return hireDay; // Bad}

如果需要返回一个可变对象的引用, 应该首先对它进行克隆(clone)。 对象 clone 是指存放在另一个位置上的对象副本。

public Date getHireDay()
{
    return (Date) hireDay.cloneO; // Ok}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值