首页 > 编程语言 >Java常见修饰符

Java常见修饰符

时间:2024-11-15 15:44:15浏览次数:3  
标签:包中 常见 Java 变量 修饰符 访问 方法 public

目录

一. 访问修饰符

1. public(公共的)

2. private(私有的)

3. protected(受保护的)

4. 默认(也称为包访问权限,没有修饰符)

二. 非访问修饰符

1. static(静态的)

2. final(最终的)

3. abstract(抽象的)

4. synchronized(同步的)

5. volatile(易变的)


一. 访问修饰符

1. public(公共的)

使用范围:任何类

类层面

一个public类可以被任何其他类访问,这使得它成为构建大型应用程序接口的关键部分。例如,在一个 Java 库中,public类是提供给外部使用者的主要入口。像 Java 标准库java.util.ArrayList类就是public的,这样就可以导入这个类然后创建ArrayList对象来存储数据。

方法和变量层面:

对于public方法,它们构成了类的对外接口。可以被任何其他类调用,这使得其他类能够方便地获取文件相关的信息。

对于public变量,虽然可以被外部访问,但过度使用会破坏封装性。所以一般建议通过public方法来访问和修改变量。

2. private(私有的)

使用范围:本身

成员变量

私有变量用于隐藏类的内部状态。以银行账户类BankAccount为例,private double balance;用于存储账户余额。这样做是为了防止外部类直接修改余额,确保余额的修改只能通过银行账户类内部定义的合法方法,如deposit(存款)和withdraw(取款)方法来进行。

成员方法:

私有方法通常用于封装一些内部的操作逻辑,当一个方法是内部实现细节,外部类不需要也不应该调用它,所以将其声明为private,以保持类的封装性。

3. protected(受保护的)

使用范围:本身和子类

继承关系中的访问

假设我们有一个基类Vehicle,其中有一个protected方法protected void startEngine()。如果有一个子类Car继承自Vehicle,那么Car类可以访问startEngine方法,即使Car类在不同的包中。这允许子类在继承的基础上扩展或修改基类的行为。例如,Car类可以在startEngine方法的基础上添加一些特定于汽车的启动操作,如检查油量、启动空调等。

同包中的访问

在同一个包中,protected成员的访问规则和默认(包访问权限)

4. 默认(也称为包访问权限,没有修饰符)

使用范围:当前包下

包内协作

在一个包内,没有修饰符的类、方法和变量可以方便地相互访问。在同一个包中的其他类可以直接调用方法,这有助于在包内部实现代码的共享和协作,同时限制了外部包对这些内部实现细节的访问。

包外限制

从包外的角度看,默认访问权限的成员是不可见的。这可以看作是一种简单的封装形式,将包内部的实现细节隐藏起来,防止外部的非法访问和滥用。例如,一个外部包中的类不能直接访问com.example.utils包中StringUtils类的默认方法isEmpty,这有助于维护代码的安全性和模块性。

二. 非访问修饰符

1. static(静态的)

修饰变量和方法

变量方面

被声明为static的变量属于类,而不是属于类的某个对象。它在类加载时就被初始化,只有一份内存空间,所有该类的对象共享这个静态变量。

方法方面

static方法属于类,不需要创建类的对象就可以调用。它不能直接访问非静态的成员(变量和方法),因为非静态成员是和对象相关的。

2. final(最终的)

修饰变量和方法

对于变量

如果一个变量被声明为final,那么它的值一旦被初始化就不能再改变。如果是基本数据类型,变量的值不能改变;如果是引用数据类型,引用不能改变(但是对象的内容可以改变)。

方法方面

final方法不能被子类重写。这可以保证方法的行为在继承体系中保持一致。

3. abstract(抽象的)

修饰类和方法

对于类

abstract类是不能被实例化的,它主要用于作为其他类的基类(父类),通常包含一个或多个抽象方法。

对于方法

抽象方法没有方法体,只有方法签名。它必须在抽象类中,并且要求非抽象的子类必须实现(重写)这个抽象方法。

4. synchronized(同步的)

修饰方法和代码块

