8.6. 封装性与访问控制

访问控制分为4个等级:

- 私有
- 默认
- 保护
- 公有

Java类成员的访问控制

image0

image1

8.6.1. 私有级别

PrivateClass.java

# 定义了一个私有类,声明了构造方法,和一个printX方法
package PrivaterClass_test;

public class PrivateClass {
    private int x;

    public PrivateClass() {
        x = 100;
    }
    private void printX() {
        System.out.println("Value Of is " + x);
    }

}

HelloWord.java

package PrivaterClass_test;

public class HelloWorld {
    public static void main(String[] args) {
        PrivateClass p;
        p = new PrivateClass();

//      编译错误,PrivateClass中的方法 printX()不可见
        p.printX()
        }

}

执行HelloWord会报错,因为PrivateClass中printX()的方法是私有方法

8.6.2. 默认级别

  • 在同一个包内,默认级别的使用

DefaultClass.java

package DefaultClass_test;

public class DefaultClass {
    int x;

    public DefaultClass() {
//      构造方法
        x = 100;
    }

    void printX() {
        System.out.println("Value Of is " + x);
    }

}

HelloWorld.java

package DefaultClass_test;

public class HelloWorld {
    public static void main(String[] args) {
        DefaultClass  p;
        p = new DefaultClass();
        p.printX();
    }

}

编译通过

Value Of is 100
  • 在不同的包中,默认级别的使用
import DefaultClass_test.DefaultClass;

public class Defalut_class_test {

    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        DefaultClass  p;
        p = new DefaultClass();
//      编译错误,DefaultClass中的方法,printX()不可见
        p.printX();

    }

}

该HelloWorld.java文件与DefaultClass类不在同一个包中,printX()是默认访问级别,所以p.printX()方法无法编译通过

8.6.3. 公有级别

  • 同一个包内
PublicClass.java
package PublicClass_test;

public class PublicClass {
    //公有级别变量
    public int x;

    public PublicClass() {
        x = 100;
    }

    public void printX() {
        // 公有级别方法
        System.out.println("Value Of is " + x);
    }

}
HelloWorld.java
package PublicClass_test;

public class HelloWorld {
    public static void main(String[] args) {
        PublicClass p;
        p = new PublicClass();
        p.printX();
    }
}


打印输出正常
  • 不同的包内
package DefaultClass_test;

import PublicClass_test.PublicClass;

public class HelloWorld {
    public static void main(String[] args) {
        PublicClass p;
        p = new PublicClass();
        p.printX();
        System.out.println(p.x);
    }

}


打印输出正常
Value Of is 100
100

在不同的包内和在同一个包内,都能正常调用类中的方法和变量

8.6.4. 保护级别

保护级别的关键字是protected,保护级别在同一包中完全与默认访问级别一样,但是不同包中子类能 够继承父类中的protected变量和方法,这就是所谓的保护级别,“保护”就是保护某个类的子类都能继承该类的变量和方法。

8.6.5. 总结:

访问成员有两种方式:一种是调用,即通过类或对象调用它的成员,如p.printX()语句;
另一种是继承,即子类继承父类的成员变量和方法。
访问级别顺序
是:私有级别→默认级别→保护级别→公有级别
1.公有访问级别任何情况下两种方式都可以;
2.默认访问级别在同一包中两种访问方式都可以,不能在包之外访问;
3.保护访问级别在同一包中与默认访问级别一样,两种访问方式都可以。但是在不同包之外只能继承访问;
4.私有访问级别只能在本类中通过调用方法访问,不能继承访问。