0

我只是对此感到好奇。我可能没有做对。但是,在我看来,Java 允许降低数据成员的可见性,但不允许成员函数的可见性。我有一个带有公共数据成员和公共函数的父类。如果我去降低 Child 类中成员函数的可见性,则不允许这样做。但是,当我降低数据成员的可见性时,它不会抱怨。

  1. 我是否正确理解这一点?如果不是,我错在哪里?
  2. 如果是这样,为什么允许降低数据成员的可见性?

这是我写的一些代码

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”。

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);

    }
}
4

4 回答 4

4

通过声明一个名为 class 的新实例变量xChild隐藏了超类实例变量x

在类中,与超类中的字段同名的字段会隐藏超类的字段,即使它们的类型不同。在子类中,不能通过其简单名称引用超类中的字段。相反,必须通过 访问该字段super阅读教程以获取更多信息。

您可以在类中编写一个方法Child

public int getParentDataMember() {
    return super.dataMember;
}

并以以下方式访问成员:

System.out.println("Child dataMember = " + c.getParentDataMember());
于 2013-06-08T22:01:58.767 回答
0

好吧,我们可以降低变量的可见性,因为使用相同的变量名会导致变量被遮蔽,这与发生运行时绑定的 methods() 不同。

因此,您可以从父对象调用公共方法(即使它是子对象的实例),如果允许子对象将方法设为私有,则这是不可能的。

于 2013-06-08T22:04:31.907 回答
0

dataMemberChild 类的成员隐藏了您的 Parent 类成员,而不是降低它的可见性。

您可以轻松检查。将 getter 添加到 Child 类:

public int getDataMember() { return dataMember; }

然后在 main 方法中:

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
}
于 2013-06-08T22:06:39.087 回答
0

您不能降低被覆盖方法的可见性——这是法律规定。如果您的父母说您将执行一项服务,那么无论您是否愿意,您都会执行它。如果您不想实现此方法,那么您继承自错误的类。

此外,在子类中声明与父类中的变量同名的变量确实不是一个好主意——这被称为阴影,因为据说子变量将它的影子投射到父变量上,因此它是更难看到。

java中有许多可见性级别:私有意味着除了声明它的类之外没有人可以看到这个东西;protected 表示它正在声明类,并且任何派生类(子类)都可以看到它;package(没有关键字——你没有指定可见性),这意味着声明包中的任何类都可以看到它;和public,这意味着任何地方的任何类都可以访问它。

于 2013-06-08T22:11:28.380 回答