Loading

Java中的四种权限修饰符及六种非访问修饰符(简识)

一、是哪四种访问权限修饰符呢?

public > protected > [default] > private

(公共的 ) (受保护的) (默认的) (私有的)

二、简单认识四种访问修饰符

1、public权限修饰符

public——可以修饰类,方法,构造方法,接口,方法成员。
被public修饰的成员,可以在任何一个类中被调用,不管同包或不同包,是权限最大的一个修饰符。
如果几个相互访问的 public 类分布在不同的包中,则需要导入相应 public 类所在的包。
由于类的继承性,类所有的公有方法和变量都能被其子类继承。


注意: Java 程序的 main() 方法必须设置成公有的(public),否则,Java 解释器将不能运行该类。

2、protected权限修饰符

protected 可以修饰数据成员,构造方法,方法成员,不能修饰类(此处指外部类,不考虑内部类)。
子类与基类在同一包中 :被声明为 protected 的变量、方法和构造器能被同一个包中的任何其他类访问
子类与基类不在同一包中 :那么在子类中,子类实例可以访问其从基类继承而来的 protected 方法,而不能访问基类实例的protected方法。
被protected修饰的成员,能在定义它们的类中,同包的类中被调用。如果有不同包的类想调用它们,那么这个类必须是定义它们的类的子类。

注意:protected权限修饰符是一种难以理解的权限修饰符,建议可以深入了解,下面一篇文章是菜鸟教程中的内容: Java protected 关键字详解: https://www.runoob.com/w3cnote/java-protected-keyword-detailed-explanation.html


3、[default]权限修饰符

使用默认访问修饰符声明的变量和方法,对同一个包内的类是可见的。接口里的变量都隐式声明为 public static final ,而接口里的方法默认情况下访问权限为 public
写上“[]”这种符号,是为了表示这种修饰符可以省略不写!


4、private权限修饰符

私有访问修饰符是最严格的访问级别,所以被声明为 private 的方法、变量和构造方法只能被所属类访问,并且类和接口不能声明为 private
声明为私有访问类型的变量只能通过类中公共的 getter 方法被外部类访问。
Private 访问修饰符的使用主要用来隐藏类的实现细节和保护类的数据。


三、再次认识及运用技巧

注:图片来源网络,如侵权,联系删!

技巧:

区别 public protected [default] private
同一个类中 可以访问 可以访问 可以访问 可以访问
同一个包中 可以访问 可以访问 可以访问 不可以
不同包的子类 可以访问 可以访问 不可以 不可以
不同包的非子类 可以访问 不可以 不可以 不可以

四、是哪六种非访问修饰符呢?

static

(静态的)
abstract

(抽象的)
final

(最终的)
synchronized

(同步的)
volatile

(异变的)
transient

(短暂的)

五、简单认识六种非访问修饰符

1、static

静态变量:
static 关键字用来声明独立于对象的静态变量,无论一个类实例化多少对象,它的静态变量只有一份拷贝。 静态变量也被称为类变量。局部变量不能被声明为 static 变量。
静态方法:
static 关键字用来声明独立于对象的静态方法。静态方法不能使用类的非静态变量。静态方法从参数列表得到数据,然后计算这些数据。
静态代码块
静态代码块在类加载时只执行一次。先与构造函数执行


2、abstract

抽象类:
抽象类 不能用来实例化对象 ,声明抽象类的唯一目的是为了将来对该类进行扩充。
一个类不能同时被 abstract 和 final 修饰
如果一个类包含抽象方法,那么该类一定要声明为抽象类,否则将出现编译错误。
抽象类可以包含抽象方法和非抽象方法。

抽象方法
抽象方法是一种 没有任何实现的方法 ,该方法的的 具体实现由子类提供。
抽象方法不能被声明成 final 和 static。
任何继承抽象类的子类必须实现父类的所有抽象方法,除非该子类也是抽象类。
如果一个类包含若干个抽象方法,那么该类必须声明为抽象类。抽象类可以不包含抽象方法。
抽象方法的声明以分号结尾 ,例如: public abstract sample();
提供限制来不实例化抽象类,这样就需要任何使用该抽象类的人来实现它,并提供多态性。


3、final

final 类不能被继承,没有类能够继承 final 类的任何特性。
final类不能被继承。
final变量一旦被赋值就不能被改变。
final方法不能被重写( 可以被重载 )。
注意:
对于 引用类型 来说,“不可变”说的是 地址值不可变
对于基本类型来说,“不可变”说的是数据不可变


4、synchronized 修饰符

synchronized 关键字声明的方法同一时间只能被一个线程访问。synchronized 修饰符可以应用于四个访问修饰符。

注:图片来源网络,如侵权,联系删!


5、 transient 修饰符

序列化的对象包含被 transient 修饰的实例变量时,java 虚拟机(JVM)跳过该特定的变量。
该修饰符包含在定义变量的语句中,用来预处理类和变量的数据类型


6、volatile 修饰符

volatile 修饰的成员变量在每次被线程访问时,都强制从共享内存中重新读取该成员变量的值。
而且,当成员变量发生变化时,会强制线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。
一个 volatile 对象引用可能是 null。

以下内容来自 https://blog.csdn.net/J080624/article/details/78258121

volatile和synchronize之间的区别:
volatile关键字只用来在线程内存和主内存之间同步单个变量值,synchronized关键字用来同步线程内存和主内存之间的所有变量值以及如何锁定和释放一个监视器。synchronized比volatile有着更大的开销。
volatile变量不允许出现和当前主存中的数据值不同的的本地副本。
更准确地说,被声明为volatile的变量必须保证它的数据值在所有线程的中是同步的。也就是当你在任一线程中访问或者更新一个变量时,所有其它线程能够立即访问到相同的值。



最后

学习还是得反复(像和我一样的“笨鸟”,不仅要先飞,还要成功的返回!)

在暑假的这几天发现有点愧对首页的那句话:

苟有恒,何必三更眠五更醒。最无益,莫过一日曝十日寒!

感觉学着学着学不动了,也产生了厌倦感。

但是,这样下去肯定是给自己挖坑的,还是要卯足了劲 , 继续学习路程。还有,如果有看到我这篇笔记并且和我一样前行的人, 在此送一句话, 以共勉!

“有的人说,我们这个时代不缺机会,所以也势必会让每个人面临很多选择,那么,是遵从自己的内心,还是随波逐流;是直面挑战还是落荒而逃;是选择喧嚣一时的功利,还是恒久平静的善良;无论如何,希望每个人,都能做出一个在日后回想不让自己后悔的选择。”
posted @ 2020-08-06 23:29  余月七  阅读(656)  评论(0编辑  收藏  举报