主要用于多线程编程。当一个方法或代码块被synchronized修饰时,同一时刻只能有一个线程访问这个方法或代码块,保证了数据的一致性和线程安全。

5. volatile(易变的)

用于多线程编程,主要是保证变量的可见性。当一个变量被声明为volatile时,一个线程对这个变量的修改会立即被其他线程看到。

标签:包中,常见,Java,变量,修饰符,访问,方法,public
From: https://blog.csdn.net/duehebfbf/article/details/143729873

相关文章

  • java工具类,把list转为map
    List和Map是Java集合框架中常用的数据结构,分别用于存储有序的元素列表和键值对。在某些场景下,我们需要将List转换为Map,以便更高效地访问和操作数据。本文将探讨几种常用的List转Map的方式,并对它们的特点进行分析比较。大体来说,List转Map的方式可以分为以下几种:使用for循环遍历、J......
  • 《Java核心技术 卷I》用户图形界面鼠标事件
    鼠标事件        如果只希望用户能够点击按钮或菜单,那么就不需要显式地处理鼠标事件,鼠标操作将由用户界面中的各种组件内部处理,不过,如果希望用户能使用鼠标画图,就需要捕获鼠标移动,点击和拖动事件。本节,我们将展示一个简单的图形编辑器应用,它允许用户在画布上放置、移......
  • 《Java核心技术 卷I》图形界面事件处理适配器类
    适配器类并不是所有的事件处理都像按钮点击那样简单,假设你想监视用户何时想要关闭主窗体,可能希望弹出一个对话框,只有在用户确认之后才退出程序。当程序试图关闭一个窗口时,JFrame对象就是WindowEvent的事件源,如果希望捕获这个事件,就必须有一个合适的监听器对象,并将它添加到窗体......
  • 如何用Java爬虫精准获取商品历史价格信息
    在数字化时代,商品价格信息的获取变得尤为重要。对于消费者来说,了解商品的历史价格趋势可以帮助他们做出更明智的购买决策。而对于商家来说,掌握价格数据则有助于制定更有效的销售策略。本文将详细介绍如何使用Java编写爬虫程序,精准获取商品的历史价格信息以及API数据。Java爬虫......
  • java代码练习:银行管理系统
    packageTestFirst;importjava.util.Arrays;importjava.util.Objects;importjava.util.Scanner;publicclassTestBank{publicstaticvoidmain(String[]args){Bankbank=newBank();bank.login();}}classBank{Scannerinput=newS......
  • java处理excel文件
    文章目录maven引入依赖编写ExcelUtil工具类使用ExcelUtil工具类maven引入依赖<!--处理excel依赖--><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.9</version></dependency><......
  • Java虚拟机(JVM):Java程序的心脏
    Java虚拟机(JavaVirtualMachine,JVM)是Java运行时环境的核心组件,它不仅为Java程序提供了跨平台的能力,还负责内存管理、类加载、字节码解释与执行等重要功能。本文将深入探讨JVM的架构、内存划分、工作原理以及性能调优等方面的内容,帮助读者全面理解这一关键技术。一、JVM的架构......
  • Java集合框架之Collection集合遍历
    引言在Java编程中,集合(Collection)框架是处理对象集合的核心工具。它提供了一套统一的接口和类来存储和操作对象集合。遍历集合是日常开发中的一项基本任务,本文将深入探讨JavaCollection集合的遍历方法,并提供实际的代码示例。JavaCollection框架概览JavaCollection框架主要......
  • 最全JAVA面试八股文,终于整理完了
    1、Java线程具有五中基本状态(1)新建状态(New):当线程对象对创建后,即进入了新建状态,如:Threadt=newMyThread();(2)就绪状态(Runnable):当调用线程对象的start()方法(t.start();),线程即进入就绪状态。处于就绪状态的线程,只是说明此线程已经做好了准备,随时等待CPU调度执行,并不是......
  • java请求频次控制
    1、添加工具类importjava.util.concurrent.atomic.AtomicInteger;/***频次调用控制类*/publicclassRateLimiterUtil{privatefinalAtomicIntegersum;privatefinalintmaxRequests;privatelongperiod=1000;//1秒privatelonglastTime......