Java 修饰符详解:吐血整理,带你从底层语法和开发案例疏通这 11 种常见修饰符

文章目录

  • 前言
  • 一、11 种常见的 Java 修饰符
    • 1.1、修饰符应用表
    • 1.2、修饰符访问权限对比
  • 二、public 修饰符
    • 2.1、public 修饰符语法说明
    • 2.2、public 修饰符开发应用
  • 三、private 修饰符
    • 3.1、private 修饰符语法说明
    • 3.2、private 修饰符开发应用
  • 四、protected 修饰符
    • 4.1、protected 修饰符语法说明
    • 4.2、protected 修饰符开发应用
  • 五、default 修饰符(不加任何访问权限修饰符)
    • 5.1、default 修饰符语法说明
    • 5.2、default 修饰符开发应用
  • 六、static 修饰符
    • 6.1、类(静态)变量与实例变量
      • 6.1.1、类(静态)变量与实例变量语法说明
      • 6.1.2、类(静态)变量与实例变量开发应用
    • 6.2、类(静态)方法与实例方法
      • 6.2.1、类(静态)方法与实例方法语法说明
      • 6.2.2、类(静态)方法与实例方法开发应用
    • 6.3、static 静态代码段
      • 6.3.1、static 静态代码段语法说明
      • 6.3.2、static 静态代码段开发应用
    • 6.4、static 内部类
  • 七、final 修饰符
    • 7.1、final 修饰符语法说明
    • 7.2、final 修饰符开发应用
  • 八、abstract 修饰符
    • 8.1、abstract 修饰符语法说明
    • 8.2、abstract 修饰符开发应用
  • 九、接口(特殊的抽象类)
    • 9.1、接口语法说明
    • 9.2、接口开发应用
    • 9.3、抽象类和接口的区别是什么?
    • 9.4、什么是适配器?
  • 总结


前言

在 Java 的语言体系中共有 11 种常见的修饰符,其在我们日常的开发中一般有四种使用情况:成员变量、成员方法、代码块和内部类,那么在应用过程中我们还应该具体注意些什么?通过本文中我们将从最基础的底层和原理来理解和疏通这些常见修饰符语法说明以及在常见的开发中如何使用。

在这里插入图片描述


一、11 种常见的 Java 修饰符

1.1、修饰符应用表

修饰符构造方法方法数据解释
(default)类、构造方法、方法或数据域在所在的包中可见
public类、构造方法、方法或数据域在任何包任何程序中都可见
private构造方法、方法或数据域只在所在的类中可见
protected构造方法、方法或数据域在所属的包中可见,或者在任何包中该类的子类中可见
static定义类方法、类数据域或静态初始化模块
final终极类不能扩展。终极方法不能在子类中修改。终极数据域是常量
abstract抽象类必须被扩展。抽象方法必须在具体的子类中实现
native用native修饰的方法表明它是用Java以外的语言实现的
synchronized同一时间只有一个线程可以执行这个方法
strictfp使用精确浮点数计算模式,保证在所有的Java虚拟机中计算结果都相同
transient标记实例数据域,使其不进行序列化

1.2、修饰符访问权限对比

public > protected > default > private

说明:以下仅介绍我们常用的 7 种修饰符语法说明以及开发应用说明,另外 4 种用法查看修饰符应用表即可。

二、public 修饰符

2.1、public 修饰符语法说明

  • 修饰类、方法、变量。
  • 可以在任意位置访问,公共的。

2.2、public 修饰符开发应用

  • 开发中,通常类和业务方法都使用 public 修饰。

三、private 修饰符

3.1、private 修饰符语法说明

  • 修饰方法、变量、还可以修饰内部类。
  • 只能在本类中访问,私有的。

3.2、private 修饰符开发应用

  • 开发中,通常实体类(Entity,Vo)中的成员变量使用 private 修饰,会提供访问这些变量的方法 getter 或 setter,原则上要求不准定义私有的方法。
  • 一个实体数据的表通常对应一个实体类。

四、protected 修饰符

4.1、protected 修饰符语法说明

  • 修饰方法、变量、还可以修饰内部类。
  • 同一个包可以访问、子类可以访问(子类和父类不在同一个包也可以访问)。

