【问题标题】:Java Access ModifiersJava 访问修饰符
【发布时间】:2013-05-25 14:11:09
【问题描述】:

根据文档的第二个表格 (http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html),没有标识符的成员对子类不可见。
但是,当我运行以下示例代码时,会打印“1”(b 的内容)!

class Class1{
    private int a=0;
    int b=1;
    protected int c=2;
    public int d=3;
}

class Class2 extends Class1{ }

public class HelloWorld{

     public static void main(String []args){
        Class2 klass=new Class2();
        System.out.println(klass.b);
     }
}

如果一个没有访问修饰符的成员不能从子类访问,为什么在这个例子中打印它?
它应该抛出一个错误,就像在私有访问修饰符中一样,不是吗?

【问题讨论】:

  • 不,默认访问修饰符可从同一包中的子类访问
  • 没有标识符的成员对子类不可见。续->“如果不在同一个包内”,如果在同一个包内或在同一个声明文件中,则表示相同情况,可以访问。
  • Here 是表格的一个版本,稍微清晰一些。

标签: java access-modifiers


【解决方案1】:

看起来两个类(Class1 & Class2)都在同一个包中,同一个类HelloWorld它自己和default modifier在类或包中可见。

default modifierno modifier 在java 中有重要意义,它与private 不同,并且它的访问级别在文档中有很好的定义。

【讨论】:

    【解决方案2】:

    这就是所谓的包私有。同一包中的任何类(包括子类)都可以访问默认修饰符。

    在以下位置查看扩展答案: In Java, difference between default, public, protected, and private

    【讨论】:

      【解决方案3】:

      Java 语言规范writes

      • 如果顶级类或接口类型未声明为公共的,则只能从声明它的包中访问它。

      • ...

      • 只有当类型是可访问的并且成员或构造函数声明为允许访问:

        • 如果成员或构造函数被声明为 public,......

        • 否则,如果成员或构造函数被声明为受保护,...

        • 否则,如果成员或构造函数被声明为私有,...

        • 否则,我们说有默认访问,只有当访问发生在声明类型的包内时才被允许。

      所以访问是否来自子类并不重要,重要的是包。

      由于Class1Class2 声明为具有默认访问权限,因此HelloWorld 必须与它们在同一个包中才能编译。

      【讨论】:

        【解决方案4】:

        如果你的修饰符是默认的,你可以通过它的包访问。如果子类与超类相同,则意味着您可以获得结果。有关修饰符的进一步简要说明,请关注我的blog

        【讨论】:

          【解决方案5】:

          在同一个包中,子类可以访问其父类的所有成员元素,这就是它能够打印SOP语句的原因。因为默认修饰符被称为包私有意味着它可以在同一个包中访问。

          是的,当你进入另一个包时,再次使用子类对象,你可以使用默认修饰符访问成员变量。

          也许这个链接会帮助你了解更多。Access modifier in java with example

          【讨论】:

          • 请从您提供的链接中发布基本代码。谢谢!
          猜你喜欢
          • 1970-01-01
          • 2013-12-01
          • 1970-01-01
          • 2017-08-17
          • 2014-11-03
          • 2015-11-26
          • 2019-04-02
          • 2015-03-18
          • 2013-07-29
          相关资源
          最近更新 更多