为什么在java子类中可以更容易访问字段或方法的级别访问

因此,据我所知,替换原则不允许子类具有访问权限较弱的字段,否则它可能会违反信息隐藏,并且子类应始终提供至少与其父类相同的行为。这对我来说很有意义。
但同时我不明白扩展字段或方法访问级别有什么意义?我在父类中有一个私有字段,而在子类中有一个公共字段。你能给我举个例子来说明为什么这是有道理的吗?还是仅仅因为设计选择?

明月笑刀无情
浏览 127回答 3
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 testchild test

狐的传说

它可能会违反信息隐藏信息隐藏虽然是一种很好的做法,但与 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)); // 25System.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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java