Java基础访问修饰符全解析

一、Java 访问修饰符概述

Java 中的访问修饰符用于控制类、方法、变量和构造函数的可见性和访问权限,主要有四种:public、protected、default(无修饰符)和 private。

Java 的访问修饰符在编程中起着至关重要的作用,它们决定了类、方法、变量和构造函数在不同场景下的可见性和可访问性。以下分别介绍这四种主要的访问修饰符:

1. public 访问修饰符

public 修饰符是访问权限最宽松的修饰符,表示任何类都可以访问被修饰的类或类成员。无论这个类位于哪个包中,public 成员始终对所有其他类可见。

  • :当一个类被声明为 public 时,任何其他类都可以访问这个类。
  • 字段、方法、构造器:声明为 public 的字段、方法或构造器可以被任何类访问,不受包和继承关系的限制。

例如:

 

// 文件:Animal.java

package com.example;

public class Animal{

public String name;

public void makeSound(){

System.out.println("Animal makes a sound");

}

}

在这个例子中,Animal 类和它的 name 字段以及 makeSound () 方法都被声明为 public,因此任何其他包中的类都可以访问它们。

public 修饰符适用于公共 API 和工具类。当类或方法需要暴露给整个应用程序或多个模块时,public 是理想的选择。比如 Java 中的 Math 类的静态方法通常是 public,因为这些方法是通用工具,需要在多个地方调用。

2. private 访问修饰符

private 修饰符是访问权限最严格的修饰符。使用 private 修饰的成员只能在类内部访问,类的外部(包括其子类)无法访问。

  • :类不能被声明为 private,Java 不允许使用 private 修饰符来限制类的访问权限。
  • 字段、方法、构造器:声明为 private 的字段、方法或构造器仅在声明它们的类内部可见,其他类无权访问。

例如:

 

// 文件:Person.java

package com.example;

public class Person{

private String ssn;// 社会安全号码 (私密数据)

private void displaySsn(){

System.out.println("SSN: "+ ssn);

}

public void setSsn(String ssn){

this.ssn = ssn;

}

}

在这个例子中,ssn 字段和 displaySsn () 方法都是 private,所以它们只能在 Person 类内部被访问。其他类无法直接读取或修改 ssn,只能通过 setSsn () 这样的 public 方法进行控制。

private 修饰符适用于信息隐藏和确保安全性。当类中的某些数据或实现细节不希望被外部访问或修改时,使用 private 是最佳选择,确保了数据封装。敏感数据如密码、个人信息等应使用 private 修饰符,以防止被意外或恶意篡改。

3. protected 访问修饰符

protected 修饰符允许类的成员在同一包内或继承关系中的子类中访问。与 private 不同的是,protected 使得子类可以访问父类的受保护成员。

  • :类不能声明为 protected。
  • 字段、方法、构造器:声明为 protected 的成员在同一个包内的所有类中可见,此外,子类也可以访问它们。

例如:

 

// 文件:Animal.java

package com.example;

public class Animal{

protected String species;

protected void displaySpecies(){

System.out.println("Species: "+ species);

}

}

// 文件:Dog.java

package com.example;

public class Dog extends Animal{

public void showSpecies(){

this.species = "Canine";// 访问 protected 成员

this.displaySpecies();// 访问 protected 方法

}

}

在这个例子中,Animal 类的 species 字段和 displaySpecies () 方法是 protected 的,Dog 作为其子类可以访问这些成员。

protected 修饰符适用于继承和扩展。当希望类的某些成员能被子类继承和使用,但不希望被完全公开时,使用 protected 是合适的选择。

4. default(无修饰符,包访问权限)

如果在类或成员声明时未显式指定访问修饰符,则默认为包级访问权限。这种访问权限仅限于同一包内的类,包外的类无法访问它们。

  • :如果类没有显式声明为 public,它就具有包级访问权限,仅对同一包内的类可见。
  • 字段、方法、构造器:默认修饰符允许同包中的类访问这些成员,但包外的类和子类都无法访问。

例如:

 

// 文件:Animal.java

package com.example;

class Animal{

String name;

void makeSound(){

System.out.println("Animal makes a sound");

}

}

// 文件:Test.java

package com.example;

public class Test{

public static void main(String[] args){

Animal animal = new Animal();

animal.name = "Lion";// 同一包内,访问包级成员

animal.makeSound();

}

}

在这个例子中,Animal 类和它的成员没有访问修饰符,因此只能在 com.example 包内被访问。Test 类可以访问 Animal,但位于其他包中的类将无法访问 Animal。

