【Java开发指南 | 第十篇】Java修饰符

news2024/11/26 2:41:06

读者可订阅专栏:Java开发指南 |【CSDN@秋说】

在这里插入图片描述

文章目录

  • JAVA修饰符
    • 访问修饰符
    • 非访问修饰符
      • static 修饰符
      • final 修饰符
      • abstract 修饰符
      • synchronized 修饰符
      • transient 修饰符
      • volatile 修饰符

JAVA修饰符

修饰符用来定义类、方法或者变量,通常放在语句的最前端。

访问修饰符

default

如果在类、变量、方法或构造函数的定义中没有指定任何访问修饰符,那么它们就默认具有默认访问修饰符。

默认访问修饰符的访问级别是包级别(package-level),即只能被同一包中的其他类访问。

class A{
    int a=10;
}
public class Ice{
    public static void main(String[] args){
        A ii =  new A();
        System.out.println(ii.a);
    }
}

在这里插入图片描述

private

声明为私有访问类型的变量只能通过类中公共的 getter 方法被外部类访问。

class A {
    private int a = 10; // 将变量声明为私有访问类型
    // 公共的 getter 方法用于访问私有变量
    public int getA() {
        return a;
    }
}
public class Ice {
    public static void main(String[] args) {
        A ii = new A();
        // 通过公共的 getter 方法访问私有变量
        System.out.println(ii.getA());
    }
}

在这里插入图片描述

在类 Icemain 方法中尝试直接访问了类 A 中的私有成员变量 a,而没有使用公共方法,导致报错:

class A {
    private int a = 10; // 将变量声明为私有访问类型
    }
}
public class Ice {
    public static void main(String[] args) {
        A ii = new A();
        System.out.println(ii.a);
    }
}

在这里插入图片描述

public

被声明为 public 的类、方法、构造方法和接口能够被任何其他类访问。

package  ice;
public class a{
    public int aa;
    public a(){
        this.aa=10;
    }
    public void aaa(){
        System.out.println("A");
    }
}
package ice;
//访问a类
public class Ice{
    public static void main(String[] args)
    {
        ice.a obj = new ice.a();
        System.out.println(obj.aa);
        obj.aaa();
    }
}

在这里插入图片描述

protected

protected 需要从以下两个点来分析说明:

  • 子类与基类在同一包中:被声明为 protected 的变量、方法和构造器能被同一个包中的任何其他类访问;
  • 子类与基类不在同一包中:那么在子类中,子类实例可以访问其从基类继承而来的 protected 方法,而不能访问基类实例的protected方法。

举例:

假设我们有一个基类 Base 和一个子类 Subclass,它们都在同一个包 example 中。

Base.java:

package example;

public class Base {
    protected int protectedVariable;

    protected void protectedMethod() {
        System.out.println("This is a protected method.");
    }
}

Subclass.java:

package example;

public class Subclass extends Base {
    public void accessProtectedMember() {
        // 在同一包中,子类可以直接访问基类的 protected 成员
        protectedVariable = 10;
        System.out.println("protectedVariable value set by subclass: " + protectedVariable);

        protectedMethod();
    }
}

在这个例子中,Subclass 类继承自 Base 类。由于它们在同一个包中,Subclass 类可以直接访问 Base 类中被声明为 protected 的变量和方法。

现在假设我们将 Subclass 类移到一个不同的包 anotherpackage 中。

Subclass.java:

package anotherpackage;

import example.Base;

public class Subclass extends Base {
    public void accessProtectedMember() {
        // 子类实例可以访问其从基类继承而来的 protected 变量和方法
        protectedVariable = 10;
        System.out.println("protectedVariable value set by subclass: " + protectedVariable);

        protectedMethod();
    }
}

在这个例子中,Subclass 类仍然继承自 Base 类。尽管它们不在同一个包中,但是Subclass 类可以访问 Base 类中被声明为 protected 的变量和方法,因为 protected 访问修饰符允许子类访问其继承的成员。

注意:

  • protected 可以修饰数据成员,构造方法,方法成员,不能修饰类(内部类除外)
  • 接口及接口的成员变量和成员方法不能声明为 protected。
修饰符当前类同一包内子孙类(同一包)子孙类(不同包)其他包
publicYYYYY
protectedYYYY/NN
defaultYYYNN
privateYNNNN

非访问修饰符

