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

读者可订阅专栏: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方法会导致编译错误/*@Overridepublic 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.hqwc.cn/news/624380.html

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

相关文章

C#创建磁性窗体的方法:创建特殊窗体

目录 一、磁性窗体 二、磁性窗体的实现方法 (1)无标题窗体的移动 (2)Left属性 (3)Top属性 二、设计一个磁性窗体的实例 (1)资源管理器Resources.Designer.cs设计 (2)公共类Frm_Play.cs (3)主窗体 …

JavaWeb前端/后端开发规范——接口文档概述及YApi平台的使用

前言: 整理下笔记,打好基础,daydayup!!! 接口文档 什么是接口文档? 目前主流的开发模式为前后端分离式开发,为了方便前后端的对接,就需要使用接口文件进行统一规范。 接口文档记载什么信息? 1&…

李飞飞团队发布《2024年人工智能指数报告》,预测人工智能未来发展趋势

昨天,斯坦福大学 Human-Center Artificial Intelligence (HAI)研究中心发布了《2024年人工智能指数报告》。 由斯坦福大学发起的人工智能指数(AI Index)是一个追踪 AI 动态和进展的非营利性项目,旨在全面研究 AI 行业状况&#xf…

物联网的核心价值是什么?——青创智通

工业物联网解决方案-工业IOT-青创智通 物联网,这个词汇在当今的科技领域已经变得耳熟能详。但当我们深入探索物联网的核心价值时,我们会发现它远不止是一个简单的技术概念,而是一种能够彻底改变我们生活方式和工作方式的革命性力量。 物联网…

libcurl 简单使用

LibCurl是一个开源的免费的多协议数据传输开源库,该框架具备跨平台性,开源免费,并提供了包括HTTP、FTP、SMTP、POP3等协议的功能,使用libcurl可以方便地进行网络数据传输操作,如发送HTTP请求、下载文件、发送电子邮件等…

C语言基础入门案例(3)

目录 第一题:一维数组的最大值和最小值求解 第二题:求一维数组中的第二大的数 第三题:计算5个整数的平均值 第四题:查找整数在数组中的索引位置 第五题:统计字符串中数字字符的个数 第一题:一维数组的…

服务器Linux搭建NPM私有仓库

服务器Linux搭建NPM私有仓库 环境搭建 安装 nodejs nodejs官网:https://nodejs.org/en/download/package-manager 可以去官网自行下载nodejs的Linux版本,但是出于别的原因考虑,可以使用nvm去下载nodejs这样会切换nodejs也方便。 nvm 这…

MySQL进阶-----limit、count、update优化

目录 前言 一、limit优化 1. 未优化案例 2.优化后案例 二、count优化 count用法 三、update优化 1.锁行情况(有索引) 2.锁表情况(无索引) 前言 上一期我们学习了order by优化和group by优化,本期我们就继续学习…

程序员接单的渠道有没有可靠介绍?

程序员接单的渠道有很多,但总结下来无非就是个人介绍和程序员接单平台。 这里就不多说废话了,直接上当前市面上靠谱且稳定的程序员接单平台list。 程序员客栈 近100w程序员都在使用的程序员接单平台。作为一个靠谱的线上接单渠道,程序员客栈…

SSRF靶场

SSRF概述 ​ 强制服务器发送一个攻击者的请求 ​ 互联网上的很多web应用提供了从其他服务器(也可以是本地)获取数据的功能。使用用户指定的URL,web应用可以获取图片(载入图片)、文件资源(下载或读取)。如下图所示&…

笔试题1 -- 吃掉字符串中相邻的相同字符(点击消除_牛客网)

吃掉字符串中相邻的相同字符 文章目录 吃掉字符串中相邻的相同字符题目重现解法一:(基于 erase() 函数实现)解法二:(利用 栈 辅助实现)总结 题目链接: 点击消除_牛客网 题目重现 牛牛拿到了一个字符串。 他每次“点击…

关联规则挖掘(一)

目录 一、关联规则的概念(一)基本概念(二)项集的性质 二、关联规则的Apriori算法(一)发现频繁项集(二)产生关联规则 一、关联规则的概念 (一)基本概念 事务数…