为什么我需要在第 4 行的 int empAge 之前添加 final 关键字?


import java.util.*;
class Employee {
public void evaluateStatus(String empID, int empAge) {
final int age = 40;
class Rank {
public char getRank (String empID) {
System.out.print("ntGetting rank of employee: "+empID);
if (empAge >= 40 && empAge <= 60)
return 'B';
else if (empAge >= 61)
return 'A';
else
return 'C';
}
}
if (empAge >= age) {
Rank objRank = new Rank();
char rank = objRank.getRank(empID);
if (rank == 'A' || rank == 'B' || rank == 'C') {
System.out.print("ntEmployee rank is: "+ rank);
System.out.print("ntStatus: Eligible for upgrade.");
} else {
System.out.print("ntStatus: not eligible for upgrade.");
}
} else {
System.out.print("ntStatus: not eligible for upgrade.");
}
}
public static void main(String[] args) {
if (args.length == 2) {
Employee objEmp1 = new Employee();
objEmp1.evaluateStatus(args[0], Integer.parseInt(args[1]));
} else {
System.out.print("ntError!");
}
}
}

我收到以下错误:

Y:studentDesktopAtif>javac Employee.java
Employee.java:13: error: local variable empAge is accessed from within inner class; needs to be declared final
if (empAge >= 40 && empAge <= 60)
^ Employee.java:13: error: local variable empAge is accessed from within inner class; needs to be declared final
if (empAge >= 40 && empAge <= 60)
^ Employee.java:15: error: local variable empAge is accessed from within inner class; needs to be declared final
else if (empAge >= 61)  
^ 3 errors

答案很大程度上是因为 JLS 8.1.3 是这样说的:

[...]

使用的任何局部变量、形式参数或异常参数,但 未在内部类中声明必须声明为 final。

[...]

在这种特殊情况下empAge是您formal parameter。由于它在内部类中使用,但在方法中声明Employee#evaluateStatus因此必须声明为final。 但是,由于您从不重新分配empAge将其声明为final不会造成任何伤害。

作为旁注:

由于您的类Rank基本上只包含一个方法,如果您不打算使用Rank类本身,我宁愿将其声明为Employee范围内的static char getRank()

您的代码不会使用 1.7 版本编译,但会使用 1.8 进行编译。 Java 1.7 的内存管理与 1.8 不同

方法 局部变量在堆栈中分配,类变量在中分配。

现在,当您想在 内部类,您需要将其提升为堆,因为它在类内部使用,并且最终变量在堆中分配,这就是您需要将其声明为 final 的原因

现在为什么我们需要将变量从堆栈提升到堆?

原因:方法执行后,堆栈的作用域不再存在,但方法本地内部类的作用域可以传播到方法之外。我已经修改了您的代码,其中方法本地内部类的范围在方法getRank()之外传播

您的代码(修改):

interface SuperRank{
public char getRank(String empID);
}
class Employee
{
public SuperRank getRank(String empID, final int empAge){
//      final int age = 40;
class Rank implements SuperRank
{
public char getRank (String empID)
{
System.out.print("ntGetting rank of employee: "+empID);
if (empAge >= 40 && empAge <= 60)
return 'B';
else if (empAge >= 61)
return 'A';
else
return 'C';
}
}
return new Rank();
}
public void evaluateStatus(String empID, int empAge)
{
SuperRank rank = getRank(empID,empAge);
char rankChar = rank.getRank(empID);
if (rankChar == 'A' || rankChar == 'B' || rankChar == 'C')
{
System.out.print("ntEmployee rank is: "+ rankChar);
System.out.print("ntStatus: Eligible for upgrade.");
}
else 
{
System.out.print("ntStatus: not eligible for upgrade.");
}
}
public static void main(String[] args)
{
if (args.length == 2)
{
Employee objEmp1 = new Employee();
objEmp1.evaluateStatus(args[0], Integer.parseInt(args[1]));
}
else
{
System.out.print("ntError!");
}
}
}

最新更新