天天看点

java访问权限详解

java总共有四种种访问修饰符,按照权限的大小排名分别是:

public(公共的)–>protected(受保护的)–>友好的(默认修饰符)–>private(私有的)

其中友好的是java默认的修饰符,也就是当我们不写任何修饰符时则,默认为友好的。

针对类内每个成员的每个定义, Java 访问指示符 public, protected 以及 private 都置于它们的最前面— 无论它们是一个数据成员(变量),还是一个方法。每个访问指示符都只控制着对那个特定定义的访问,也就是说如果修饰的是类则控制着类的访问权限,如果修饰的是方法则控制着这个方法的访问权限。

public(公共的)

这是访问权限最宽松的,它就好比一个免费的公园,所有人都能进来,来者不拒。当一个类、方法或者数据成员被public修饰时,它能够被所有类及方法访问(包含不同包的类)。在java中我们对数据成员保密性要求较高,所以基本上不会用public修饰数据成员。

注意:同一个java源文件(同一个包名)中最多只能有一个public类,并且被public修饰的类名必须与文件名一致(包括大小写)。如果一个源文件中没有public类,则类名无需与源文件保持一致

protected(受保护的)

被protected修饰的属性以及方法只能被类本身的方法及子类访问,即使子类在不同的包中也可以访问,但它不能用来修饰类。所以当我们希望把某些东西隐藏起来,但允许它的衍生类(子类)访问时就可以用protected。

public class FatherClass {

    FatherClass(){
        System.out.println("父类的无参构造函数");
    }

    protected void method(){
        System.out.println("受保护的方法");
    }
}

class Son extends FatherClass{
    Son(){
        System.out.println("子类的无参构造函数");
    }

}

class Test1{
    public static void main(String[] args) {
        Son s =new Son();
        s.method();//访问父类的方法
    }
}
           

友好的(默认修饰符)

当一个类、方法及数据成员不添加任何修饰符时,则默认友好的。通常称为“默认访问权限“或者“包访问权限”。该模式下,只允许在同一个包中进行访问。例如上例中的Test1类就是友好的类。

private(私有的)

它是访问权限最窄的修饰符,被private修饰的属性以及方法只能被类本身的对象所访问,子类也不能访问,更不能跨包访问,但它不能用来修饰类。对于数据成员来说,我们一般都用private来修饰。虽然它是比较自私的,但作用还是比较重要的。例如:

class Sundae {
    private Sundae() {
    }

    static Sundae makeASundae() {
        return new Sundae();
    }
}
public class A {
    public static void main(String[] args) {
        // ! Sundae x = new Sundae();
        Sundae x = Sundae.makeASundae();
    }
}
           

这个例子向我们证明了使用 private 的方便:有时可能想控制对象的创建方式,并防止有人直接访问一个特定的构建器(或者所有构建器)。在上面的例子中,我们不可通过它的构建器创建一个Sundae 对象(即new Sundae());相反,必须调用 makeASundae()方法来实现。另外我们将无参构造函数用private修饰时,可以防止被其他类继承。