【前端学java】类中的访问权限详解,通俗易懂!

我们来复习一下类中的一些权限知识

访问修饰符

简述

在Java类中,属性可以通过访问修饰符来控制访问权限,访问修饰符有四种

  • private:只能在同一个类中访问。
  • default: (什么都不写)可以在同一个包内访问。
  • protected:可以在同一个包内或子类中访问。
  • public:可以从任何地方访问。

详解

在Java类中,属性也称为成员变量实例变量,其声明语法如下:

xml 复制代码
<访问修饰符> <数据类型> <属性名>;

访问修饰符用于控制属性的可见性和访问范围,也就是Java中的访问权限。

  • private:只能在同一个类中访问。
  • default(默认权限、不写修饰符):可以在同一个包内访问。
  • protected:可以在同一个包内或子类中访问。
  • public:可以从任何地方访问。
同一个类中 同一个包中 不同包的子类 不同包的无关类
public
protected
无(空着不写)
private

Java中内部类与外部类的访问权限详解

什么是内部类,什么是 外部类

首先,我们需要先了解一下什么是内部类 ,什么是外部类

观察下面代码

java 复制代码
package Object;

// 外部类
public class Auth {
    public static void main(String[] args) {

    }
}

// 外部类
class Person {
    // 内部类可以看做外部类的属性
    public class InnerClass {
        
    }
}
  • 在源码中(即Object包内)直接声明的类就是外部类,AuthPerson
  • 在类中声明的类就是内部类 ,如InnerClass

内部类的访问修饰符详解

private

private表示类的私有属性,只能在类自身中访问

如图,我们在Person类中定义了一个私有属性name,在实例化的对象中访问时,会报错

可见,private 修饰的属性只能在类自身中访问!其他类是无法访问的,是最小权限!

default

当我们不写修饰符,即不设定任何权限时,JVM会提供默认权限,即包权限。

java 复制代码
public class Auth {
    public static void main(String[] args) {
        // TODO 面向对象 - 访问权限
        Person people = new Person();
        System.out.println(people.name);
    }
}

class Person {
    String name = "shixiaoshi";
}

同一个包内的其他类是否可以访问?

上述代码中,我们在Person类中定义了name属性,并没有指明权限属性,这个时候它就是默认权限,可以在这个包文件内任意地方访问。

Auth类 中,我们可以通过System.out.println打印people.name的值,因此可见,默认权限属性在包内的任何一个地方都可以访问。

其他包内可以访问吗?

我们在看一个例子,我们定义一个Object2的包,包内的Auth方法中定义一个name属性,他是默认权限。

然后,我们在Object1的包内访问这个name属性

由于name属性是包权限,所以当我们跨包的时候,就无法访问到了。

protected

同一个包内的访问验证

根据上述代码运行结果,我们可以知道,在同一个包内,protected是可以随意访问的

其他包内可以访问吗?

public

public是公共的访问权限修饰符,在任何地方都可以用。

公共类的唯一性

如下图,当我们在同一个java源码中写第二个public时,代码就会报错。

类名与文件名一致性

公共类的文件名必须与源码文件名相同

如下图,源码文件名为Auth,当我们把类名改成Auth1时,代码就会报错

main方法的public

main方法的public是不能删除的。如下图,删除public后,main方法就无法执行了

main方法是有JVM调用的,JVM调用时,应该可以任意调用,而不用考虑权限问题。

main方法的static表示其是Auth类的自身的静态成员,也不能删除(方便JVM虚拟机执行)。

外部类的访问权限详解

下面的Auth类中就有一个私有属性name

java 复制代码
public class Auth {
    private String name ="shixiaoshi";
    public static void main(String[] args) {

    }
}

那Auth类本身可以用这四种修饰符修饰吗

如图,我们定义了四个类,分别加上了不同修饰符

根据编译器的报错结果可知,Java不允许外部类使用privateprotected修饰符

根据public的知识,我们知道一个包内一定有一个和报名同名的公共类,比如包名为People,那么一定有一个People 类,而且它必须通过public修饰。因为public类具有唯一性(回顾 文章 公共类的唯一性 章节的知识),可以得出结论

整个包内所有的外部类,只有主类 (和包名相同的类)可以通过public修饰符修饰(而且必须),其余任何外部类都不能添加任何修饰符!

因此,其他包内只能访问到另一个包的主类!

构造函数的权限

类的构造函数也是支持访问修饰符的。

protected权限

java 复制代码
public class People {
    public static void main(String[] args) {
        Dog ww = new Dog();
    }
}
class Dog {
    protected Dog(){
      System.out.println("汪汪");
  }
}

public权限

java 复制代码
public class People {
    public static void main(String[] args) {
        Dog ww = new Dog();
    }
}
class Dog {
    public Dog(){
      System.out.println("汪汪");
  }
}

default权限

JVM默认提供给类的构造方法,其实就是公共的,无参的构造方法。

private权限

直接使用private权限时,会报错

那么,什么时候private权限是在什么使用呢?

1、类的创建过程复杂(禁止外部类使用)

2、实现单例模式

java 复制代码
public class People {
    public static void main(String[] args) {
        Dog ww = Dog.getInstance();
    }
}
class Dog {
    private static Dog dog = null;
    private Dog(){
      System.out.println("汪汪");
    }
    public static Dog getInstance(){
        if(dog == null){
            dog = new Dog();
        }
        return dog;
    }
}
相关推荐
H5css�海秀8 小时前
今天是自学大模型的第一天(sanjose)
后端·python·node.js·php
SuniaWang8 小时前
《Spring AI + 大模型全栈实战》学习手册系列 · 专题六:《Vue3 前端开发实战:打造企业级 RAG 问答界面》
java·前端·人工智能·spring boot·后端·spring·架构
韩立学长8 小时前
Springboot校园跑腿业务系统0b7amk02(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·后端
sheji34168 小时前
【开题答辩全过程】以 基于springboot的扶贫系统为例,包含答辩的问题和答案
java·spring boot·后端
代码栈上的思考9 小时前
消息队列:内存与磁盘数据中心设计与实现
后端·spring
程序员小假10 小时前
我们来说一下 b+ 树与 b 树的区别
java·后端
Meepo_haha11 小时前
Spring Boot 条件注解:@ConditionalOnProperty 完全解析
java·spring boot·后端
sheji341611 小时前
【开题答辩全过程】以 基于springboot的房屋租赁系统的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
Victor35612 小时前
MongoDB(57)如何优化MongoDB的查询性能?
后端
Victor35612 小时前
MongoDB(58)如何使用索引优化查询?
后端