4.2、protected 修饰符开发应用

  • 开发中,通常方法或变量是用来继承的,都使用 protected 修饰。
  • 在继承中,方法的重写,子类方法的访问权限必须大于或等于父类方法的访问权限,举例代码如下:
class Fu {public void play() {}
}class Son extends Fu {void play() {}
}

五、default 修饰符(不加任何访问权限修饰符)

说明:使用 default 修饰符与不加任何访问权限修饰符效果是一样的。

5.1、default 修饰符语法说明

  • 修饰类、方法、变量。
  • 只能在同一个包中访问,子类也必须在同一个包中。

5.2、default 修饰符开发应用

  • 项目中,类、方法、变量根据需求,通常都会指定访问权限。

六、static 修饰符

由于static 修饰符作用较多,我们对其拆开进行逐步分析。

6.1、类(静态)变量与实例变量

  • 类变量:被存储在方法区中,“只有一份”,被所有对象共享。当类被加载的时候,立即被存储在方法区中,当类被卸载,类变量立即释放内存。
  • 实例变量:在创建对象之后,被分配到堆内存中,实例变量属于某个具体的对象。当创建对象,实例变量出现在堆内存中,当对象被垃圾回收,实例变量立即释放内存。

比如我们创建两个对象,代码如下:

Cell c1 = new Cell(4,5);
Cell c2 = new Cell(5,6);

当创建对象 c1,c2 时,实例变量(4,5),(5,6)出现在堆内存中,当对象 c1,c2 被垃圾回收,实例变量立即释放内存。

6.1.1、类(静态)变量与实例变量语法说明

  • Java 中 可以通过 static 关键字修饰变量达到全局变量的效果
  • static 修饰的变量(静态变量)属于类,在类第一次通过类加载器到 jvm 时被分配至方法区,所以我们也称其为类变量。

在这里插入图片描述

  • 没有 static 修饰的变量,称为实例变量。

6.1.2、类(静态)变量与实例变量开发应用

  • 类变量可以由类名直接访问,开发中推荐使用类名的全称。

比如我们定义一个实体类,代码如下:

public class Student {// 实例变量,在创建对象之后,被分配到堆内存中,实例变量属于某个具体的对象// 当创建对象,实例变量出现在堆内存中,当对象被垃圾回收,实例变量立即释放内存String name;// 类变量,被存储在方法区中,"只有一份",被所有对象共享static String jtName;public void print() {System.out.println(this.name);System.out.println(jtName);}
}

下次使用静态变量 jtName 时,我们直接使用 Student 这个类名直接调用即可。
同时我们也就可以理解下面两个对象的属性取值是一样的,代码如下:

public class Demo01 {public static void main(String[] args) {// TODO Auto-generated method stubStudent stu1 = new Student();stu1.name = "张三";stu1.jtName = "王老师";Student stu2 = new Student();// 一般直接取类名// stu2.jtName = "卢老师";Student.jtName = "卢老师";System.out.println(stu1.name);// 张三System.out.println(stu2.name);// nullSystem.out.println(stu1.jtName);// 卢老师System.out.println(stu2.jtName);// 卢老师}
}

6.2、类(静态)方法与实例方法

  • 静态方法:static 修饰的方法属于类方法,不需要创建对象就可以调用。static 方法中不能使用 this 和 super 等关键字,不能调用非 static 方法,只能访问所属类的静态成员变量和静态方法。静态方法(类方法),当类被加载,静态方法立即被加载到方法区中,类方法可以由类名直接调用。
  • 实例方法:没有 static 修饰的方法,实例方法,当创建对象之后,实例方法立即被加载到方法区中,多个实例共享一份实例方法。

6.2.1、类(静态)方法与实例方法语法说明

  • 类方法中,不能使用 this 关键字,类方法中不隐含调用该方法对象的参数。
  • 实例方法可以直接调用静态方法,静态方法不可以直接访问实例成员,必须创建对象,由对象访问。
  • 所有对象共享的数据,定义为静态变量,否则定义为实例变量方法,方法中没有访问实例成员,可以定义为静态方法。

6.2.2、类(静态)方法与实例方法开发应用

  • 项目中,通常工具类中的方法,都是静态的。

6.3、static 静态代码段

6.3.1、static 静态代码段语法说明

