我对此很好奇。我可能没有做到这一点。但是,在我看来,Java允许降低数据成员的可见性,但不允许降低成员函数的可见性。我有一个父类,有一个公共数据成员和一个公共函数。如果我去降低Child类中成员函数的可见性,则不允许这样做。当我降低数据成员的可见性时,它不会抱怨。
这是我写的一些代码
class Parent {
public int dataMember = 20;
public void function () {
System.out.println ("Called parent");
}
}
public class Child extends Parent {
private int dataMember = 10; // Reduces visibility OK
@Override
//protected void function () { // Reduces visibility NOT OK
public void function () {
System.out.println ("Child class call" );
System.out.println("Child dataMember = " + dataMember
+ " Parent dataMember" + super.dataMember);
}
public static void main(String[] args) {
Child c = new Child ();
c.function();
Parent p = new Parent ();
System.out.println ("Parent data member = " + p.dataMember);
}
}
无法再通过派生类访问数据成员。有没有办法访问' dataMember'通过Child类引用的父类。
public class Another {
public static void main(String[] args) {
Child c = new Child ();
// Cannot access dataMember as expected
//System.out.println("Child dataMember = " + c.dataMember);
// Can access dataMember through parent object as expected
Parent p = new Parent ();
System.out.println("Parent dataMember = " + p.dataMember);
}
}
答案 0 :(得分:4)
通过在x
类中声明一个名为Child
的新实例变量,您隐藏超类实例变量x
。
在一个类中,与超类中的字段具有相同名称的字段隐藏了超类的字段,即使它们的类型不同。在子类中,超类中的字段不能通过其简单引用名称。相反,必须通过super
访问该字段。阅读tutorials以获取更多信息。
您可以在课程Child
中编写一个方法:
public int getParentDataMember() {
return super.dataMember;
}
访问该成员:
System.out.println("Child dataMember = " + c.getParentDataMember());
答案 1 :(得分:0)
我们可以降低变量的可见性,因为使用相同的变量名会导致阴影变量,这与发生运行时绑定的methods()不同。
因此,从父对象可以调用公共方法(即使它是子实例), 如果允许孩子将方法设为私有,这是不可能的。
答案 2 :(得分:0)
dataMember
成员隐藏了您的父类成员,而不是降低其可见性。
您可以轻松检查。将getter添加到Child类:
public int getDataMember() { return dataMember; }
然后在主要方法中:
public static void main(String[] args) {
Parent p = new Parent();
System.out.println(p.dataMember); // 10
Child c = new Child();
System.out.println(c.getDataMember()); // 20
}
答案 3 :(得分:0)
你无法降低被覆盖方法的可见性 - 这就是法律。如果您的父母说您将执行某项服务,那么无论您是否愿意,您都会执行该服务。如果您不想实现此方法,那么您将继承错误的类。
另外,在子类中声明一个与父类中的变量同名的变量真的不是一个好主意 - 这称为阴影,因为子变量被称为将阴影投射到父变量上所以很难看到。
java中有许多可见性级别:private意味着除了声明的类之外,没有人能看到这个东西; protected意味着它声明了类,任何派生类(子)都可以看到它; package(没有关键字 - 你没有指定可见性),这意味着声明包中的任何类都可以看到它;和公众,意味着任何地方的任何阶级都可以访问它。