java访问控制权限

1、 java中为什么要设计访问控制权限机制了?

​ A:为了使用户不要调用他们不应该调用的部分,这些部分对于类内部的操作是必要的,但是它并不是客户端程序员所需接口的一部分。

​ B:为了让类库设计者可用更改类的内部工作方法,而不必担心会对用户造成重大影响。

2、java中访问权限控制的等级?

​ Public> Protected > 包访问权限(没有权限修饰词)default > private

3、包的介绍

​ Java中包(package)的概念和C++中命名空间(namespace)的概念很类似,都可以限制类的作用域。二者最大的差别在于,Java中的包隐式地指明了类的树形层级结构(同时也是Java源码文件的目录结构)。这样做的好处在于:可以通过文件系统中对于文件路径唯一性的要求来限制类的唯一性。

​ 编写一个Java源代码文件(.java文件)时,此文件通常被称为编译单元。在编译单元内最多允许有一个public类,且该类的名称必须与文件名完全相同(包括大小写)。

​ 编译一个.java文件时,在.java文件中的每个类都会有一个.class输出文件,这个文件名和类名是相同的。Java可运行程序是一组可以打包并压缩为一个Java文档文件(JAR包,使用Java的jar文档生成器)的.class文件。Java解释器负责这些文件的查找、装载和解释。

​ 类库实际上是一组类文件。其中每个.java文件最多允许有一个public类,以及任意数量的非public类。因此,每个文件都有一个构件。如果要将这些构件(每个构建有一个.java文件和若干个.class文件)组织起来,形成不同的群组,可以使用Java中的关键字package

3.1 包的作用

​ (1) 把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。

​ (2) 如同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,包可以避免名字冲突。

​ (3) 包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。

4、package:包访问权限

​ 如果不提供任何访问权限修饰词,则意味着它是包访问权限

​ 默认访问权限没有任何关键字,但通常是指包访问权限(有时也表示为friendly,有点像C++中的友元概念)。这意味着包中所有其他类都可以访问这个成员或方法,但是这个包之外的所有类不可以访问

​ 如果一个类、类属变量及方法不以这三种修饰符来修饰,它就是friendly类型的,那么包内的任何类都可以访问它,而包外的任何类都不能访问它(包括包外继承了此类的子类),因此,这种类、类属变量及方法对包内的其他类是友好的,开放的,而对包外的其他类是关闭的。

1
2
3
4
5
6
7
package com.notes.packages.test;
public class Info {
void print() { System.out.println("default method -- print()"); }
}

5、public:接口访问权限

​ 使用public关键字,就意味着被声明的成员或方法对所有人都是可以访问的

1
public void print() { System.out.println("default method -- print()");

6、private :无法访问

​ 使用private关键字,就意味着被声明的成员或方法,除了本类,其他任何类都无法访问

应用场景:单例模式http://wuchong.me/blog/2014/08/28/how-to-correctly-write-singleton-pattern/

1
2
3
4
5
6
7
8
9
public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}

7、protected:继承访问权限

​ 新类(称之子类或派生类)通过继承可以复用一个现有类(称之父类或基类),然后扩展基类的成员、方法。有时,基类的创建者会希望某个特定成员,将它的访问权限赋予派生类而不是所有类。public无法做到这一点,为此,引入了protected来完成这一工作。protected也提供包访问权限,也就是说,派生类以及相同包内的其他类都可以访问protected成员或方法**。

例:子类继承父类后,可以访问父类的protected成员。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
class Father {
private String a = "private";
protected String b = "protected";
public String c = "public";
};
class Son extends Father {
publicvoid print() {
// System.out.println("element a:" + super.a); // Error
System.out.println("element b:" + super.b);
System.out.println("element c:" + super.c);
}
}
publicclass ProtectedDemo01 {
publicstaticvoid main(String args[]) {
Son sub = new Son();
sub.print();
}
};

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
Fork me on GitHub