题目
题型说明:“改正”处填写完整的正确语句。3. (3.0分) 1 class Test {2 int i;3 public static void info3() {4 System.out.println("i = " + i);5 }6}错误:第____行改正:
题型说明:“改正”处填写完整的正确语句。
3. (3.0分) 1 class Test {
2 int i;
3 public static void info3() {
4 System.out.println("i = " + i);
5 }
6}
错误:第____行
改正:
题目解答
答案
错误:第4行
改正:`System.out.println("i = " + Test.i);`
解析:
在Java中,静态方法(用`static`修饰的方法)属于类本身,而不是类的实例。因此,静态方法不能直接访问类的非静态成员变量。在第4行的`System.out.println("i = " + i);`中,`i`是一个非静态成员变量,而`info3`是一个静态方法,所以这里会报错。
为了修复这个错误,有几种方法:
1. **将`i`声明为静态变量**:
```java
class Test {
static int i; // 将i声明为静态变量
public static void info3() {
System.out.println("i = " + i);
}
}
```
2. **在静态方法中通过类名访问非静态变量**:
这种方法不推荐,因为静态方法不应该依赖于非静态变量。但为了演示,可以这样做:
```java
class Test {
int i;
public static void info3() {
Test test = new Test(); // 创建一个Test对象
System.out.println("i = " + test.i); // 通过对象访问非静态变量
}
}
```
3. **将非静态变量转换为静态变量**:
这是最简单和最直接的方法,也是推荐的方法。将`i`声明为静态变量,这样静态方法就可以直接访问它:
```java
class Test {
static int i; // 将i声明为静态变量
public static void info3() {
System.out.println("i = " + i);
}
}
```
在这里,我们选择第一种方法,将`i`声明为静态变量,这样静态方法`info3`就可以直接访问它。因此,改正后的代码如下:
```java
class Test {
static int i; // 将i声明为静态变量
public static void info3() {
System.out.println("i = " + i);
}
}
```
或者,如果必须保持`i`为非静态变量,可以在静态方法中通过创建对象来访问它:
```java
class Test {
int i;
public static void info3() {
Test test = new Test(); // 创建一个Test对象
System.out.println("i = " + test.i); // 通过对象访问非静态变量
}
}
```
但通常情况下,将`i`声明为静态变量是最简单和最清晰的解决方案。
解析
考查要点:本题主要考查Java中静态方法与非静态成员变量的访问关系。
解题核心:理解静态方法不能直接访问非静态变量的规则,掌握通过类名访问静态变量或实例对象访问非静态变量的方法。
关键点:静态方法属于类,而非静态变量属于实例,两者作用域不同,需通过正确的方式建立关联。
错误分析
在第4行代码中,info3()方法是静态方法(因有static修饰),而变量i是非静态成员变量(未被static修饰)。根据Java规则,静态方法不能直接访问非静态变量,因此编译时会报错。
解决方案
有两种可行方法:
-
将
i声明为静态变量:static int i;此时静态方法可直接通过类名或直接访问静态变量。
-
通过类名和实例对象访问非静态变量:
System.out.println("i = " + new Test().i);但此方法需创建实例,可能不符合代码设计意图。
推荐第一种方法,因题目未明确要求i必须为非静态变量。