我正在开发一个Java项目,我们必须实现一个Caesar Cipher。我有所有的代码工作,但我正在使用这个技巧,我想确保它不会导致未定义的行为。我对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移位。
答案 0 :(得分:3)
您正在做的是使用局部变量key
遮蔽 key
实例变量。这不是Java中未定义的行为。 JLS, Section 6.4.1可以这样说:
某些声明可能会在其作用域的一部分中被另一个同名声明所遮蔽,在这种情况下,简单名称不能用于引用声明的实体。
和
名为n的类型的声明d会影响名称为n的任何其他类型的声明,这些声明在整个d范围内出现d的范围内。
另外
在整个d范围内,名为n shadows的局部变量或异常参数的声明d,(a)在d出现的范围内的范围内名为n的任何其他字段的声明,
您的代码仍然有效,因为您知道如何通过不使用简单名称来访问实例变量:
this.key
但影响像这样的变量是不好的做法。将局部变量命名为其他内容。
答案 1 :(得分:1)
这不会导致未定义的行为。
在声明局部变量之后,this.key
将表示类字段,而key
将表示局部变量。
答案 2 :(得分:1)
因为类和方法中有一个名为key
的变量,Java将默认使用范围最小的变量 - 方法中的变量。要引用课程中的一个,您必须使用this
关键字。
我无法仔细检查您的代码,因为我看不到key
的所有用途。