  • JVM 在加载类时会执行 static 静态代码段,常用于初始化静态变量。
  • static 代码只会在类被加载时执行且执行一次。
  • 静态优于对象。

6.3.2、static 静态代码段开发应用

  • 开发中,通常用于加载静态资源,读取配置文件等操作,在静态代码段中实现。

比如我们定义一个工具类,代码如下:

public class SomeUtil {// 默认的无参构造public SomeUtil() {System.out.println("创建对象!");}// 静态优于对象// 静态代码段 当类被加载,立即被执行,一个类在同一个进程中,只加载一次static {System.out.println("加载静态资源!");}// 实例代码段{System.out.println("实例代码段!");}public static void do1() {System.out.println("do1....");}public static void do2() {System.out.println("do2....");}public static void do3() {System.out.println("do3....");}public static void main(String[] args) {SomeUtil.do1();SomeUtil.do2();SomeUtil.do3();SomeUtil s1 = new SomeUtil();SomeUtil s2 = new SomeUtil();}
}

执行 main 方法,根据输出的内容我们可以明确看出执行的顺序。静态代码段只执行一次,然后是静态方法被执行,最后是 new 的对象执行无参构造和实例代码段,new 一次执行一次。

同时也可以得出我们的结论:静态优于对象,如下图所示:

在这里插入图片描述

6.4、static 内部类

  • static 内部类可以不依赖外部类实例对象而被实例化,而内部类需要在外部类实例化后才能被实例化。
  • 静态内部类不能访问外部类的普通变量,只能访问外部类的静态成员变量和静态方法。

七、final 修饰符

7.1、final 修饰符语法说明

  • final 类,不能被继承。
  • final 方法,不能被重写。
  • final 修饰的变量,是常量。

7.2、final 修饰符开发应用

  • 开发中,我们使用 final 定义数据字典。

比如:在如下 Card 类中我们定义数据字典,用于 main 函数的输出和查询。

说明:数据字典是指对数据的数据项、数据结构、数据流、数据存储、处理逻辑等进行定义和描述,其目的是对数据流程图中的各个元素做出详细的说明,使用数据字典为简单的建模项目。简而言之,数据字典是描述数据的信息集合,是对系统中使用的所有数据元素的定义的集合。

举例使用 final 定义数据字典,代码如下:

public class Card {// 开发中,使用final定义数据字典。public static final int SPADE = 1;public static final int HEART = 2;public static final int BLACK = 5;public static final int FLOWER = 6;public static final int THREE = 0;public static final int EIGHT = 5;public static final int JACK = 8;public static final int QUEEN = 9;public static final int KING = 10;public static final int ACE = 11;public static final int DUCE = 12;public static final int JOKER = 13;private int suit;private int num;public Card() {}public Card(int suit, int num) {this.suit = suit;this.num = num;}public int getSuit() {return suit;}public void setSuit(int suit) {this.suit = suit;}public int getNum() {return num;}public void setNum(int num) {this.num = num;}public static void main(String[] args) {Card card = new Card(Card.HEART, Card.THREE);System.out.println(card.getNum());}
}

八、abstract 修饰符

8.1、abstract 修饰符语法说明

  • 抽象的,可以修饰类,修饰方法

修饰抽象类

  • 抽象类存在的意义在于被继承。
  • 抽象类不可以创建对象。
  • abstract 不能和 final 一起使用 。

修饰抽象方法

  • 抽象方法,只有定义没有实现。
  • 如果一个类中有抽象方法,这个类必须是抽象类。
  • 一个抽象类中,可以没有抽象方法。
  • 抽象类的子类,必须实现父类中所有的抽象方法。

8.2、abstract 修饰符开发应用

  • 抽象类中既可以有默认实现的方法,又可以有没有实现的方法。
  • 接口的适配器——用子类去实现接口中的方法。

九、接口(特殊的抽象类)

9.1、接口语法说明

