📅  最后修改于: 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中的两个关键字,它们与可见性修饰符有很大的关联。在使用的时候,需要根据实际情况来选择正确的方式,以实现程序的功能。