9.类的访问权限和方法参数【Java温故系列】

参考自–《Java核心技术卷1》

1 基于类的访问权限

方法可以访问所调用对象的私有数据。一个方法可以访问所属类的所有对象的私有数据。如:

//Employee类
class Employee{
    private String name;
    ...
    public boolean equals(Employee other){
        return this.name.equals(other.name);
    }
}

上述方法访问了当前类对象的私有域,同时访问了other的私有域。这是合法的(Employee类的方法可以访问Employee类任何一个对象的私有域)。


1.1 私有方法

在实现一个类时,由于公有数据非常危险,所以应该将所有的数据域都设置为私有的

绝大多数方法都被设计为公有(public)的,但在某些特殊情况下,也可能将它们设计为私有的。比如:有时,可能希望将一个计算代码划分为若干个独立的辅助方法,通常这些辅助方法不应该成为公有接口的一部分,这是由于它们往往与当前的实现机制非常紧密,或者需要一个特别的协议以及一个特别的调用顺序。最好将这样的方法设计为private。

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


1.2 final实例域

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

class Employee{
	private final String name;
	...
}
//将nama域声明为final,在对象构建之后,这个值将不会再被修改

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

对于可变的类,使用 final 修饰符很容易引起混乱。如:

private final StringBuilder sb;

在构造器中初始化:

sb = new StringBUilder();

这里的 final 修饰符只是表示存储在 sb 变量中的对象引用不会再指示其他 SringBuilder 对象,但是这个对象可以改:sb.append("xxx");


2 方法参数

将参数传递给方法的方式:

  • 按值调用 – 表示方法接收的是调用者提供的值
  • 按引用调用 – 表示方法接收的是调用者提供的变量地址

一个方法可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值。

Java方法的参数共有两种类型:基本数据类型,对象引用


2.1 调用基本数据类型

方法得到的所有参数值的一个拷贝,方法不能修改传递给它的任何参数变量的内容。

此时,毫无疑问,这种参数传递的方式为 按值调用 。

看下例:

//定义方法
public static void raise(double x){
	x = 3 * x;  //将参数值扩大至3倍
}

调用该方法:

double percent = 10;  //定义变量
raise(percent);  //按值调用参数 percent 
//percent的值仍为10

看看具体的执行过程:

1)x 被初始化为 percent 值的一个拷贝(即 10 )

2)x 被乘 3 后为 30,但是 percent 仍为 10

3)方法 raise 结束后参数变量 x 不再使用

在这里插入图片描述


2.2 对象引用

当参数为 对象引用 时,可以修改对象的实例域。

但,对象引用 仍是 按照传递的。方法不能让对象参数引用一个新的参数(如对两个对象的 swap 交换操作)。

如下例:

//Employee类
class Employee{
	...
	private double salary;
	...
	public void raiseSalary(int x){
		//将salary提升x倍
		this.salary = this.salary * x;
	}
    ...
    public static void tripleSalary(Employee e){
        e.raiseSalary(2);
    }
}

调用:

harry = new Employee(...); //已对salary初始化
tripleSalary(harry); //对harry的salary实例域增大至2倍
// harry.salary成功增大至2倍

具体执行过程:

1)tripleSalary 方法的参数 e 被初始化为 harry 的拷贝,即对象的引用(对象引用 harry 和它的拷贝同时引用同一个对象)

2)raiseSalary 这个方法应用于这个对象引用。e 和 harry 同时引用的那个 Employee 对象的 salary 值增大至 3 倍

3)tripleSalary 方法结束后,参数变量 e 不再使用。对象变量 harry 继续引用 salary 值增大至 3 倍的Employee 对象


2.3 Java方法参数总结
  • 一个方法不能修改一个基本数据类型的参数
  • 一个方法可以改变一个对象参数的状态
  • 一个方法不能让对象参数引用一个新的对象
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值