这会导致Java中的未定义行为吗?

这会导致Java中的未定义行为吗?,java,scope,Java,Scope,我正在做一个Java项目,我们必须实现一个Caesar密码。我有所有的代码工作,但我使用这个技巧,我想确保它不会导致未定义的行为。我对Java作用域的理解是,如果我在函数中声明字节键,那么所有不使用关键字this的引用都将引用局部变量,使用关键字将引用类字段。我已经测试了这个程序,它运行得很好,但我的经验是,这些奇怪的技巧可能会导致未定义的行为,并且不能一直工作 Class Cipher { byte key = -1; ... String encrypt(String plain

我正在做一个Java项目,我们必须实现一个Caesar密码。我有所有的代码工作,但我使用这个技巧,我想确保它不会导致未定义的行为。我对Java作用域的理解是,如果我在函数中声明
字节键
,那么所有不使用关键字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()时都会提示输入密钥。然后在函数内部使用变量键执行旋转移位。

这不会导致未定义的行为


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

这不会导致未定义的行为

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

您所做的是用局部变量
key
隐藏
key
实例变量。这在Java中不是未定义的行为。政府这样说:

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

一个名为n的类型的声明d会在整个d的范围内出现d的点处隐藏范围内任何其他名为n的类型的声明

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

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

this.key
但是像这样对变量进行阴影处理是不好的做法。将局部变量命名为其他名称。

您所做的是使用局部变量
key
隐藏
key
实例变量。这在Java中不是未定义的行为。政府这样说:

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

一个名为n的类型的声明d会在整个d的范围内出现d的点处隐藏范围内任何其他名为n的类型的声明

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

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

this.key

但是像这样对变量进行阴影处理是不好的做法。将局部变量命名为其他名称。

因为类和方法中有一个名为
key
的变量,Java默认使用范围最小的变量,即方法中的变量。要引用类中的一个,必须使用
this
关键字


我无法再次检查您的代码,因为我看不到您对
key

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


我不能再次检查您的代码,因为我看不到您对
键的所有使用

我不明白,您在说什么样的未定义行为?它是怎么不起作用的,是什么让你这么想的?它会像你想的那样起作用我不明白,你在说什么样的未定义的行为?它是如何工作的,是什么让你这么想的?它会像你想的那样工作,你是说我应该在函数内部使用一个完全不同的变量来执行加密/解密吗?我知道这有什么意义,它比隐藏变量更清晰。是的,将一个局部变量命名为作用域中的另一个变量(例如实例变量)是令人困惑的。是的,我知道。我刚刚意识到如果我使用另一个变量,我可能会给它取个不同的名字。那么你是说我应该在函数中使用一个完全不同的变量来执行加密/解密?我知道这有什么意义,它比隐藏变量更清晰。是的,将一个局部变量命名为作用域中的另一个变量(例如实例变量)是令人困惑的。是的,我知道。我刚刚意识到,如果我使用的是另一个变量,我不妨给它取个不同的名字。