zl程序教程

您现在的位置是:首页 >  其它

当前栏目

了解public,protected,default以及private看完这一篇就足够!!!

以及 了解 一篇 Default public Private protected 足够
2023-09-27 14:29:29 时间

前言
小鱼查阅了很多博客,很少有能将public,protected,default(默认不写)以及private讲解的很细节的,我指的细节是从访问权限到为什么我们的类只能被public修饰和default(默认不写)修饰。

在这里插入图片描述



访问级别修饰符确定其他类是否可以使用特定字段或调用特定方法,有两个级别的访问控制

我们知道,在Java中,访问修饰符可以修饰 类、方法、变量和构造方法

在顶级

在顶级有两个修饰限定符,public和default(默认不写,编译器提供的)
当我的类用public修饰时,我的类对所有类都可见,如果一个类没有写修饰限定符,那么就是系统默认的defaule,仅对自己的包中的类公开。

public

JAVA类声明中关键字public起到什么作用呢?如下Hello类的声明,按着字面的意思理解是:Hello类是公共的,要求Hello类与类文件名必须保持一致,并且一个java文件中只能有一个public关键字声明的类。
在这里插入图片描述
当我们的被public修饰的类型名和文件名一样时,是不会报错的,并且编译的时候会生成与文件名相同的class文件
在这里插入图片描述
如果文件名和类名不相同时,编译会出错,并且爆出java: 类HelloWOrd是公共的, 应在名为 HelloWOrd.java 的文件中声明
在这里插入图片描述
当pubilc修饰的类在其他包的文件中访问时
在这里插入图片描述
也是可以通过编译的,蓝色框框是他们所属的包

总结:

  • 一个java文件中只能有一个时public修饰的类
  • 被public修饰的类名要与文件名一致
  • 编译后会产生一个与java文件名相应的.class文件
  • 所有类都可以访问

default(没有显示修饰符即默认访问权限)

我们的外部类也可以用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的权限仅限于自己包内(包访问权限)

只能用public和default修饰类嘛?

  • 是的,我们使用访问修饰符去修饰类,就是为了让类之间根据各种权限来访问。

  • 假如外部类使用private修饰,则不能被其它类所访问,这个类也就失去了意义。

  • 假如外部类使用protected修饰,看起来与default相比,在包内可访问的基础上,包外的子类也可访问。但包外想成为子类需要先继承父类,然而无法找到该父类实际上无法继承(先有鸡还是先有蛋的问题),效果与default一致,也就没必要存在了。

在成员级别

在成员级别中,可以使用public和default(默认访问权限),当然还新增了两个访问修饰符,privateprotected.
private修饰的成员只可以在自己的类中访问,
protected修饰的成员可以在自己的包中访问,也可以被其他包中的该类的子类访问

如何选择访问级别

如果其他程序员在使用你的类,你想要确保不会发生滥用错误,访问级别可以这么选择

  • 我们希望类要尽量做到 “封装”, 即隐藏内部实现细节, 只暴露出 必要 的信息给类的调用者.
  • 因此我们在使用的时候应该尽可能的使用 比较严格 的访问权限. 例如如果一个方法能用 private, 就尽量不要用 public.
  • 另外, 还有一种 简单粗暴 的做法: 将所有的字段设为 private, 将所有的方法设为 public. 不过这种方式属于是对访问权限的滥用。
  • 认真思考这个类是给自己使用还是给外部使用来决定它的访问权限。

实际演示

我们采取四个对比的方式

我们被private修饰的成员变量在其它类中无法访问在这里插入图片描述
在不同包中的子类和非子类里访问
在这里插入图片描述