您的位置 首页 java

JavaTalk第二期:Java中的访问权限修饰符

JavaTalk第二期:Java中的访问权限修饰符

Java 中的访问权限修饰符共有四种,分别是:

  • Default : 没有关键字修饰的
  • Private
  • Protected
  • Public

按照对于调用者来说可见性从小到大的次序排序是:

Private < Default < Protected < Public

在Java中访问修饰符可以作用在 class (类) ,field (属性) ,method (方法)上。

注意:作用在类上时,private , protected 只能作用在内部类上,而不能作用在外部类上。这在语法上是不允许的会引起编译错误。

JavaTalk第二期:Java中的访问权限修饰符

JavaTalk第二期:Java中的访问权限修饰符

Private

用 private 修饰的部分只能在当前类中访问,它们的可见性范围就是当前类。 在当前类之外无法通过硬编码的方式直接使用。这也是 Java 封装性的体现,以及安全性体现,将潜在的变化隐藏在自己内部不要对外界暴漏。

 package org.blackhat.chapter2.privatemodifier;

/**
 * @author blackhat
 */public class A {

    private int num = 100;

    private void printNum() {
        System.out.println("num = " + this.num);
    }

    public static void main(String[] args) {
        new A().printNum();
    }
}

class Simple {

    public static void main(String[] args) {

        A a = new A();
//        a.printNum(); // Compile Time Error
    }
}  

Default

访问修饰符为 default 的部分,允许本类中访问,允许在相同 package 下的非子类中访问 ,允许在相同 package 下的子类中访问。不允许在不同 package 下的类中访问,即使这个类是子类。

 package org.blackhat.chapter2.defaultmodifier;
/**
 * @author blackhat
 */class A {

    int num = 100;

    void printNum() {
        System.out.println("num = " + this.num);
    }

}  
 package org.blackhat.chapter2.defaultmodifier;

/**
 * @author blackhat
 */public class ASimple {

    public static void main(String[] args) {
        A a = new A();
        System.out.println(a.num);
        a.printNum();
    }
}  
 
package org.blackhat.chapter2.defaultmodifier;

/**
 * @author blackhat
 */public class ASub extends A {

    void invokeSuperPrintNum() {
        super.printNum();
    }

    int getNum() {
       return super.num;
    }
}  
 
package org.blackhat.chapter2.defaultmodifier;

/**
 * @author blackhat
 */public class ASubSimple {

    public static void main(String[] args) {
        ASub aSub = new ASub();
        aSub.invokeSuperPrintNum();
        System.out.println(aSub.getNum());
    }
}  
 package org.blackhat.chapter2.defaultmodifier.otherpackage;


/**
 * @author blackhat
 */class ASimple {

    public static void main(String[] args) {
//        new A(); // Compile Time Error
    }
}  
 package org.blackhat.chapter2.defaultmodifier.otherpackage;


/**
 * @author blackhat
 *///public class ASub extends A { // Compile Time Error
//}  

Protected

protected 修饰的部分,允许在本类中访问,允许在相同的 package 中访问,允许在子类中访问。不允许在不同的 package 的非子类中访问。

 
package org.blackhat.chapter2.protectedmodifier;

/**
 * @author blackhat
 */public class A {

    protected int num = 100;

    protected void printNum() {
        System.out.println("num = " + this.num);
    }

    public static void main(String[] args) {
        new A().printNum();
    }
}  
 package org.blackhat.chapter2.protectedmodifier;

/**
 * @author blackhat
 */public class Simple {

    public static void main(String[] args) {
        A a = new A();
        a.printNum();
        System.out.println(a.num);
    }
}  
 package org.blackhat.chapter2.protectedmodifier;

/**
 * @author blackhat
 */public class ASub extends A {

    void invokeSuperPrintNum() {
        super.printNum();
    }

    int getNum() {
        return super.num;
    }
}  
 package org.blackhat.chapter2.protectedmodifier;

/**
 * @author blackhat
 */public class ASubSimple {

    public static void main(String[] args) {
        ASub aSub = new ASub();
        aSub.invokeSuperPrintNum();
        System.out.println(aSub.getNum());
    }
}  
 
package org.blackhat.chapter2.protectedmodifier.otherpackage;

