Java方法与类的深入剖析
立即解锁
发布时间: 2025-08-18 01:05:01 阅读量: 2 订阅数: 9 

# Java 方法与类的深入剖析
## 一、队列类的改进
在 Java 编程中,队列类(Cola)的设计至关重要。在之前的版本里,队列类的所有成员使用的是默认访问权限,本质上是公共的。这就可能导致程序直接访问队列的数组,从而无序地访问其元素,破坏了队列“先进先出”的特性。而且,有经验的程序员可能会修改存储在`colocarlug`和`obtenerlug`索引中的值,进而损坏队列。不过,通过使用`private`修饰符可以轻松避免这些问题。
### 具体操作步骤
1. **复制原队列类**:将项目 5.2 中的原队列类复制到一个名为`Cola.java`的新文件中。
2. **添加`private`修饰符**:在`Cola`类中,为数组`q`以及索引`colocarlug`和`obtenerlug`添加`private`修饰符,代码如下:
```java
/*
Proyecto 6.1
Una clase mejorada de cola para caracteres.
class Cola {
// Ahora estos miembros son privados
private char q[]; // esta matriz contiene la cola
private int colocarlug, obtenerlug; // los índices colocar y obtener
Cola(int dimen) {
q = new char[dimen+1]; // asigna memoria a la cola
colocarlug = obtenerlug = 0;
}
// coloca un carácter en la cola
void colocar(char ch) {
if(colocarlug==q.length-1) {
System.out.println(" -- La cola se ha llenado.");
return;
}
colocarlug++;
q[colocarlug] = ch;
}
// obtiene un carácter de la cola
char obtener() {
if(obtenerlug == colocarlug) {
System.out.println(" - La cola se ha vaciado.");
return (char) 0;
}
obtenerlug++;
return q[obtenerlug];
}
}
```
3. **防止不当使用**:将`q`、`colocarlug`和`obtenerlug`的访问权限从默认改为`private`,对于正确使用`Cola`类的程序没有影响,但能避免对`Cola`类的不当使用。例如,以下指令是非法的:
```java
Cola prueba = new Cola(10);
prueba.q(0) = 99; // ¡Incorrecto!
prueba.colocarlug = -100; // ¡No funciona!
```
4. **严格遵循“先进先出”**:现在,`q`、`colocarlug`和`obtenerlug`是`private`的,`Cola`类严格遵循了队列“先进先出”的属性。
## 二、对象传递给方法
在 Java 编程中,到目前为止的示例大多使用简单类型作为方法的参数,但将对象传递给方法也是常见且正确的做法。
### 示例代码
```java
// Pueden pasarse objetos a métodos.
class Bloque {
int a, b, c;
int volumen;
Bloque(int i, int j, int k) {
a = i;
b = j;
c = k;
volumen = a * b * c;
}
// Devuelve true si ob define el mismo bloque.
boolean mismoBloque(Bloque ob) {
if((ob.a == a) & (ob.b == b) & (ob.c == c)) return true;
else return false;
}
// Regresa true si ob tiene el mismo volumen.
boolean mismoVolumen(Bloque ob) {
if(ob.volumen == volumen) return true;
else return false;
}
}
class PasaOb {
public static void main(String args[]) {
Bloque ob1 = new Bloque(10, 2, 5);
Bloque ob2 = new Bloque(10, 2, 5);
Bloque ob3 = new Bloque(4, 5, 5);
System.out.println("ob1 mismas dimensiones que ob2: " +
ob1.mismoBloque(ob2));
System.out.println("ob1 mismas dimensiones que ob3: " +
ob1.mismoBloque(ob3));
System.out.println("ob1 mismo volumen que ob3: " +
ob1.mismoVolumen(ob3));
}
}
```
### 代码解释
上述代码定义了一个`Bloque`类,用于存储三维块的尺寸。`mismoBloque()`方法用于比较传递的`Bloque`对象与调用对象是否具有相同的尺寸,`mismoVolumen()`方法用于比较两个`Bloque`对象是否具有相同的体积。在`PasaOb`类的`main`方法中,创建了三个`Bloque`对象,并调用相应方法进行比较,输出结果如下:
```
ob1 mismas dimensiones que ob2: true
ob1 mismas dimensiones que ob3: false
ob1 mismo volumen que ob3: true
```
### 参数传递方式
在 Java 中,参数传递有两种方式:按值传递和按引用传递。
- **按值传递**:当传递基本数据类型(如`int`或`double`)时,Java 采用按值传递。这意味着将参数的值复制到子程序的形式参数中,对子程序参数所做的更改不会影响调用时的参数。例如以下代码:
```java
// Los tipos simples se pasan por valor.
class Prueba {
/* Este método no le genera cambios al argumento
usado en la llamada. */
void NoCambio(int i, int j) {
i = i + j;
j = -j;
}
}
class LlamadaPorValor {
public static void main(String args[]) {
Prueba ob = new Prueba();
int a = 15, b = 20;
System.out.println("a y b antes de la llamada: " +
a + " " + b);
ob.NoCambio(a, b);
System.out.println("a y b tras la llamada: " +
a + " " + b);
}
}
```
该程序的输出为:
```
a y b antes de
```
0
0
复制全文
相关推荐