static 修饰符

  • 静态变量:

    static 关键字用来声明独立于对象的静态变量,无论一个类实例化多少对象,它的静态变量只有一份拷贝。 静态变量也被称为类变量。局部变量不能被声明为 static 变量。

public class ice {
    // 静态变量
    public static int staticVariable = 10;

    public static void main(String[] args) {
        // 通过类名直接访问静态变量
        System.out.println("Static variable value: " + ice.staticVariable);
    }
}

在这里插入图片描述

  • 静态方法:

    static 关键字用来声明独立于对象的静态方法。静态方法不能使用类的非静态变量。静态方法从参数列表得到数据,然后计算这些数据。

public class ice {
    // 静态方法
    public static void staticMethod() {
        System.out.println("This is a static method.");
    }

    public static void main(String[] args) {
        // 调用静态方法
        ice.staticMethod();

        // 通过对象实例调用静态方法(不推荐,因为静态方法与对象实例无关)
        ice obj = new ice();
        obj.staticMethod();
    }
}

在这里插入图片描述

final 修饰符

final 变量:

final 表示"最后的、最终的"含义,变量一旦赋值后,不能被重新赋值。被 final 修饰的实例变量必须显式指定初始值。

public class ice {
    // final变量,一旦赋值就不能被修改
    final int finalVariable = 10;

    public static void main(String[] args) {
        ice obj = new ice();
        // final变量的值不能被修改,否则会编译错误
        // obj.finalVariable = 20;
        System.out.println("Final variable value: " + obj.finalVariable);
    }
}

在这里插入图片描述

如图:

在这里插入图片描述

final 方法

父类中的 final 方法可以被子类继承,但是不能被子类重写。

声明 final 方法的主要目的是防止该方法的内容被修改。

public class Parent {
    // final方法,子类不能重写该方法
    public final void finalMethod() {
        System.out.println("This is a final method.");
    }
}

public class Child extends Parent {
    // 尝试重写final方法会导致编译错误
    /*
    @Override
    public void finalMethod() {
        System.out.println("Trying to override final method.");
    }
    */

    public static void main(String[] args) {
        Child obj = new Child();
        obj.finalMethod();
    }
}

final 类

final 类不能被继承,没有类能够继承 final 类的任何特性。

// final类,不能被继承
final public class ice {
    public void display() {
        System.out.println("This is a final class.");
    }

    public static void main(String[] args) {
        ice obj = new ice();
        obj.display();
    }
}

abstract 修饰符

抽象类:

抽象类不能用来实例化对象,声明抽象类的唯一目的是为了将来对该类进行扩充。

一个类不能同时被 abstract 和 final 修饰。如果一个类包含抽象方法,那么该类一定要声明为抽象类,否则将出现编译错误。

抽象类可以包含抽象方法和非抽象方法。

抽象方法

抽象方法是一种没有任何实现的方法,该方法的具体实现由子类提供。

规则如下:

  • 抽象方法不能被声明成 final 和 static。

  • 任何继承抽象类的子类必须实现父类的所有抽象方法,除非该子类也是抽象类。

abstract class Animal {
    // 抽象方法,动物发出声音
    abstract void makeSound();
}

class Dog extends Animal {
    // Dog类没有实现父类的抽象方法
}

public class ice {
    public static void main(String[] args) {
        // 尝试实例化Dog类,但由于没有实现抽象方法,会导致编译错误
        Dog dog = new Dog();
    }
}

在这里插入图片描述

  • 如果一个类包含若干个抽象方法,那么该类必须声明为抽象类。抽象类可以不包含抽象方法。

Shape类包含了一个抽象方法,所以它必须为抽象类:

在这里插入图片描述

  • 抽象方法的声明以分号结尾,例如:public abstract sample();

synchronized 修饰符

在 Java 中,synchronized 修饰符用于确保多个线程访问共享资源时的同步性。当一个方法或者一个代码块被 synchronized 修饰时,它只能被一个线程访问,其他线程需要等待直到该线程执行完毕释放锁。这样可以防止多个线程同时访问共享资源而导致的数据不一致或者并发问题。

例如:

public synchronized void synchronizedMethod() {
    // 同步的方法体
}

public void someMethod() {
    synchronized(this) {
        // 同步的代码块
    }
}

transient 修饰符