  • 特殊的抽象类接口中的方法都是抽象方法,接口中的变量都是静态常量。
  • 定义接口使用 interface 关键字。
  • 实现接口使用 implements 关键字。
  • 类实现了接口,必须实现接口中所有的方法。

如下我们定义了一个接口 MyInterface,代码如下:

public interface MyInterface {// 接口是高一级别的抽象。不能被实例化,所以只能定义常量// 定义了变量需要实例化,赋值才能使用,跟接口违背// 特殊的抽象类 接口中的方法都是抽象方法 接口中的变量都是静态常量int I = 10;// 如果类中所有的方法都是抽象方法,使用接口void method1();void method2();
}

这里我们 MyImpClass 类实现了接口,就必须实现接口中所有的方法,代码如下:

import java.io.Serializable;/*** 其实适配器只是一个类,它实现了某种接口,提供了方法体。 * 这样,再用到这个接口时,可以直接继承适配器,这样就不需要把接口中的每一个方法再填充一遍了。* 只需要在这个类中复写一下需要用的方法。这样简单,方便。* * @author bailu*  */
public class MyImpClass implements MyInterface, Serializable {// Serializable序列化private static final long serialVersionUID = 1L;// 重写接口的方法——适配器,@Overridepublic void method1() {System.out.println(I);}@Overridepublic void method2() {}
}

9.2、接口开发应用

  • 如果类中所有的方法都是抽象方法,使用接口。
  • 接口是用来制定标准或规范。
  • 可以降低组件之间的耦合度,扩展组件的功能。
  • 体现了设计模式中的开闭原则。

9.3、抽象类和接口的区别是什么?

