Java中的访问权限控制

本章精华摘录

编写一个Java源代码文件时,此文件被称为编译单元或转译单元。每个编译单元必须有一个后缀.java,而在编译单元内可以且只能有一个public类,否则编译器不会接受。如果编译单元之中还有额外的类,在包之外的世界是无法看见这些类的,因为他们不是public类,且这些类主要用于为public类提供支持

当编译一个.java文件时,.java文件中的每一个类都会有一个输出文件,该文件名称与.java每个类的名称相同,只是多了一个后缀.class。因此,在编译少量.java文件时,会得到大量的.class文件。Java可运行程序时一组可以打包并压缩为一个java文档文件的.class文件。Java负责这些文件的查找、装载和解释。

类库实际上是一组类文件,其中每个文件都有一个public类,以及任意数量的非public类,因此每个文件都有一个构件。如果希望这些构件(每一个都有独立的.java.class文件)从属于一个群组,就可以使用关键字package

Java访问权限修饰符

无修饰符:包访问权限

void bite(){}
//只向在包中的类提供访问权限

默认包

package access;

class Cake {
    public static void main(String[] args) {
        Pie x = new Pie();
        x.bite();
    }
}
package access;

class Pie {
    void bite(){
        System.out.println("yummy~o(* ̄▽ ̄*)ブ");
    }
}

Pie()f()享有包访问权限,Cake.java可以访问它们的原因是它们相处于相同的目录,并且未给自己设定任何包名称,java将这样的文件看作是隶属于该目录的默认包中,于是它们为该目录中所有其他的文件都提供了包访问权限。

ps: 经过测试,把Pie.java和Cake.java均放在src文件目录下正常运行,故可知程序即使不在package中java仍会生成默认包并运行。

public: 接口访问权限

使用关键字public,表示public后紧跟的成员声明对每个人都是可用的,例:

public void bite() {}
//方法bite()对所有人都是可用的

Cookie

package access.dessert;

public class Cookie {
    public Cookie() {
        System.out.println("Cookie Constructor");
    }
    void bite() {
        System.out.println("卡滋卡滋, yummy~!");
    }
}

Dinner上吃Cookie

package access;

import access.dessert.*;

public class Dinner {
    public static void main(String[] args) {
        Cookie x = new Cookie();
        x.bite();//Error:'bite()' is not public in 'access.dessert.Cookie'. Cannot be accessed from outside package
    }
}

小结:如果使用了public修饰,import后就可以访问。若不使用修饰符,由于只向所在包中的类提供访问权,故import后也无法访问。

private: 你无法访问

关键字private:除了包含该成员的类,其他任何类都无法访问这个成员。private可允许你随意修改该成员,而不必考虑是否会影响到包内其他的类。

任何可以肯定只是该类的一个“助手”方法的方法,都可以把它指定为private,以确保不会在包内的其他地方误用到它,也就防止了你会去改变或删除这个方法。将方法设为private确保你拥有这种选择权。

IceCream.java

package access;

class Sundae{
    private Sundae() {}
    static Sundae makeASundae(){
        return new Sundae();
    }
}

public class IceCream {
    public static void main(String[] args) {
        //!Sundae x = new Sundae();
        //Error:'Sundae()' has private access in 'access.Sundae'
        Sundae x = Sundae.makeASundae();
    }
}

protected: 继承访问权限

如果创建了一个新包,并自另一个包继承类,那么唯一可以访问的成员就是源包的public成员。有时基类的创建者希望有某个特定成员,把对它的访问权限赋予派生类而不是所有类,这需要protected来完成这一工作。protected也提供包访问权限,相同包内的其他类也可以访问protected元素。

改进版的Cookie2

package access.cookie2;

public class Cookie {
    public Cookie() {
        System.out.println("Cookie Constructor");
    }
    protected void bite(){
        System.out.println("滋个滋个啊~滋个滋个啊( ̄▽ ̄)");
    }
}

ChocolateChip

package access;
import access.cookie2.*;
public class ChocolateChip extends Cookie{
    public ChocolateChip() {
        System.out.println("ChocolateChip Constructor");
    }
    public void chomp(){
        bite();
    }//protected method
    public static void main(String[] args) {
        ChocolateChip choco = new ChocolateChip();
        choco.chomp();
    }
}

类访问权限

如果获取了 一个access内部的类,用来完成在access中的public类所要执行的任务,如果你认为不久之后可能会想要完全改变原有方案并删除旧版本,代之以不同的版本。为了保留灵活性,需要确保客户端程序员不会依赖于隐藏在access之中的任何特定实现细节,只需将关键字public从类中拿掉,这个类就只拥有包访问权限了(只可以用于该包之中)。

类不可以是private的:这样会使类除该类之外,其他任何类均不可访问。也不可以是protected的。

:事实上,一个内部类可以是private或protected的

故对于类的访问权限,只有包访问权限或public。如果不希望任何人对该类拥有访问权限,可以把所有的构造器指定为private,从而阻止任何人创建该类的对象。

例外:在该类的static成员内部可以创建

原文地址:https://www.cnblogs.com/Glov/p/13440284.html