在 Java 中,当对象需要被序列化为字节流以便存储或者传输时,使用 transient 关键字可以标记某些不需要被序列化的成员变量,这样可以提高序列化的效率,也可以保护一些敏感信息不被序列化。

例如:

public class MyClass implements Serializable {
    private transient int sensitiveData; // 这个成员变量不会被序列化
    private int normalData; // 这个成员变量会被序列化
}

volatile 修饰符

volatile 修饰符用于声明一个变量是“易变”的。在 Java 中,当一个变量被 volatile 修饰时,它的值会立即被写入主内存,并且对其他线程可见。这样可以确保多个线程对该变量的读写操作是同步的,从而避免了由于多线程之间的可见性问题而导致的数据不一致性。

例如:

public class SharedResource {
    private volatile int count;
    
    public void increment() {
        count++;
    }
    
    public int getCount() {
        return count;
    }
}

如果没有将 count 变量声明为 volatile,则在多线程环境中,一个线程对 count 的修改可能不会立即被其他线程看到,导致不一致的结果。而使用了 volatile 关键字,则可以确保每次读取 count 都能得到最新的值。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024年【高处安装、维护、拆除】考试题库及高处安装、维护、拆除复审模拟考试

题库来源:安全生产模拟考试一点通公众号小程序 高处安装、维护、拆除考试题库是安全生产模拟考试一点通生成的,高处安装、维护、拆除证模拟考试题库是根据高处安装、维护、拆除最新版教材汇编出高处安装、维护、拆除仿真模拟考试。2024年【高处安装、维…

瞬态瑞丽波频散曲线提取

