我是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。
然而,这是一个可怕的设计,可能仅用于演示目的。别这样。