默认访问权限适用于包内共享。当类或成员只需要在同一个包中共享时,可以使用默认访问权限。

二、四种访问修饰符详解

1. public

  1. 作用:表示被修饰的类、方法、变量或构造函数可以被任何其他类访问。

public 修饰符是访问权限最宽松的修饰符,无论类位于哪个包中,被 public 修饰的类或类成员始终对所有其他类可见。比如一个被声明为 public 的类,任何其他类都可以访问这个类;声明为 public 的字段、方法或构造器可以被任何类访问,不受包和继承关系的限制。

  1. 可见性:同一类内可见、同一包内可见、不同包中的子类可见、不同包中的非子类可见。

在同一类内,自然可以访问 public 修饰的成员;在同一包内,其他类也能访问 public 修饰的成员;不同包中的子类和非子类同样可以访问 public 修饰的成员。

2. protected

  1. 作用:表示被修饰的成员可以被同一包内的类和不同包中的子类访问。

protected 修饰符允许类的成员在同一包内或继承关系中的子类中访问。与 private 不同,protected 使得子类可以访问父类的受保护成员。例如,父类中的 protected 成员在同一包内的所有类中可见,此外,不同包中的子类也可以访问这些成员。

  1. 可见性:同一类内可见、同一包内可见、不同包中的子类可见、不同包中的非子类不可见。

在同一类内,protected 成员是可见的;在同一包内,所有类都可以访问 protected 成员;不同包中的子类可以访问父类的 protected 成员,但不同包中的非子类无法访问。

3. default(无修饰符)

  1. 作用:如果不指定任何访问修饰符,则默认为 default,也称为包级私有。

默认情况下,如果在类或成员声明时未显式指定访问修饰符,就具有包级访问权限。这种访问权限仅限于同一包内的类,包外的类无法访问它们。

  1. 可见性:同一类内可见、同一包内可见、不同包中的子类不可见、不同包中的非子类不可见。

在同一类内,无修饰符的成员可见;在同一包内,其他类可以访问无修饰符的成员;但不同包中的子类和非子类都无法访问这些成员。

4. private

  1. 作用:表示被修饰的成员只能在它所在的类内访问。

private 修饰符是访问权限最严格的修饰符。使用 private 修饰的成员只能在类内部访问,类的外部(包括其子类)无法访问。

  1. 可见性:同一类内可见、同一包内不可见、不同包中的子类不可见、不同包中的非子类不可见。

只有在声明它们的类内部,private 修饰的成员才可见,同一包内的其他类、不同包中的子类以及非子类都无法访问。

三、不同访问修饰符的使用场景

1. public

  1. 适用于需要在多个包中访问的类和实例变量。
    • 当一个类或方法需要被不同包中的多个类访问时,使用 public 修饰符是最合适的选择。例如在设计一个通用的工具类时,可能希望它能够被整个项目中的任何地方调用,这时就可以将工具类声明为 public。如 CSDN 博客中提到的:“public 是最宽松的访问级别,允许类、方法或变量被任何其他类访问。当你希望一个方法或变量可以被任何地方调用或访问时,应使用 public。”
    • 如果一个成员声明为 public,则它对其他所有的类和对象都是可见的。在不同包中的非子类和子类都可以访问 public 修饰的成员,具有最广泛的可见性。
  1. 如果一个成员声明为 public,则它对其他所有的类和对象都是可见的。
    • public 修饰的类、方法、变量或构造函数在同一类内可见、同一包内可见、不同包中的子类可见、不同包中的非子类可见。这意味着无论在哪个位置,只要能够访问到该类所在的包,就可以访问到被 public 修饰的成员。

2. protected

  1. 适用于需要在子类中访问的变量和方法。
    • 在设计类的继承结构时,如果某些变量或方法需要被子类访问,但又不希望被其他包中的非子类访问,那么可以使用 protected 修饰符。CSDN 博客中提到:“当一个变量或方法需要被子类访问但不想让包外的其他类访问时,使用 protected。”
    • 例如在一个父类中定义了一些受保护的方法,子类可以在不同的包中继承并访问这些方法,实现特定的功能扩展。
  1. 如果一个成员声明为 protected,则它对它所在的类、它所在的包内的所有类以及它的子类都是可见的。
    • protected 修饰的成员在同一类内可见、同一包内可见、不同包中的子类可见、不同包中的非子类不可见。这体现了 protected 修饰符在继承关系中的特殊作用,既保证了一定的封装性,又允许子类进行适当的访问和扩展。

