Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关于关键字super的问题_Java - Fatal编程技术网

Java 关于关键字super的问题

Java 关于关键字super的问题,java,Java,在《Java简而言之》一书第3章第3.5节子类和继承中,有这样一段关于使用super访问重写方法的内容: 请注意,super关键字调用方法的最直接重写版本。假设类A有一个子类B,子类B有一个子类C,并且所有三个类都定义了相同的方法f()。方法C.f()可以调用方法B.f(),它使用super.f()直接覆盖该方法。但是C.f()无法直接调用A.f():super.super.f()不是合法的Java语法。当然,如果C.f()调用B.f(),那么可以合理地假设B.f()也可以调用A.f()。使用重

在《Java简而言之》一书第3章第3.5节子类和继承中,有这样一段关于使用super访问重写方法的内容:

请注意,super关键字调用方法的最直接重写版本。假设类A有一个子类B,子类B有一个子类C,并且所有三个类都定义了相同的方法f()。方法C.f()可以调用方法B.f(),它使用super.f()直接覆盖该方法。但是C.f()无法直接调用A.f():super.super.f()不是合法的Java语法。当然,如果C.f()调用B.f(),那么可以合理地假设B.f()也可以调用A.f()。使用重写方法时,这种链接比较常见:它是一种在不完全替换方法的情况下增强方法行为的方法。我们在本章前面所示的finalize()方法示例中看到了这种技术:该方法调用super.finalize()来运行其超类finalization方法


这是什么意思?类C的实例无法调用类a的f()?为什么?它会破坏封装。假设
B.f()。相反,它必须通过
B.f()

但是C.f()没有办法 调用A.f()

是的,绝对正确。您只能调用立即超类方法


准确地看

。如果你发现你想从C中调用A.f(),那么是时候看看你的设计了。C是-a B,所以它不应该试图绕过B回到a中更通用的功能。如果C想调用a.f(),我们如何实现它,以便我可以通过B.f()调用它?B.f()应该调用a.f(),C不应该关心它-它只关心它调用的是B.f()