0

我正在开发一个 Java 项目,我们必须实现一个凯撒密码。我有所有的代码工作,但我正在使用这个技巧,我想确保它不会导致未定义的行为。我对 Java 作用域的理解是,如果我byte key在函数内部声明,那么所有对它的引用而不使用关键字this将引用局部变量,使用关键字将引用类字段。我已经测试了该程序并且它运行良好,但我对奇怪技巧的经验是它们可能导致未定义的行为并且并非一直有效。

Class Cipher {
    byte key = -1;

...

String encrypt(String plaintext) {
    byte key = this.key;
    if(this.key == -1) {
          System.out.print("Please enter a key: ");
          key = input.nextByte();
    }
    ...
    }
}

更新:我忘了提供一些背景信息。构建类时,您可以选择指定密钥或不指定密钥,当您不指定密钥时,每次调用 encrypt() 或 decrypt() 时都会提示输入一个密钥。然后在函数内部使用变量键来执行 ROT 移位。

4

3 回答 3

3

您正在做的是用局部变量隐藏key实例变量key。这不是 Java 中未定义的行为。JLS,第 6.4.1 节有这样说:

某些声明可能在其范围的一部分被另一个同名声明所遮蔽,在这种情况下,不能使用简单名称来引用声明的实体。

一个名为 n 的类型的声明 d 遮蔽了任何其他名为 n 的类型的声明,这些类型在 d 出现在整个 d 的范围内的点上。

一个名为 n 的局部变量或异常参数的声明 d 在 d 的范围内隐藏,(a)在 d 出现点的范围内的任何其他名为 n 的字段的声明,

您的代码仍然可以工作,因为您知道如何通过不使用简单名称来访问实例变量:

this.key

但是像这样隐藏变量是不好的做法。将局部变量命名为其他名称。

于 2013-10-09T16:39:45.573 回答
1

这不会导致未定义的行为。

局部变量声明后,this.key表示类字段,key表示局部变量。

于 2013-10-09T16:39:22.070 回答
1

因为你有一个key在类和方法中命名的变量,Java 将默认使用范围最小的变量——方法中的变量。为了引用类中的那个,您必须使用this关键字。

我无法仔细检查您的代码,因为我看不到您对key.

于 2013-10-09T16:41:01.987 回答