3. default(包访问权限)

  1. 适用于同一个包中的所有类和方法。
    • 当类或方法只需要在同一个包内共享时,可以使用默认访问权限,即不使用任何修饰符。CSDN 博客中提到:“当一个变量或方法只需要在同一个包内的类之间共享时,可以不使用任何访问修饰符。”
    • 例如在一个项目中,某些辅助类或方法只在特定的包内使用,不需要对外暴露,这时使用默认访问权限可以避免不必要的访问,提高代码的封装性。
  1. 如果一个成员没有被定义为 public、protected 或 private,它将具有默认访问权限,即同样包中的所有类和方法都可以访问它。
    • 默认访问权限的成员在同一类内可见、同一包内可见、不同包中的子类不可见、不同包中的非子类不可见。这种访问权限限制在同一个包内,有助于将实现细节限制在特定的范围内,保持代码的整洁和组织。

4. private

  1. 适用于需要在本类中使用的变量和方法。
    • 当类中的某些数据或实现细节不希望被外部访问或修改时,使用 private 修饰符是最佳选择。CSDN 博客中提到:“private 是最严格的访问级别,仅允许同一类内部访问。用于封装类的内部状态,防止外部类直接修改这些状态。”
    • 例如在一个类中,可能有一些敏感数据或内部实现的方法,只在本类内部使用,不希望被其他类访问,这时就可以使用 private 修饰符进行封装。
  1. 如果一个成员声名为 private,则它只对当前类内部可见。外部类以及任何继承类都不能访问该成员。
    • private 修饰的成员仅在同一类内可见,同一包内不可见、不同包中的子类不可见、不同包中的非子类不可见。这种严格的访问限制确保了类的内部实现细节不被外部随意访问,实现了良好的封装。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/482628.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浪潮X86服务器NF5280、8480、5468、5270使用inter VROC Raid key给NVME磁盘做阵列

Inter VROC技术简介 Intel Virtual RAID on CPU (Intel VROC) 简单来说就是用CPU的PCIE通道给NVME硬盘做Raid 更多信息可以访问官方支持页面 Raid Key 授权,即VROC SKU 授权主要有用的有2个标准和高级,仅Raid1的授权我暂时没见过。 标准 VROCSTANMOD …

【Pytorch】torch.view与torch.reshape的区别

