我是 Java 新手,正在尝试学习内部类的概念。我从Java教程Oracle中看到了下面的代码。我的问题是,对于
String name = "world";
@Override
public void greet() {
greetSomeone("world");
}
能否将greetSomeone("world")
替换为greetSomeone(name)
。我问这个问题的原因是因为我注意到 public voidgreetSomeone( 内部的 greetSomeone("world")
是否确实被 greetSomeone(name)
替换) 方法时,传递的“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。你 parent 的方法没有行为,因为它是一个接口(interface)。作为进一步说明,我想它会告诉您重写方法的签名必须始终与父级的签名相匹配。
其次,设计有点狡猾。可以简化。
第三,是的,您可以引用该类中定义的 String 对象名称,并且只需调用“name”即可访问该对象的原语。为什么 System.out 时不会打印引用信息?因为 String 对象会为您处理该问题,确保 toString 会向您显示原语。当您执行 System.out.print(myObject); 时控制台将向您显示对象默认值或覆盖的 toString 方法。
因此,如果您创建一个对象并执行 System.out.print(myObject),您将看到引用。如果您覆盖 toString 返回“test”,您将看到 test。
关于java - 可以 `greetSomeone("world")` be replaced by `greetSomeone(name)`吗?此更改有任何副作用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35665265/