  • 抽象类中,可以定义抽象方法和非抽象方法。接口中,所有的方法都是抽象方法。
  • 一个类只能继承一个抽象类。一个类可以实现多个接口,多个接口使用逗号分隔。

如下的类既实现了接口 MyInterface,同时实现了 Serializable 序列化序列化,代码如下:

import java.io.Serializable;/**- 其实适配器只是一个类,它实现了某种接口,提供了方法体。 - 这样,再用到这个接口时,可以直接继承适配器,这样就不需要把接口中的每一个方法再填充一遍了。- 只需要在这个类中复写一下需要用的方法。这样简单,方便。- - @author bailu-  */
public class MyImpClass implements MyInterface, Serializable {// Serializable序列化private static final long serialVersionUID = 1L;// 重写接口的方法——适配器,@Overridepublic void method1() {System.out.println(I);}@Overridepublic void method2() {}
}
  • 抽象类之间也可以继承,但是也只是支持单继承。
  • 接口之间也可以继承,一个接口可以继承多个接口。

9.4、什么是适配器?

适配器只是一个类,它实现了接口,提供了方法体。再用到这个接口时,可以直接继承适配器,这样就不需要把接口中的每一个方法再填充一遍了,只需要在这个类中复写一下需要用的方法。

接口很好地体现了设计模式中的开闭原则。

比如,我们做一个在线商城系统,就需要调用第三方支付——银行或者是支付宝的支付接口。我们就需要第三方为我们提供接口,里面定义了抽象的方法以及实现接口的方法——适配器,我们通过调用适配器里面的方法来完成支付,代码如下:

ZsBankInter obj = 获取实现类对象;
obj.send();
京东、淘宝
银行接口ZsBankInter  
send()class DoSend implements ZsBankInter{send()具体的方法
}

总结

修饰符在 Java 语言中有四种使用情况:成员变量、成员方法、代码块和内部类。以上我们总结了在日常的开发过程中会遇到的 11 种常见的修饰符,并从最基础的底层和原理理解和疏通这些常见修饰符语法说明以及常见的开发应用案例。其中具体的内容还有很多,本文就暂不一一列举,待日后根据开发需要补充完毕。

在这里插入图片描述


我是白鹿,一个不懈奋斗的程序猿。望本文能对你有所裨益,欢迎大家的一键三连!若有其他问题、建议或者补充可以留言在文章下方,感谢大家的支持!

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

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

相关文章

Java 反射机制详解:私有方法调用头大?如何通过反射调用类中的私有方法?

文章目录前言一、私有方法在本类中直接调用1.1、在本类中实例化,调用私有方法1.2、尝试在其他类直接调用私有方法(错误示范)二、使用反射实例化类强制调用私有方法2.1、使用类加载器加载被调用的类2.2、使用 Object 类对获取的类进行实例化2.…

jQuery 遍历:思路总结,项目场景中如何处理/控制获取的 each 遍历次数?

文章目录前言一、项目场景分析二、实体类定义描述(仅关键代码)2.1、实体类定义描述2.2、逻辑处理与分析2.3、遍历数据如何修改的问题暴露三、处理思路3.1、源码分析 jQuery 中的 each 遍历3.2、如何解决 jQuery 中控制获取 each 的遍历次数总结前言 前台…

JavaScript 事件:Web 表单如何实现禁用右键、复制粘贴/剪切和输入框自动填充?

文章目录前言一、禁用鼠标右键1.1、分析说明1.2、操作原理1.3、实现效果1.4、实现代码1.5、补充:JS 中的 button 事件属性二、禁用复制粘贴2.1、分析说明2.2、实现代码三、禁用输入框自动填充功能3.1、分析说明3.2、实现效果3.3、实现代码总结前言 我们在项目中&…

MySQL 模糊查询:MySQL 数据库 like 语句通配符模糊查询小结

MySQL 报错:Parameter index out of range (1 > number of parameters, which is 0)——MySQL 数据库 like 语句通配符模糊查询小结 文章目录MySQL 报错:Parameter index out of range (1 > number of parameters, which is 0)——…

内网击穿之 HTTP 穿透:网站没上线?如何让全世界的人都可以访问你本地的网站?

文章目录前言一、内网穿透原理与工具介绍1.1、内网穿透工作原理1.2、内网穿透工具介绍二、启动内网穿透工具2.1、命令及配置介绍2.2、查看映射信息三、进行访问测试3.1、远程访问本地站点资源3.2、关闭内网穿透总结前言 对于大多数程序员来说,网站一经开发测试后&am…

软件设计原则:内聚、耦合有哪几种类型?内聚度、耦合度如何比较?

文章目录前言一、何为内聚?1.1、7 种内聚类型及其描述二、何为耦合?2.1、7 种耦合类型及其描述总结前言 高内聚、低耦合是我们在软件设计过程中必须遵循的一个重要原则,在整个软件工程中占有很大的比重。而对于内聚和耦合你还是仅仅局限于“高…

数据库管理工具:如何使用 Navicat Premium 转储(导出)和运行(导入)*.sql 文件?

文章目录前言一、转储(导出)数据库 SQL 文件1.1、选择“转储 SQL 文件”1.2、选择导出文件存放位置1.3、查看转储 SQL 文件界面1.4、查看 SQL 输出文件1.5、查看输出文件详情信息二、运行(导入)数据库 SQL 文件2.1、新建数据库2.2…

JSP 编译原理:JSP 是 Servlet?如何用 Eclipse 查看 JSP 编译生成的 Servlet 源文件?

文章目录前言一、JSP 文件编译流程原理二、创建并运行待测试 JSP 页面三、查找 JSP 编译文件输出位置3.1、打开动态项目运行配置3.2、查看 JSP 编译文件输出位置3.3、查看 JSP 编译输出文件四、JSP 编译输出 Servlet 的论证五、访问 JSP 文件的流程总结前言 相信大家都了解&…

MVC 模式/Servlet/JSP 编译原理剖析:Servlet 组件到底属于 MVC 模式的哪一层?

文章目录前言一、回忆什么是 MVC 模式?1.1、Model、View、Controller 组件介绍1.2、明确 View 与 Controller 组件区别二、什么是 Servlet?2.1、Servlet 的组件定义2.2、Servlet 组件处于 Controller 层?三、老师说 Servlet 是 View 层的&…

操作系统原理:进程 PV 操作如何计算?全网最全三种前驱图计算类型总结

文章目录前言一、PV 操作定义1.1、P 操作定义1.2、V 操作定义二、串联进程(单线前驱图)2.1、什么是单线前驱图?2.2、如何计算单线前驱图的 PV?2.2.1、计算前驱节点 PV2.2.2、计算中间节点 PV2.2.3、计算尾节点 PV三、并联进程&…

Spring 容器:三种方式解决 Resource leak: ‘applicationContext‘ is never closed 问题

文章目录前言一、Spring 容器警告产生的场景二、Spring 容器未关闭后果分析2.1、肉眼可见的警告2.2、导致的内存泄漏2.2.1、什么是内存泄漏?2.2.2、如何判断内存泄漏?2.2.3、Java 中的 GC(垃圾回收)2.2.4、Java 中会导致内存泄漏的…

SRA 案例:关于华为开发者联盟基础服务文档内容的改进建议(华为开发者联盟文档深度体验官)

文章目录前言一、文档中心的外链跳转问题1.1、问题描述1.2、造成的问题1.3、改进建议二、图片失真和无法放大查看问题2.1、问题描述2.2、造成的问题2.3、改进建议三、个别 SDK 词汇缺少必要的说明3.1、问题描述3.2、造成的问题3.3、改进建议四、邮箱信息的优化4.1、问题描述4.2…

腾讯位置服务:有何优势?如何使用平台创建应用和服务调用的 Key?

文章目录前言一、腾讯位置服务的优势1.1、提供丰富的地图产品1.2、提供行业解决方案1.3、提供其他生态维度的支持1.4、海量的数据基础1.5、丰富的开发文档二、初识腾讯位置服务2.1、用户的注册与登录(附专属邀请码)2.2、开发者信息的完善三、创建服务平台…

毕业生当头一棒?忆本科四年,高校毕业生与就业单位基本要求差多少?工作还是考研?

文章目录前言一、大学本科前两年的生活1.1、庸庸碌碌、中规中矩1.2、收获了爱情二、大三的改变2.1、学会自律2.2、学会自我总结2.3、眼光要具有前瞻性三、毕业答辩3.1、个人设计答辩3.2、团队设计答辩四、南京之行4.1、铭记历史,感恩先辈4.2、加强自我认知与提升五、…

Gitee 答疑:为什么从 Gitee 平台 Pull 代码到 STS/Eclipse 后文件乱码?逐步排查

文章目录前言一、产生乱码场景1.1、错误描述1.2、解决思路二、解决方式2.1、检查 Git 平台上的源码2.2、Git 的运行原理2.3、修改 IDE 的文本编码格式2.4、重新打开目的文件问题解决2.5、仍存在问题看这里(重新拉区合并)总结前言 我们从 Gitee 平台 Pull…

flash 异常修复:QQ 的 flash 图标显示异常?QQ 秀、表情加载异常?一招解决

文章目录前言一、产生错误场景1.1、flash 图标显示异常1.2、解决思路二、安装合适版本的 Flash Player2.1、选择合适版本的 Flash Player2.2、安装 Flash Player三、重启 QQ 客户端四、flash 动画加载异常4.1、动画加载异常原因分析4.2、下载安装 flash 修复工具4.3、使用 Flas…

电脑广告多?Windows 自带恶意软件删除工具还不会使用?有必要安装杀毒软件吗?

文章目录前言一、启动恶意软件删除工具二、扫描类型的选择三、启动软件扫描四、恶意软件删除工具的说明五、对于恶意软件处理的建议总结前言 可能有些小伙伴发现,哎?为什么我的电脑弹窗广告这么多?难不成小视频看多了?电脑中毒了&…

《软件项目管理(第二版)》第 8 章——项目团队与干系人 重点部分总结

文章目录 前言一、简答题二、论述题总结前言 学习了项目的开发与发布之后,我们就可以单独对一个项目进行开发了,但是在企业中开发中,除了编码之外,还需要项目管理、团队协作开发等,这就是软件项目管理板块要学习的内容。本文是对《软件项目管理(第二版)》第 8 章——项目…

《软件项目管理(第二版)》第 7 章——项目风险管理 重点部分总结

文章目录 前言一、单选题二、填空题三、简答题四、论述题总结前言 学习了项目的开发与发布之后,我们就可以单独对一个项目进行开发了,但是在企业中开发中,除了编码之外,还需要项目管理、团队协作开发等,这就是软件项目管理板块要学习的内容。本文是对《软件项目管理(第二…

《软件项目管理(第二版)》第 6 章——项目质量管理 重点部分总结

文章目录 前言一、单选题二、判断题三、简答题总结前言 学习了项目的开发与发布之后,我们就可以单独对一个项目进行开发了,但是在企业中开发中,除了编码之外,还需要项目管理、团队协作开发等,这就是软件项目管理板块要学习的内容。本文是对《软件项目管理(第二版)》第 6…