Java - 降低可见性 - 成员数据与成员函数

时间:2013-06-08 21:56:20

标签: java

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

  1. 我是否理解正确?如果没有,我错在哪里?
  2. 如果是这样,为什么允许减少数据成员的可见性?
  3. 这是我写的一些代码

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

4 个答案:

答案 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)

Child类的

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(没有关键字 - 你没有指定可见性),这意味着声明包中的任何类都可以看到它;和公众,意味着任何地方的任何阶级都可以访问它。