3 回答
TA贡献1828条经验 获得超3个赞
https://docs.oracle.com/javase/tutorial/java/IandI/hidevariables.html
父母和孩子有 2 个独立的测试实例。正如你在这个例子中看到的。
public class Main {
public class Parent{
private String test = "parent test";
String getTest() {
return test;
}
}
public class Child extends Parent {
public String test = "child test"; // defining it here hides the parent field
@Override
String getTest() {
return test;
}
}
public static void main(String[] args) {
Main main = new Main();
Parent parent = main.new Parent();
System.out.println(parent.getTest());
Child child = main.new Child();
System.out.println(child.getTest());
}
}
输出:
parent test
child test
TA贡献1804条经验 获得超3个赞
它可能会违反信息隐藏
信息隐藏虽然是一种很好的做法,但与 Liskov 替换原则几乎没有关系。
(A) 子类应始终提供至少与其父类(类)相同的行为。
这是真的,但通过禁止对继承成员使用更严格的访问修饰符来实现。一个较弱的访问修饰符表面附加行为。
class A {
private int lastInput;
protected int getLastInput() {
return lastInput;
}
public int getSquareValue(int input) {
lastInput = input;
return getLastInput()*getLastInput();
}
}
class B extends A {
public int getLastInput() {
return super.getLastInput();
}
}
A aa = new A();
B bb = new B();
A ab = bb;
// All behaviors of A exist in B as well.
// B can be substituted for A.
System.out.println(aa.getSquareValue(5)); // 25
System.out.println(ab.getSquareValue(5)); // 25
// B also has new behaviors that A did not surface.
// This does not prevent B from substituting for A.
System.out.println(bb.getLastInput()); // 5
添加回答
举报