Java的访问权限详解(3+1)public private protected default

Java使用三个关键字在类的内部设定访问权限:public、private、protected。这些访问指定词(access specifier)决定了紧跟其后被定义的成员(方法或属性)可以被谁使用。public表示紧随其后的元素对任何人都是可用的,而private这个关键字表示除类型创建者(类内部访问)和类型的内部方法之外的任何人都不能访问的元素。private就像你与客户端程序员之间的一堵砖墙,如果有人试图访问private成员,就会在编译时得到错误信息。

Java还有一种默认的访问权限,当没有使用任何访问指定词时,它将发挥作用。这种权限通常被称为“包访问权限”,因为在这种权限下,类可以访问在同一个包中的其他类的成员,但是在包之外,这些成员如同指定了private一样。

protected关键字与默认权限作用相当,差别仅在于在包外继承的类可以访问protected成员,但是不能访问默认权限成员。

(以上是看了Java编程思想中文第四版总结的,英文版没看过。但是关于访问权限的解释有部分是不对的。

由此看来,不论看什么书,都要抱着怀疑的态度,看后实践才是硬道理。)

例子:

1.测试类内访问:

package synnex.demo.access;

public class AccessDemo {

    public String name;
    private int age;
    protected String address;
    String phoneNumber;

    public AccessDemo() {
    }

    /**
     * @param name
     * @param age
     * @param address
     * @param phoneNumber
     */
    public AccessDemo(String name, int age, String address, String phoneNumber) {
        //构造函数属于类的内部方法,可以访问任何权限的成员。
        super();
        this.name = name;
        this.age = age;
        this.address = address;
        this.phoneNumber = phoneNumber;
    }

    public static void main(String[] args) {

        //main方法在类型创建者内部,故也可以访问任何权限的成员。
        AccessDemo demo = new AccessDemo();
        demo.name = "name";
        demo.age = 26;
        demo.address = "beijing";
        demo.phoneNumber = "13520968888";

    }

}

2.包内的类访问:

package synnex.demo.access;

public class PackageAccessDemo {
    public PackageAccessDemo() {
    }

    public static void main(String[] args) {
        AccessDemo demo = new AccessDemo();
        //在同一个包中的类,除了访问不到private类的成员,其他的都可以直接访问到。
        demo.name = "namepackage";
//        demo.age = 26;
        demo.address = "shanghai";
        demo.phoneNumber = "222222222222";
    }

}

3.包外非继承的类访问:

package synnex.demo;

import synnex.demo.access.AccessDemo;

public class AccessOutpackageDemo2 {
    public AccessOutpackageDemo2() {
    }

    public static void main(String[] args) {

        AccessDemo demo = new AccessDemo();
        //对于包外非继承关系的类,只有public权限的成员可以直接访问到。
        demo.name = "out package no extends";
//        demo.age = 26;
//        demo.address = "nanjing";
//        demo.phoneNumber = "13520968888";
    }

}

4.包外继承的类访问:

package synnex.demo;

import synnex.demo.access.AccessDemo;

public class AccessOutpackageDemo1 extends AccessDemo {
    public AccessOutpackageDemo1() {
    }

    public static void main(String[] args) {

        AccessOutpackageDemo1 demo = new AccessOutpackageDemo1();
        //对于包外继承关系的类,public和protected权限的成员可以直接访问到。
        demo.name = "out package extends";
//        demo.age = 26;
        demo.address = "nanjing";
//        demo.phoneNumber = "13520968888";
    }

}

总结如下图:

访问修饰符

同一个类

同包

不同包,子类

不同包,非子类

private

protected

public

默认

上一篇:编程方式操作pdf文件


下一篇:Java基础知识do...while循环语句