`greetSomeone("world")` 可以替换为 `greetSomeone(name)` 吗?此更改有任何副作用吗?

Can `greetSomeone("world")` be replaced by `greetSomeone(name)`? Is there any side effect to this change?

我是 Java 的新手,正在尝试学习内在的概念 class。我从 Java Oracle 教程中看到了下面的代码。我的问题是,

String name = "world";
@Override
public void greet() {
    greetSomeone("world");
} 

能否将greetSomeone("world")换成greetSomeone(name)。我问这个问题的原因是因为我注意到 greetSomeone("world") 确实被 greetSomeone(name) 替换了,在 public void greetSomeone() 方法中,传递的 "name"参数将被设置为自身。我只是想知道这样的代码是否有副作用?

public class HelloWorldAnonymousClasses {

    interface HelloWorld {

        public void greet();

        public void greetSomeone(String someone);
    }

    public void sayHello() {
        class EnglishGreeting implements HelloWorld {

            String name = "world";

            @Override
            public void greet() {
                greetSomeone("world");
            }

            @Override
            public void greetSomeone(String someone) {
                name = someone;
                System.out.println("hello " + name);
            }
        }
        HelloWorld eg1 = new EnglishGreeting();
        eg1.greet();

    }

    public static void main(String[] args) {
        HelloWorldAnonymousClasses myApp = new HelloWorldAnonymousClasses();
        myApp.sayHello();
    }
}

技术上,name可以通过,name = name;有效Java。

但是,这是一个糟糕的设计,可能仅用于演示目的。不要这样做。

首先,为什么会有 @Override 注释?

当您想要更改 parent 方法的行为时,您将使用 Override。您的 parent 的方法没有任何行为,因为它是一个接口。作为进一步说明,我想它会告诉您重写方法的签名必须始终与 parent.

中的签名相匹配

其次设计有点狡猾。可以简化一下。

第三,是的,您可以引用 class 中定义的字符串 object 名称,并且您可以通过调用 [=21= 访问 object 的原语].为什么在 System.out 时不打印参考?因为 String object 会为您处理,确保 toString 会向您显示原语。当你做 System.out.print(myObject);控制台将向您显示 Object 默认值或覆盖的 toString 方法。

因此,如果您创建一个 object 并执行 System.out.print(myObject) 您将看到引用。如果您覆盖返回 "test" 的 toString,您将看到 test.