"greetSome( "world" )"可以替换为"greetSome(name)"吗?这种变化有什么副作用吗?



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

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

greetSomeone("world")可以替换为greetSomeone(name).我之所以问这个问题,是因为我注意到如果greetSomeone("world")确实被greetSomeone(name)替换,在公共void greetSome()方法中,传递的"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();
    }
}

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

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

其次,设计有点狡猾。它可以简化。

第三,是的,您可以引用该类中定义的 String 对象名称,并且只需调用"name"即可访问对象的原语。为什么在System.out时无法打印参考?因为 String 对象会为您处理它,确保 toString 将显示基元。当你做System.out.print(myObject)时;控制台将显示对象默认值或重写的 toString 方法。

因此,如果您创建一个对象并执行System.out.print(myObject),您将看到引用。如果你覆盖返回"test"的字符串,你会看到test。

从技术上讲,name都可以传递,name = name;是有效的Java。

然而,这是一个可怕的设计,可能仅用于演示目的。别这样。

最新更新