文章目录 一. 简介:二. Pytorch中Tensor的存储方式2.1 Pytorch中张量存储的底层原理2.2 Pytorch张量步长(stride)属性 三. 对视图(view)的理解四. view()与reshape()的比较4.1 对view()的理解4.1.1 (1)如何理解满足条件 stride[i] stride[i1…

光伏电站设计排布前的准备

1、确定安装地点 地理位置:了解安装地点的经纬度,这对于确定太阳辐射角度和强度非常重要,海拔越高,阳光辐照就越高,比较适合安装光伏电站,根据地理位置还可以确定光伏板的安装倾角是多少,可以进…

5、防火墙一

防火墙的含义 firewalld:隔离功能 病毒防护: 1、入侵检测系统:在互联网访问的过程中,不阻断任何网络访问,也不会定位网络的威胁,提供告警和事后的监督,类似于监控。 2、入侵防御系统&#x…

代码随想录算法训练营第六十天|Day60 图论

Bellman_ford 队列优化算法(又名SPFA) https://www.programmercarl.com/kamacoder/0094.%E5%9F%8E%E5%B8%82%E9%97%B4%E8%B4%A7%E7%89%A9%E8%BF%90%E8%BE%93I-SPFA.html 本题我们来系统讲解 Bellman_ford 队列优化算法 ,也叫SPFA算法&#xf…

详解LZ4文件解压缩问题

详解LZ4文件解压缩问题 一、LZ4文件解压缩方法1. 使用LZ4命令行工具2. 使用Python库3. 使用第三方工具4. 在线解压工具 二、常见问题及解决方法1. 解压显示文件损坏2. 解压后文件大小异常 三、总结 LZ4是一种快速的压缩算法,广泛应用于需要实时压缩和解压缩大文件的…

【Linux网络编程】第四弹---构建UDP服务器与字典翻译系统:源码结构与关键组件解析

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【Linux网络编程】 目录 1、UdpServer.hpp 1.1、函数对象声明 1.2、Server类基本结构 1.3、构造函数 1.4、Start() 2、Dict.hpp…

DBA面试题-1

面临失业,整理一下面试题,找下家继续搬砖 主要参考:https://www.csdn.net/?spm1001.2101.3001.4476 略有修改 一、mysql有哪些数据类型 1, 整形 tinyint,smallint,medumint,int,bigint;分别占用1字节、2字节、3字节…

vxe-table 树形表格序号的使用

vxe-table 树形结构支持多种方式的序号&#xff0c;可以及时带层级的序号&#xff0c;也可以是自增的序号。 官网&#xff1a;https://vxetable.cn 带层级序号 <template><div><vxe-grid v-bind"gridOptions"></vxe-grid></div> <…

精通.NET鉴权与授权

授权在.NET 中是指确定经过身份验证的用户是否有权访问特定资源或执行特定操作的过程。这就好比一个公司&#xff0c;身份验证(鉴权)是检查你是不是公司的员工&#xff0c;而授权则是看你这个员工有没有权限进入某个特定的办公室或者使用某台设备。 两个非常容易混淆的单词 鉴…

Spring Task和WebSocket使用

在现代 Web 应用中&#xff0c;WebSocket 作为一种全双工通信协议&#xff0c;为实时数据传输提供了强大的支持。若要确保 WebSocket 在生产环境中的稳定性和性能&#xff0c;使用 Nginx 作为反向代理服务器是一个明智的选择。本篇文章将带你了解如何在 Nginx 中配置 WebSocket…

机器学习任务功略

loss如果大&#xff0c;训练资料没有学好&#xff0c;此时有两个可能&#xff1a; 1.model bias太过简单&#xff08;找不到loss低的function&#xff09;。 解决办法&#xff1a;增加输入的feacture&#xff0c;设一个更大的model&#xff0c;也可以用deep learning增加弹性…

STL:相同Size大小的vector和list哪个占用空间多?

在C中&#xff0c;vector和list是两种不同的序列容器。vector底层是连续的内存&#xff0c;而list是非连续的&#xff0c;分散存储的。因此&#xff0c;vector占用的空间更多&#xff0c;因为它需要为存储的元素分配连续的内存空间。 具体占用多少空间&#xff0c;取决于它们分…

Windows 10电脑无声问题的全面解决方案

Windows 10操作系统以其强大的功能和用户友好的界面赢得了广大用户的青睐&#xff0c;但在使用过程中&#xff0c;有时会遇到电脑突然没有声音的问题。这一问题可能由多种原因引起&#xff0c;包括音频驱动程序问题、音频设置错误、系统更新冲突等。本文将详细介绍Windows 10无…

6.824/6.5840 Lab 1: Lab 3: Raft

漆昼中温柔的不像话 静守着他的遗憾啊 旧的摇椅吱吱呀呀停不下 风卷走了满院的落叶落花 ——暮色回响 完整代码见&#xff1a; https://github.com/SnowLegend-star/6.824 在完成Lab之前&#xff0c;务必把论文多读几遍&#xff0c;力求完全理解Leader选举、log日志等过程。 …

小程序-基于java+SpringBoot+Vue的养老院管理系统设计与实现

项目运行 1.运行环境&#xff1a;最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境&#xff1a;IDEA&#xff0c;Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境&#xff1a;Tomcat 7.x,8.x,9.x版本均可 4.硬件环境&#xff1a…

YOLOv11 NCNN安卓部署

YOLOv11 NCNN安卓部署 之前自己在验证更换relu激活函数重新训练部署模型的时候&#xff0c;在使用ncnn代码推理验证效果很好&#xff0c;但是部署到安卓上cpu模式会出现大量的错误检测框&#xff0c;现已更换会官方默认的权重 前言 YOLOv11 NCNN安卓部署 目前的帧率可以稳定…

WPF_3

x名称空间的由来和作用 WPF程序中有这样的代码&#xff1a; x:Class"WpfControlLibrary1.UserControl1"<!--这是对x的使用-->xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/…

使用flex布局实现一行固定展示n个元素

前言&#xff1a; 最近在公司中完成小程序的UI设计稿时&#xff0c;遇到了布局一个问题&#xff1a;UI设计稿想实现的布局是这样的&#xff1a; 笔者第一反应就是使用flex中的justify-content: space-between;属性&#xff0c;但是使用之后发现&#xff0c;justify-content: …

Angular v19 (三):增量水合特性详解 - 什么是水合过程?有哪些应用场景?与 Qwik 相比谁更胜一筹?- 哪个技术好我就学哪个,这就是吸心大法吧

Angular在其最新版本 v19 中引入了增量水合&#xff08;Incremental Hydration&#xff09;这一特性。这一更新引发了开发者们广泛的讨论&#xff0c;特别是在优化首屏加载速度和改善用户体验方面。本文将详解水合过程的概念、增量水合的应用场景&#xff0c;以及它与类似框架如…