import org.blackhat.chapter2.protectedmodifier.A;

/**
 * @author blackhat
 */public class OtherASub extends A {

    void invokeSuperPrintNum() {
        super.printNum();
    }

    int getNum() {
        return super.num;
    }
}  
 
package org.blackhat.chapter2.protectedmodifier.otherpackage;


import org.blackhat.chapter2.protectedmodifier.ASub;

/**
 * @author blackhat
 */public class ASubSimple {

    public static void main(String[] args) {
        ASub aSub = new ASub();
//        aSub.invokeSuperPrintNum(); // Compile Time Error
//        System.out.println(aSub.getNum()); // Compile Time Error
    }
}  

Public

public 也就是完全公开的,被它修饰的部分允许在任何位置访问。

内部类也同样遵守上面的规则

 package org.blackhat.chapter2;

/**
 * @author blackhat
 */public class OuterSuper {

    int defaultNum = 1000;

    protected int protectedNum = 2000;
}  
 package org.blackhat.chapter2;

/**
 * @author blackhat
 */public class Outer extends OuterSuper {

    private int a = 100;
    int b = 200;
    protected int c = 300;

    private class Inner1 {

        void fun() {
            System.out.println("Outer.a = " + Outer.this.a
                    + " , Outer.b = " + Outer.this.b
                    + " ,  Outer.c = " + Outer.this.c
                    + ", OuterSuper.defaultNum = " + Outer.super.defaultNum
                    + ", OuterSuper.protectedNum = " + Outer.super.protectedNum);
        }
    }

    class Inner2 {

        void fun() {
            System.out.println("Outer.a = " + Outer.this.a
                    + " , Outer.b = " + Outer.this.b
                    + " ,  Outer.c = " + Outer.this.c
                    + ", OuterSuper.defaultNum = " + Outer.super.defaultNum
                    + ", OuterSuper.protectedNum = " + Outer.super.protectedNum);
        }
    }

    protected class Inner3 {

        void fun() {
            System.out.println("Outer.a = " + Outer.this.a
                    + " , Outer.b = " + Outer.this.b
                    + " ,  Outer.c = " + Outer.this.c
                    + ", OuterSuper.defaultNum = " + Outer.super.defaultNum
                    + ", OuterSuper.protectedNum = " + Outer.super.protectedNum);
        }
    }
}  
 
package org.blackhat.chapter2.otherpackage;

import org.blackhat.chapter2.OuterSuper;

/**
 * @author blackhat
 */public class OtherOuter extends OuterSuper {

    private int a = 100;
    int b = 200;
    protected int c = 300;

    private class Inner1 {

        void fun() {
            System.out.println("Outer.a = " + OtherOuter.this.a
                    + " , Outer.b = " + OtherOuter.this.b
                    + " ,  Outer.c = " + OtherOuter.this.c
//                    + ", OuterSuper.defaultNum = " + OtherOuter.super.defaultNum // Compile Time Error
                    + ", OuterSuper.protectedNum = " + OtherOuter.super.protectedNum);
        }
    }

    class Inner2 {

        void fun() {
            System.out.println("Outer.a = " + OtherOuter.this.a
                    + " , Outer.b = " + OtherOuter.this.b
                    + " ,  Outer.c = " + OtherOuter.this.c
//                    + ", OuterSuper.defaultNum = " + OtherOuter.super.defaultNum // Compile Time Error
                    + ", OuterSuper.protectedNum = " + OtherOuter.super.protectedNum);
        }
    }

    protected class Inner3 {

        void fun() {
            System.out.println("Outer.a = " + OtherOuter.this.a
                    + " , Outer.b = " + OtherOuter.this.b
                    + " ,  Outer.c = " + OtherOuter.this.c
//                    + ", OuterSuper.defaultNum = " + OtherOuter.super.defaultNum // Compile Time Error
                    + ", OuterSuper.protectedNum = " + OtherOuter.super.protectedNum);
        }
    }
}
  

JavaTalk 代码仓库 :

文章来源:智云一二三科技

文章标题:JavaTalk第二期:Java中的访问权限修饰符

文章地址:https://www.zhihuclub.com/192818.shtml

关于作者: 智云科技

热门文章

网站地图