前言
小鱼查阅了很多博客,很少有能将public,protected,default(默认不写)以及private讲解的很细节的,我指的细节是从访问权限到为什么我们的类只能被public修饰和default(默认不写)修饰。
在顶级有两个修饰限定符,public和default(默认不写,编译器提供的)
当我的类用public修饰时,我的类对所有类都可见,如果一个类没有写修饰限定符,那么就是系统默认的defaule,仅对自己的包中的类公开。
JAVA类声明中关键字public起到什么作用呢?如下Hello类的声明,按着字面的意思理解是:Hello类是公共的,要求Hello类与类文件名必须保持一致,并且一个java文件中只能有一个public关键字声明的类。
当我们的被public修饰的类型名和文件名一样时,是不会报错的,并且编译的时候会生成与文件名相同的class文件
如果文件名和类名不相同时,编译会出错,并且爆出java: 类HelloWOrd是公共的, 应在名为 HelloWOrd.java 的文件中声明
当pubilc修饰的类在其他包的文件中访问时
也是可以通过编译的,蓝色框框是他们所属的包
总结:
我们的外部类也可以用default来修饰,当我们的文件名和我们的类名不一致时,
Hello.java文件
class HelloWord {
public static void main(String[] args) {
System.out.println("Hello word!!!");
}
}
我们编译一下,没有报错,最后生成了一个HelloWord.class的文件
如果Hello.java中有多个非public关键字声明的类,就会产生多个与之相应的.class文件
当default(默认访问权限)修饰的类在其他包的文件中访问时
defaule只能在自己的包中访问,如果从别的包访问就会产生编译错误。
总结:
一个java文件中可以同时有多个不使用public关键字声明的类,但是编译后会产生多个与之对应的.class文件,并且要执行的文件是对应的多个.class的前缀名
default的权限仅限于自己包内(包访问权限)
是的,我们使用访问修饰符去修饰类,就是为了让类之间根据各种权限来访问。
假如外部类使用private修饰,则不能被其它类所访问,这个类也就失去了意义。
假如外部类使用protected修饰,看起来与default相比,在包内可访问的基础上,包外的子类也可访问。但包外想成为子类需要先继承父类,然而无法找到该父类实际上无法继承(先有鸡还是先有蛋的问题),效果与default一致,也就没必要存在了。
在成员级别中,可以使用public和default(默认访问权限),当然还新增了两个访问修饰符,private和 protected.
private修饰的成员只可以在自己的类中访问,
protected修饰的成员可以在自己的包中访问,也可以被其他包中的该类的子类访问
如果其他程序员在使用你的类,你想要确保不会发生滥用错误,访问级别可以这么选择
我们采取四个对比的方式
我们被private修饰的成员变量在其它类中无法访问
在不同包中的子类和非子类里访问