Java对象操作与数组处理全解析
立即解锁
发布时间: 2025-08-17 02:21:37 阅读量: 2 订阅数: 5 

### Java 对象操作与数组处理全解析
在 Java 编程中,对象和数组是非常重要的概念。下面将详细介绍 Java 中对象的相关操作,包括对象引用传递、对象数组的使用、对象数组的搜索与排序,以及如何使用类来进行数据分组等内容。
#### 1. 对象引用传递
在 Java 中,当我们将对象作为参数传递给方法时,传递的是对象的引用,而不是对象本身。例如,有如下代码:
```java
Part af = new Part("Air Filter", 8.75);
printPart(af);
```
假设 `af` 被分配了地址 `4000`,当调用 `printPart` 方法时,`4000` 会被复制到一个临时位置,然后传递给 `printPart` 方法,在该方法中这个地址被称为形式参数 `p`。由于 `p` 的值是 `4000`,它实际上可以访问原始对象。例如,下面的方法可以修改对象的价格:
```java
public static void changePrice(Part p, double amount) {
p.price += amount;
}
```
调用 `Part.changePrice(af, 1.50)` 可以将 `Air Filter` 的价格增加 `1.50`。需要注意的是,方法不能改变实际参数 `af` 的值,但可以改变 `af` 所指向的对象。
#### 2. 对象数组
在 Java 中,`String` 是对象,所以 `String` 数组实际上是对象数组。不过,`String` 是一种特殊的对象,它是不可变的,并且通常被认为只有一个字段(即字符串中的字符)。下面我们以 `Part` 类为例,介绍对象数组的使用。
```java
public class Part {
private String name; // 实例变量
private double price; // 实例变量
// 方法和静态变量
} //end class Part
```
当我们声明一个 `Part` 变量 `p` 时,`p` 可以保存 `Part` 对象的地址,而不是对象本身。声明只是为 `p` 分配了存储空间,但未对其进行初始化。我们可以将 `null` 值赋给 `p`,也可以创建一个 `Part` 对象并将其地址赋给 `p`:
```java
Part p;
p = null;
p = new Part("Air Filter", 8.75);
```
下面声明一个包含 5 个元素的 `Part` 数组:
```java
Part[] part = new Part[5];
```
Java 会保证这些元素被初始化为 `null`,此时还没有创建 `Part` 对象。我们可以逐个创建对象并将其分配给数组的每个元素:
```java
part[0] = new Part("Air Filter", 8.75);
part[1] = new Part("Ball Joint", 29.95);
part[2] = new Part("Headlamp", 36.99);
part[3] = new Part("Spark Plug", 5.00);
part[4] = new Part("Disc Pads", 24.95);
```
每个元素都包含对应对象的地址。我们可以像操作简单变量一样操作数组的每个元素,例如:
```java
part[2].setPrice(40.00);
```
可以将 `Headlamp` 的价格改为 `40.00`。
如果要处理大量的零件数据,将数据存储在文件中并使用循环读取到数组中是更好的选择。例如,假设文件 `parts.dat` 包含以下数据:
```
AirFilter 8.75
BallJoint 29.95
Headlamp 36.99
SparkPlug 5.00
DiscPads 24.95
```
可以使用以下代码将数据读取到数组中:
```java
Scanner in = new Scanner(new FileReader("parts.dat"));
Part[] part = new Part[5];
for (int h = 0; h < part.length; h++)
part[h] = new Part(in.next(), in.nextDouble());
```
如果需要交换数组中的两个元素,可以使用以下代码:
```java
Part p = part[2];
part[2] = part[4];
part[4] = p;
```
这里只是交换了存储在 `part[2]` 和 `part[4]` 中的地址,实际对象的存储位置并没有改变。
#### 3. 查找最低价格的零件
我们可以编写一个方法来查找数组中价格最低的零件的位置。假设在类外部编写代码,可以使用以下方法:
```java
public static int getLowestPrice(Part[] part, int lo, int hi) {
int small = lo;
for (int h = lo + 1; h <= hi; h++)
if (part[h].getPrice() < part[small].getPrice()) small = h;
return small;
}
```
如果在 `Part` 类内部编写代码,可以直接访问实例变量:
```java
if (part[h].price < part[small].price) small = h;
```
要打印价格最低的零件的名称,可以使用以下代码:
```java
System.out.printf("\nPart with lowest price: %s\n",
part[getLowestPrice(part, 0, part.length - 1)].getName());
```
#### 4. 对象数组的搜索
在 Java 中,搜索对象数组与搜索基本类型数组或字符串数组有所不同。当搜索具有多个字段的对象数组时,搜索键的类型通常与对象的某个字段类型相同。例如,对于 `Person` 类:
```java
public class Person {
String name;
int age;
char gender;
// 构造函数、静态字段和其他方法
}
```
我们可以编写一个顺序搜索方法来查找具有给定名称的 `Person` 对象:
```java
public static int sequentialSearch(String key, Person[] person, int n) {
for (int h = 0; h < n; h++)
if (key.equalsIgnoreCase(person[h].name)) return h;
return -1;
}
```
如果要搜索具有给定年龄的人,只需将 `key` 声明为 `int` 类型,并修改 `if` 语句:
```java
if (key == person[h].age) return h;
```
以下是一个测试顺序搜索方法的示例程序:
```java
import java.util.*;
public class SearchTest {
public static void main(String[] args) {
Person[] person = new Person[7];
person[0] = new Person("Gary", 25, 'M');
person[1] = new Person("Inga", 21, 'F');
person[2] = new Person("Abel", 30, 'M');
person[3] = new Person("Olga", 36, 'F');
person[4] = new Person("Nora", 19, 'F');
person[5] = new Person("Mary", 27, 'F');
person[6] = new Person("Bert", 32, 'M');
Scanner in = new Scanner(System.in);
String s;
System.out.printf("Enter names, one at a time, and I'll tell you\n");
System.out.printf("their age and gender. To end, press Enter\n\n");
while (!(s = in.nextLine()).equals("")) {
int n = sequentialSearch(s, person, person.length);
if (n >= 0)
System.out.printf("%d %c\n\n", person[n].age, person[n].gender);
else System.out.printf("Not found\n\n");
}
}
public static int sequentialSearch(String key, Person[] person, int n) {
for (int h = 0; h < n; h++)
if (key.equalsIgnoreCase(person[h].name)) return h;
return -1;
}
}
class Person {
String name;
int age;
char gender;
Person(String n, int a, char g) {
name = n;
age = a;
gender = g;
}
}
```
除了顺序搜索,我们还可以使用二分搜索
0
0
复制全文
相关推荐









