【问题标题】:Java Multilevel Inheritance - Protected Instance Variable in Level 1 ClassJava 多级继承 - 级别 1 类中的受保护实例变量
【发布时间】:2012-11-05 22:07:51
【问题描述】:

我有一个问题属于 Java 中的多级继承。所有三个类都在同一个包中

我有A类:

public class A {
   protected int x;
}

public class B extends A {
   public void doSomething {
      // x is visible.agreed, as it is a direct subclass of A
   }  
}


public class C extends B {
   public void doSomething {
      // x is still visible, how come? I mean it is at the 2nd level 
     //  I am confused why?
   }  
}

它有什么意义吗?还是我们必须默认采取的行为?

【问题讨论】:

标签: java class inheritance


【解决方案1】:

Java 中的访问级别修饰符有:

  • public - 对所有代码可见
  • protected - 对同一包中的所有代码和子类可见,无论包如何
  • nothing(默认)- 对同一包中的所有代码可见
  • private - 仅对同一类(包括嵌套类)中的代码可见

例如,请参阅 Java 教程 Controlling Access to Members of a Class 或(了解大量技术细节)section 6.6 of the Java Language Specification

【讨论】:

    【解决方案2】:

    标有protected修饰符的变量/方法对同一包中的所有类可见,并且仅对不同包中的子类可见。 以下是示例案例。

    package a;
    class A{
    protected int x;
    }
    class B extends A{
    //x can be accessed from this class
    } 
    
    class C extends B {
    //x can be accessed from this class
    }
    class D{
    //x can be accesed this class but you will have to create A's instance 
    }
    
    package B 
    class One {
    //cannot access x from this class
    }
    class Two extends A {
    //can access x from this class
    }
    

    【讨论】:

    • 但是对于 D 类你不能直接访问它,你必须创建一个 A B 或 C 的对象才能访问它正确吗?
    【解决方案3】:

    关键字的定义

    受保护

    protected修饰符指定该成员只能被访问 在它自己的包中(与 package-private 一样),此外,通过 另一个包中它的类的子类。

    我建议你阅读this

    【讨论】:

      【解决方案4】:

      Java 的protected 关键字一直作用于所有 子类(和members of the package)。 如果Object 中有一个protected 成员,则任何对象都可以访问它。相比之下,private 仅对本地类(和内部类)可见,public 可供所有人访问。

      查看this glossary,它深入展示了protected 成员和方法的继承方式,以及Java documentation on inheritance

      【讨论】:

        【解决方案5】:

        您不能限制对子类中成员的访问。此规则适用于方法(您不能覆盖 public 方法并使其成为 private),但您可以在此处看到类比。如果该字段是protected,那么在每个子类中都是protected,无论多深。当然你不能覆盖 Java 中的字段,只是为了给你一个概述。

        【讨论】:

        • 可以使成员方法在子类中更加可见。
        • @TedHopp:没错,我说你不能restrict(让它们less可见)。但感谢您指出这一点。
        【解决方案6】:

        请参考:http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

        protected 修饰符指定该成员只能在其自己的包(与包私有)以及子类中访问它的类在另一个包中。

        因此,如果您的班级 CAB 共享包,它可以访问

        【讨论】:

          【解决方案7】:

          继承是可传递的:如果类 B 继承自类 A; C类继承自B类;那么 C 也是一个 A 类的子类/子类/后代。

          【讨论】:

            猜你喜欢
            • 2012-05-30
            • 1970-01-01
            • 2021-11-20
            • 2014-06-29
            • 1970-01-01
            • 1970-01-01
            • 2017-07-10
            • 2016-01-01
            • 1970-01-01
            相关资源
            最近更新 更多