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

简介: 【8月更文挑战第9天】类中的访问权限详解,通俗易懂(5)

访问修饰符

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

<访问修饰符> <数据类型> <属性名>;

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

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

private

private表示类的私有属性,只能在类自身中访问
如图,我们在Person类中定义了一个私有属性name,在实例化的对象中访问时,会报错
image.png

default

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

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属性,并没有指明权限属性,这个时候它就是默认权限,可以在这个包文件内任意地方访问。
我们在看一个例子,我们定义一个Object2的包,包内的Auth方法中定义一个name属性,他是默认权限。
image.png
然后,我们在Object1的包内访问这个name属性
image.png
由于name属性是包权限,所以当我们跨包的时候,就无法访问到了。

protected

public

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

公共类的唯一性

如下图,当我们在同一个java源码中写第二个public时,代码就会报错。
GIF 2023-7-25 11-06-59.gif

类名与文件名一致性

公共类的文件名必须与源码文件名相同
如下图,源码文件名为Auth,当我们把类名改成Auth1时,代码就会报错
GIF 2023-7-25 11-10-05.gif

main方法的public

main方法的public是不能删除的。如下图,删除public后,main方法就无法执行了
GIF 2023-7-25 11-16-36.gif

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

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

Java中的内部类与外部类

简述

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

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

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

public class Auth {
   
   
    private String name ="shixiaoshi";
    public static void main(String[] args) {
   
   

    }
}

那Auth类本身可以用这四种修饰符修饰吗?要解决这个问题,我们需要先了解一下什么是内部类,什么是外部类
观察下面代码

package Object;
public class Auth {
   
   
    private String name ="shixiaoshi";
    public static void main(String[] args) {
   
   

    }
}

class People {
   
   
    public class InnerClass {
   
   

    }
}
  • 在源码中(即Object包内)直接声明的类就是外部类,如 Auth、People
  • 在类中声明的类就是内部类,如InnerClass

外部类的修饰符

如图,我们定义了四个类,分别加上了不同修饰符
image.png
根据编译器的报错结果可知,Java不允许外部类使用privateprotected修饰符

内部类的访问

public class People {
   
   
    OuterClass outer = new OuterClass();
    // 内部类可以看做外部类的属性
    OuterClass.InnerClass innerClass = outer.new InnerClass();
}
class OuterClass {
   
   
    // 内部类
    public class InnerClass{
   
   

    }
}

内部类可以看做外部类的一个属性,因此可以使用所有修饰符。上述代码中,通过OuterClass outer = new OuterClass();创建了OuterClass类的实例,通过outer.new InnerClass()实例化了内部类。OuterClass.InnerClass指明了innerClass的数据类型。

单例模式

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

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

public权限

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

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

但是,直接使用private权限时,就会报错
image.png

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

1、类的创建过程复杂(禁止外部类使用)
2、实现单例模式

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;
    }
}
相关文章
|
2月前
|
Java 开发工具
【Azure Storage Account】Java Code访问Storage Account File Share的上传和下载代码示例
本文介绍如何使用Java通过azure-storage-file-share SDK实现Azure文件共享的上传下载。包含依赖引入、客户端创建及完整示例代码,助你快速集成Azure File Share功能。
376 5
|
2月前
|
存储 Java 索引
用Java语言实现一个自定义的ArrayList类
自定义MyArrayList类模拟Java ArrayList核心功能,支持泛型、动态扩容(1.5倍)、增删改查及越界检查,底层用Object数组实现,适合学习动态数组原理。
114 4
|
2月前
|
IDE JavaScript Java
在Java 11中,如何处理被弃用的类或接口?
在Java 11中,如何处理被弃用的类或接口?
200 5
|
2月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
193 1
|
2月前
|
Java Go 开发工具
【Java】(8)正则表达式的使用与常用类分享
正则表达式定义了字符串的模式。正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。
241 1
|
2月前
|
存储 Java 程序员
【Java】(6)全方面带你了解Java里的日期与时间内容,介绍 Calendar、GregorianCalendar、Date类
java.util 包提供了 Date 类来封装当前的日期和时间。Date 类提供两个构造函数来实例化 Date 对象。第一个构造函数使用当前日期和时间来初始化对象。Date( )第二个构造函数接收一个参数,该参数是从1970年1月1日起的毫秒数。
196 1
|
2月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
215 1
|
2月前
|
编解码 Java 开发者
Java String类的关键方法总结
以上总结了Java `String` 类最常见和重要功能性方法。每种操作都对应着日常编程任务,并且理解每种操作如何影响及处理 `Strings` 对于任何使用 Java 的开发者来说都至关重要。
313 5
|
存储 人工智能 前端开发
前端大模型应用笔记(三):Vue3+Antdv+transformers+本地模型实现浏览器端侧增强搜索
本文介绍了一个纯前端实现的增强列表搜索应用,通过使用Transformer模型,实现了更智能的搜索功能,如使用“番茄”可以搜索到“西红柿”。项目基于Vue3和Ant Design Vue,使用了Xenova的bge-base-zh-v1.5模型。文章详细介绍了从环境搭建、数据准备到具体实现的全过程,并展示了实际效果和待改进点。
1064 14
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
352 0

热门文章

最新文章

  • 1
    前端如何存储数据:Cookie、LocalStorage 与 SessionStorage 全面解析
    570
  • 2
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(九):强势分析Animation动画各类参数;从播放时间、播放方式、播放次数、播放方向、播放状态等多个方面,完全了解CSS3 Animation
    228
  • 3
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(八):学习transition过渡属性;本文学习property模拟、duration过渡时间指定、delay时间延迟 等多个参数
    220
  • 4
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(七):学习ransform属性;本文学习 rotate旋转、scale缩放、skew扭曲、tanslate移动、matrix矩阵 多个参数
    159
  • 5
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(六):全方面分析css的Flex布局,从纵、横两个坐标开始进行居中、两端等元素分布模式;刨析元素间隔、排序模式等
    269
  • 6
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(五):背景属性;float浮动和position定位;详细分析相对、绝对、固定三种定位方式;使用浮动并清除浮动副作用
    401
  • 7
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(四):元素盒子模型;详细分析边框属性、盒子外边距
    175
  • 8
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(三):元素继承关系、层叠样式规则、字体属性、文本属性;针对字体和文本作样式修改
    111
  • 9
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(二):CSS伪类:UI伪类、结构化伪类;通过伪类获得子元素的第n个元素;创建一个伪元素展示在页面中;获得最后一个元素;处理聚焦元素的样式
    187
  • 10
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(一):CSS发展史;CSS样式表的引入;CSS选择器使用,附带案例介绍
    257