频散曲线 function [Y1, f, phase] = das_fft(signal1, signal2, Ts) [y, lag

windows编译xlnt,获取Excel表里的数据

用git拉取项目 这个文件是空的 要用git拉下来&#xff0c;使用终端编译xlnt库 点击解决方案 运行生成 然后新建项目&#xff0c;配置好库&#xff0c; #include <iostream> #include <xlnt/xlnt.hpp>int main() {// 打开 Excel 文件xlnt::workbook workbook;workb…

Ubuntu Vs code配置ROS开发环境

文章目录 1.开发环境2.集成开发环境搭建2.1 安装Ros2.2 安装 Vs code2.3 安装vs code 插件 3.Vs code 配置ROS3.1 创建ROS工作空间3.2 从文件夹启动Vs code3.3 使用Vscode 编译ROS 空间3.4 使用Vs code 创建功能包 4.编写简单Demo实例4.1编写代码4.2编译与执行 1.开发环境 系统…

【数学】主成分分析(PCA)的应用案例(Python)

接着上篇PCA推导过程文章&#xff0c;本文结合图像来展示PCA的应用过程 Jupyter notebook 源文件在这里 1 借助库函数来PCA重建 使用sklearn库函数 # Import needed libs import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import load_digits from…

大模型微调的几种常见方法

在文章深入理解大语言模型微调技术中&#xff0c;我们详细了解大语言模型微调的概念和训练过程&#xff0c;本篇给大家介绍大模型微调常见的7种训练方法。 1、Adapter Tuning 2019年谷歌的研究人员首次在论文《Parameter-Efficient Transfer Learning for NLP》提出针对 BERT 的…

java线程(1)

1、多线程启动 有两种启动方式 1、实现Runable接口 2、继承Thread类并且重写run&#xff08;&#xff09;方法 在执行进程中的任务才会产生线程&#xff0c;所以需要实现Runable接口并且重写run&#xff08;&#xff09;方法&#xff0c;然后将Runable的实现对象作为参数传…

(文章复现)分布式电源选址定容的多目标优化算法

参考文献&#xff1a; [1]夏澍,周明,李庚银.分布式电源选址定容的多目标优化算法[J].电网技术,2011,35(09):115-121. [2] Ye Tian, Ran Cheng, Xingyi Zhang, and Yaochu Jin, “PlatEMO: A MATLAB platform for evolutionary multi-objective optimization [educational for…

图像处理与视觉感知---期末复习重点(8)

文章目录 一、图像分类流程二、梯度方向直方图2.1 概述2.2 计算梯度方向直方图2.2.1 过程2.2.2 总结 三、SIFT 一、图像分类流程 流程&#xff1a;输入图像、预处理、特征提取、学习算法、类标。 二、梯度方向直方图 2.1 概述 1. 梯度方向直方图(Histogram of Oriented Gradie…

【1688电商运营必看】掌握这些关键数据指标,轻松提升业绩!

1688电商运营&#xff0c;数据分析环节中需要关注多个关键指标&#xff0c;以便全面、深入地了解店铺或产品的运营状况。以下是一些主要的指标&#xff1a; 1、流量指标 访客数&#xff1a;反映店铺的吸引力和流量规模。 浏览量&#xff1a;显示页面的受欢迎程度&#xff0c…

【AI开发:语言】二、Qwen1.5-7B模型本地部署CPU和GPU版

前言 之前文章&#xff0c;我们采用了Koblod运行Yi-34B大模型&#xff0c;本文采用LM Studio来运行千问模型。 LM Studio并没有开源&#xff0c;但是可以免费使用&#xff0c;他是目前本地进行模型测试最好的工具了。 在这里&#xff0c;依然使用Windows 10进行部署和测试&…

GPT-3:NLP领域的革新者

在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;预训练模型一直是研究的热点。随着技术的不断进步&#xff0c;我们见证了从BERT到GPT等一系列模型的涌现。其中&#xff0c;GPT-3&#xff08;Generative Pre-trained Transformer 3&#xff09;以其卓越的生成能力和…

抗干扰1路|1通道触摸单按键触摸触控ICVK3601 SOT23-6适用于玩具,风扇,台灯等触摸IC

产品品牌&#xff1a;永嘉微电/VINKA 产品型号&#xff1a;VK3601 封装形式&#xff1a;SOT23-6 概述 VK3601具有1个触摸按键&#xff0c;可用来检测外部触摸按键上人手的触摸动作。该芯片具有较 高的集成度&#xff0c;仅需极少的外部组件便可实现触摸按键的检测。 提供了1路…

力扣周赛392复盘

3105. 最长的严格递增或递减子数组 题目 给你一个整数数组 nums 。 返回数组 nums 中 严格递增 或 严格递减 的最长非空子数组的长度。 思考&#xff1a; 返回什么&#xff1a;返回最长非空子数组的长度。return max(decs_len,incs_len); 但实际上我们只需要用一个变量ans就…

【优质书籍推荐】AI赋能100%提高项目管理效率

大家好&#xff0c;我是爱编程的喵喵。双985硕士毕业&#xff0c;现担任全栈工程师一职&#xff0c;热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。…

Vision GNN: An Image is Worth Graph of Nodes

感受野&#xff1a;在卷积神经网络中,感受野(Receptive Field)是指特征图上的某个点能看到的输入图像的区域,即特征图上的点是由输入图像中感受野大小区域的计算得到的。 感受野并非越大越好&#xff0c;反而可能因为过大而过于发散梯度下降&#xff08;Gradient Descent GD&am…

在linux系统中启动pycharm

1.找到pycharm的安装路径&#xff0c;一般在下载文件夹中 2.进入pycharm的安装路径&#xff0c;进入bin目录 3.右击&#xff0c;打开终端&#xff0c;输入./pycharm.sh

民航电子数据库:[E14024]事务内变更操作次数超过最大许可值10000,可通过系统参数max_trans_modify适当调整限制

目录 一、场景二、异常情况三、原因四、排查五、解决 一、场景 1、对接民航电子数据 2、执行delete语句时报错 二、异常情况 三、原因 通过报错信息就可以看出&#xff0c;是系统参数max_trans_modify配置导致 当删除的数据量 > max_trans_modify时&#xff0c;删除就会…

【LeetCode每日一题】924. 尽量减少恶意软件的传播(并查集)

文章目录 [924. 尽量减少恶意软件的传播](https://leetcode.cn/problems/minimize-malware-spread/)思路&#xff1a;并查集代码&#xff1a; 924. 尽量减少恶意软件的传播 思路&#xff1a;并查集 构建并查集&#xff1a;首先&#xff0c;代码创建了一个 UnionFind 类来维护节…

AIGC教育行业全景报告:AI助教和家教成真,学习机迎来新机遇

原文&#xff1a;AIGC教育行业全景报告&#xff1a;AI助教和家教成真&#xff0c;学习机迎来新机遇 - AI新智界 图片来源&#xff1a;由无界AI生成 经过一年的快速迭代&#xff0c;业内对于生成式AI将会率先落地于哪些行业已经有了答案。 教育领域&#xff0c;不仅被OpenAI列…