Java成员修饰符与类型转换全解析
立即解锁
发布时间: 2025-08-17 02:35:31 阅读量: 19 订阅数: 22 


Java编程基础与SCJP认证指南
# Java 成员修饰符与类型转换全解析
## 1. 成员修饰符
### 1.1 volatile 字段
在代码执行过程中,为了提高效率,编译后的代码可能会缓存字段的值。但由于多个线程可以访问同一个字段,因此在读写字段值时,必须确保缓存不会导致数据不一致。`volatile` 修饰符可以告知编译器不要对该字段进行优化,因为这种优化在多线程访问该字段时可能会导致不可预测的结果。
例如,在以下简单示例中,当一个线程执行涉及始终使用 `clockReading` 字段当前值的任务时,另一个线程可能会意外更改该字段的值。将该字段声明为 `volatile` 可确保写操作始终在主字段变量上执行,读操作始终返回正确的当前值。
```java
class VitalControl {
// ...
volatile long clockReading;
// 两次连续读取可能会得到不同的结果。
}
```
### 1.2 其他成员修饰符总结
| 修饰符 | 字段 | 方法 |
| --- | --- | --- |
| static | 定义类变量 | 定义类方法 |
| final | 定义常量 | 方法不能被重写 |
| abstract | 不适用 | 未定义方法体,其类也必须指定为抽象类 |
| synchronized | 不适用 | 一次只能有一个线程执行该方法 |
| native | 不适用 | 声明该方法用另一种语言实现 |
| transient | 对象序列化时,字段的值不会被包含 | 不适用 |
| volatile | 编译器不会尝试优化对字段值的访问 | 不适用 |
### 1.3 复习问题解析
#### 1.3.1 修饰符使用的正确陈述
以下关于修饰符使用的陈述中,哪两个是正确的?
- **选项 (a)**:如果成员声明未指定可访问性修饰符(`public`、`protected` 或 `private`),则该成员只能由其类所在包中的类以及任何包中该类的子类访问。
- **选项 (b)**:不能指定局部变量的可访问性,它们只能在声明它们的块内访问。
- **选项 (c)**:类的子类必须与它们扩展的类位于同一个包中。
- **选项 (d)**:局部变量可以声明为 `static`。
- **选项 (e)**:对象本身没有任何可访问性修饰符,只有对象引用才有。
正确答案是 (a) 和 (b)。
#### 1.3.2 代码错误检查
给定以下源代码,哪个注释行可以取消注释而不引入错误?
```java
abstract class MyClass {
abstract void f();
final void g() {}
//final void h() {}
// (1)
protected static int i;
private int j;
}
final class MyOtherClass extends MyClass {
//MyOtherClass(int n) { m = n; }
// (2)
public static void main(String[] args) {
MyClass mc = new MyOtherClass();
}
void f() {}
void h() {}
//void k() { i++; }
// (3)
//void l() { j++; }
// (4)
int m;
}
```
正确答案是 (c)。因为 `i` 是 `protected static` 变量,在子类中可以访问并修改。
#### 1.3.3 程序编译和运行结果
以下程序编译和运行的结果是什么?
```java
class MyClass {
static MyClass ref;
String[] arguments;
public static void main(String[] args) {
ref = new MyClass();
ref.func(args);
}
public void func(String[] args) {
ref.arguments = args;
}
}
```
正确答案是 (e)。程序将成功编译并运行,因为静态方法 `main` 可以创建对象并调用非静态方法,非静态方法也可以访问静态变量。
#### 1.3.4 成员声明的合法性
给定以下成员声明,哪个陈述是正确的?
```java
int a;
// (1)
static int a;
// (2)
int f() { return a; }
// (3)
static int f() { return a; } // (4)
```
正确答案是 (c)。声明 (1) 和 (4) 不能在同一个类声明中出现,因为静态方法 `f()` 无法明确返回哪个 `a`。
#### 1.3.5 修饰符相关陈述的正确性
以下哪个陈述是正确的?
- **选项 (a)**:静态方法可以使用 `this` 关键字调用同一类中的其他非静态方法。
- **选项 (b)**:类可以包含静态和非静态变量,以及静态和非静态方法。
- **选项 (c)**:类的每个对象都有其在类中声明的静态变量的独立实例。
- **选项 (d)**:实例方法可以访问静态方法的局部变量。
- **选项 (e)**:类中的所有方法在调用时都会隐式传递 `this` 引用作为参数。
正确答案是 (b)。
#### 1.3.6 代码错误检查
以下代码有什么问题?
```java
abstract class MyClass {
transient int j;
synchronized int k;
final void MyClass() {}
static void f() {}
}
```
正确答案是 (c)。字段 `k` 不能声明为 `synchronized`,因为 `synchronized` 只能用于方法。
#### 1.3.7 合法成员声明
以下哪个不是类中合法的成员声明?
- **选项 (a)**:`static int a;`
- **选项 (b)**:`final Object[] fudge
0
0
复制全文
相关推荐










