科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道Java中的可见性研究

Java中的可见性研究

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

public、protected、private这三个modifier估计是每一个javaer都摆脱不了的,它们到底有什么含义和作用呢?我们应该在什么场合如何使用这些modifier呢?

作者:CMTobby 来源:CSDN 2008年3月19日

关键字: 研究 可见性 java

  • 评论
  • 分享微博
  • 分享邮件

publicprotectedprivate这三个modifier估计是每一个javaer都摆脱不了的,它们到底有什么含义和作用呢?我们应该在什么场合如何使用这些modifier呢?这些都是我困扰了鄙人很久的问题了,下面是本人的拙见,不保证正确,有问题可以提出,^_^

publicprotectedprivate再加上那个默认的friendly,我称它们为可见性控制符,不是很专业,呵呵,下面,分别进行阐述。

首先,简要的给出JavaCore里面的总结:

private:仅对本类是可见的;

public:对所有类都是可见的;

protected:对本包(package)及所有子类是可见的;

friendly:对本包内的所有类是可见的;

其次,说明一下我对所谓的可见性的理解。我认为可见性包括两个层次:1.在类B中实例化了类A,能否通过A的对象直接访问A的某个属性或方法;2.B继承了类A,那么能否通过类B的对象来访问类A中的某个属性或者方法。下面以例子(仅以属性为例)说明:

package cn.edu.hust.cm.access;

public class A {

       public static void main(String[] args) {

        A a=new A();

        System.out.println(a.a);

       }

      

       public int getA(){

              return this.a;

       }

       public void setA(int a){

              this.a=a;

       }

       private int a=3;

}

 

package cn.edu.hust.cm.access;

public class B extends A {

       public static void main(String[] args) {

              B b=new B();

              A a=new A();

        C c=new C();

              System.out.println(b.a);

              System.out.println(a.a);

              System.out.println(c.a);

 

       }

}

 

package cn.edu.hust.cm.test;

import cn.edu.hust.cm.access.*;

public class C extends A {

       public static void main(String[] args) {

              C c=new C();

              A a=new A();

        B b=new B();

              System.out.println(c.a);

              System.out.println(a.a); 

              System.out.println(b.a);

       }

}

package cn.edu.hust.cm.access;

public class D {

       public static void main(String[] args) {

              A a=new A();

              B b=new B();

              System.out.println(b.a);

              System.out.println(a.a);

              //System.out.println(d.a);

       }

}

package cn.edu.hust.cm.test;

import cn.edu.hust.cm.access.*;

public class E {

       public static void main(String[] args) {

              A a=new A();

              E e=new E();

C c=new C();

              System.out.println(c.a);

              //System.out.println(a.a);

              System.out.println(e.a);

       }

}

1private修饰符

上面的代码中,BCDE四个类均编译出错,提示错误,具体如下:

B.javaThe field b.a is not visible; The field a.a is not visible; The field c.a is not visible;

C.javaThe field c.a is not visible; The field a.a is not visible; The field b.a is not visible;

D.javaThe field a.a is not visible; The field b.a is not visible;

E.javaThe field a.a is not visible; The field c.a is not visible

据此,我们可以得出结论:当类A中某个域的可见性为private时,1.在任何其它类(不包括A)中均不能通过A的对象来直接访问这个private域;2.A的任意子类B,在任意类(包括B)中均不能通过B的某个对象来访问这个private域。

2public修饰符

我现在把类A中的private改成public,这个时候我发现所有的编译错误都没有了,因此,我们可以得出结论:当类A中某个域的可见性为public时:1.在任何类中,均可以通过A的某个对象来直接访问这个public域;2.A的任意子类B,在任意类中均能通过B的某个对象来访问这个public域。

3friendly(默认)修饰符

public去掉,a前面不用任何修饰符的时候,这个时候编译错误情况如下:

B.javaThe field c.a is not visible

C.javaThe field c.a is not visibleThe field a.a is not visibleThe field b.a is not visible

E.javaThe field a.a is not visibleThe field c.a is not visible

据此,我们可以得出结论:当类A中的某个域的可见性为friendly时,1.只有在与A同包的类中才能够通过A的对象来访问这个friendly域;2.A的任意子类B,如果想在某个类C(任意类)中通过B的对象来访问这个friendly域,必须满足两个条件,BA同包 CA同包。

4protected修饰符

最后一个了,我现在在a前面加上了protected修饰符,此时编译仍然出错,具体如下:

C.javaThe field a.a is not visibleThe field b.a is not visible

E.javaThe field a.a is not visibleThe field c.a is not visible

错误比上面少了一个了,对结果进行分析,可以得出结论:1. 只有在与A同包的类中才能够通过A的对象来访问这个protected域;2. A的任意子类B,如果想在某个类C(任意类)中通过B的对象来访问这个protected域,需满足下面两个条件中的任意一个,类C就是类B或者类C与类A同包。

^_^,就总结这么多了,如果还有什么疏漏的地方请各位大虾指出,以上结论,纯属个人之言,不保证完全正确,如有雷同,实属巧合。

 
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章