📜  可见性:隐藏和显示:无之间有什么区别?(1)

📅  最后修改于: 2023-12-03 15:07:27.345000             🧑  作者: Mango

可见性:隐藏和显示:无之间有什么区别?

在程序开发中,我们通常会考虑控制对类、属性和方法的访问权限。Java一般提供了四种可见性修饰符,即public、private、protected和default。其中public表示完全公开,可以被任何类访问;private则表示私有,只能被当前类所访问;而protected则表示受保护的,只有当前类和其子类才能访问。而如果不指定任何可见性修饰符,则默认为default,也称为包级私有,表示只能被相同包中的其他类访问。

在Java中,还有两个特殊的关键字,即隐藏和显示,并且它们与可见性修饰符有很大的关联。隐藏表示将超类中的方法隐藏起来,不被子类继承,而显示则表示将子类中的方法暴露出来,可以被其他类所访问。使用这两个关键字的效果与可见性修饰符不同,这也是它们的区别之一。

隐藏

在Java中,子类可以覆盖父类的方法,这时候就需要考虑是否需要隐藏父类中的该方法。隐藏可以使用private修饰符来实现,这时候子类直接继承了父类的方法,但是无法使用该方法,也无法覆盖该方法。当然,子类也可以定义自己的方法,然后再调用父类方法来实现相应的功能。

示例代码如下:

public class Base {
    public void method() {
        System.out.println("Base method.");
    }
}

public class Sub extends Base {
    private void method() {} // 父类方法被隐藏
}

public class Main {
    public static void main(String[] args) {
        Sub s = new Sub();
        s.method(); // 编译错误:Sub.method() has private access in Sub
    }
}

可以看到,在子类中使用private修饰的method方法会隐藏父类中的该方法,而在Main类中调用时会报编译错误。

显示

与隐藏相反,显示可以使用public修饰符来实现,这时候子类中定义的方法,可以被其他类所访问。这样就可以实现具有相同方法名的多态。示例代码如下:

public class Base {
    public void method() {
        System.out.println("Base method.");
    }
}

public class Sub extends Base {
    public void method() {
        System.out.println("Sub method.");
    }
}

public class Main {
    public static void main(String[] args) {
        Base b = new Sub();
        b.method(); // 输出:Sub method.
    }
}

在这个例子中,Sub类覆盖了Base类的method方法,并且使用public修饰,因此可以被Main类中的Base对象所调用。由于b指向Sub类的实例,因此最终输出的是"Sub method."。

总之,隐藏和显示是Java中的两个关键字,它们与可见性修饰符有很大的关联。在使用的时候,需要根据实际情况来选择正确的方式,以实现程序的功能。