java修饰符有哪些-分权限与功能两类覆盖所有实操场景

java修饰符有哪些-分权限与功能两类覆盖所有实操场景

初学Java写代码的时候,最头疼的就是分不清各类修饰符,每次写类、方法、变量都要反复纠结,搞不懂java修饰符有哪些,也不知道不同修饰符该怎么搭配使用,经常写出编译报错的代码,改半天都找不到问题。那段时间写项目,因为修饰符乱用,权限泄露、方法无法调用、变量常量失效的问题层出不穷,都是一点点踩坑试错,才彻底摸清了所有常用的Java修饰符,以及各自的实际用法。

很多新手会误以为修饰符只有public、private这几个权限修饰符,其实根本不全。Java里的修饰符分为两大核心类别,访问权限修饰符和非访问修饰符,两类结合起来,才是日常开发中会用到的全部修饰符,没有任何遗漏。

最先踩的坑是权限修饰符的作用域混淆。最基础的public,是公开权限,任何类、任何包下都能直接访问,平时写工具类、公共方法基本都会用它。然后是protected,一开始总以为它和private差不多,直到一次跨包继承代码报错才发现,protected修饰的成员,同包内可以随意访问,不同包只有子类能够继承调用,普通类是无权访问的。

默认的包访问权限最容易被忽略,就是不写任何修饰符的状态。之前偷懒不给变量加修饰符,结果跨包调用直接报错。后来才反应过来,无修饰符的成员,仅限当前包内访问,出了当前包,哪怕是公共类也无法调用。最后是权限最小的private,仅限本类内部使用,这也是封装的核心,项目里的私有属性、内部工具方法,基本都会用这个修饰符隔绝外部访问。

非访问修饰符的坑,比权限修饰符更多,也是开发高频用到的。static静态修饰符,当初写工具方法时反复出错,折腾好久才搞明白,被static修饰的变量、方法属于类本身,不用创建对象就能直接调用,而且全局共享,一处修改所有调用处都会同步变化,这也是工具类方法全部加static的原因。

final修饰符的特性也栽过跟头。一开始以为final只用来定义常量,后来实操发现,它修饰变量就是不可修改的常量,修饰方法就不能被重写,修饰类则不能被继承。之前改写父类的final方法,编译直接爆红,查了资料才确认这个硬性规则,之后写固定逻辑、禁止修改的核心类,都会主动加上final。

abstract抽象修饰符是做框架开发时接触的。抽象类不能实例化,抽象方法没有方法体,必须由子类重写实现。曾经试图new一个抽象类对象,运行直接报错,反复测试才记住,abstract只用于定义规范,具体逻辑全靠子类落地,不能单独实例调用。

还有volatile、transient、synchronized这三个冷门但关键的修饰符,平时基础开发用得少,多线程和序列化场景必不可少。volatile用来保证多线程下变量的可见性,禁止指令重排;transient修饰的变量,序列化时会被忽略,不会存入持久化数据;synchronized用来锁住方法和代码块,解决多线程并发安全问题。

transient是最容易被遗忘的修饰符。之前做对象序列化存储,发现部分敏感数据一直无法屏蔽,折腾许久才想起用transient修饰对应字段,数据序列化时就会自动剔除,完美解决了隐私数据泄露的问题。

这些零散的修饰符,没有复杂的嵌套逻辑,只是新手很少一次性记全。所有Java修饰符汇总下来,权限修饰符包含public、protected、默认权限、private;非访问修饰符包含static、final、abstract、volatile、transient、synchronized,这就是全部的官方合法修饰符。

那天改完多线程代码的最后一个bug,关掉编译器,盯着屏幕空白的代码编辑区,脑子里只剩一句话,所有Java报错的修饰符问题,归根结底都是没分清权限范围和功能特性。

了解更多百科知识请访问 百科