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!");
}
}
}