梦入琼楼寒有月,行过石树冻无烟

JAVA 修饰符

JAVA主要分为访问修饰符非访问修饰符,而修饰符主要用于定义类\方法或变量\通常放在语句的最前端

一 访问控制修饰符

JAVA中可以使用访问控制符用于保护对类\变量\方法和构造方法的访问

修饰符 描述 对象
default 在同一包内可见不使用修饰符 类\接口\变量\方法
private 在同一类内可见 变量\方法
public 对所有类可见 类\接口\变量\方法
protected 对同一包内的类和所有子类可见 变量\方法

1.默认访问修饰符

对统一包内的类是可见的.接口里的变量都隐式生命为public stati final 而接口里的默认方法权限为public

2.private (私有访问修饰符)

1
2
3
4
5
6
7
8
9
10
11
12
public class Demo {
// 私有变量
private String format;

// 为了其他类可以访问定义public变脸
public String getFormat() {
return this.format;
}
public void setFormat(String format) {
this.format = format;
}
}

私有访问修饰符是最严格的的访问级别,声明方法为private,变量和构造方法只能被所属类访问, 并且类和接口不能声明为private

3.public (公有访问修饰符)

1
2
3
4
5
public class Demo {
public static void main (String args[]) {
System.out.println("Hello,world");
}
}

使用public声明的类\方法\构造放噶和接口能被任何其他类访问

4.protected (受保护的访问修饰符)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package demo;

class Demo {

// 如果将openSpeaker声明为private则只能Demo访问
// private boolean openSpeaker(Demo1 sp) {}
protected boolean openSpeaker(Demo1 sp) {
return false;
// 实现细节
}
}

class StreamingAudioPlayer extends Demo {
// 如果将 openSpeaker声明为"public"则所有类都可以访问
// public boolean openSpeaker(Demo1 sp){}
protected boolean openSpeaker(Demo1 sp) {
return false;
// 实现细节
}
}

1.基类的protected成员是包内可见的,对子类也可见

2.诺子类与基类不再同一包中那么子类实例可以访问其他从基类来继承而来的protected方法,而不能访问基类实例的protected方法

3.也就是说protected 之可以同一包中的类或自身可以访问

主要的作用就是用于保护子类,他的含义在于子类可以用他修饰的成员,其他的不可以,相当与传递给子类继承的东西

如果只想让该方法对其所在的子类中可见,那么则声明为”protected”

二 非访问修饰符

在JAVA修饰符中,提供了非访问修饰符.主要分为:

ID 描述
static 用于修饰类方法和类变量
final 用于修饰类\方法和变量 不能被集成,修饰方法不能被继承类重新定义,修饰的变量为常量是不可被修改的
abstrace 用于创建抽象类和抽象方法
synchronized 用于多线程
volatile 用于多线程

1.Static (类变量)

1
2
3
4
5
6
7
8
9
10
public class Demo {
// 变量
public static int i = 0;

// 方法
public static int getDemo() {
return i;

}
}

static主要分为静态变量 or 静态方法:

1.static关键字用来声明独立的对象和静态变量,无论多少个对象,静态变量只能有一分复制而局部变量不能被声明为static变量

2.static关键字用来声明独立于对象的静态方法.静态方法不能使用非静态方法 静态方法从参数列表得到这些数据而计算这些数据

2.Final

2.1 声明变量
1
2
3
4
5
6
public class Demo {
// 声明一个变量
final int v = 10;
public static final int V = 1;
static final String ID = "Final";
}
2.2 方法体
1
2
3
4
5
public class Demo {
public final void idFinal() {

}
}
2.3 类
1
2
3
public final class Demo {

}

final主要用于表述最后的含义,变量一旦赋值以后,不能被重新赋值,被final修饰的实例变量必须制定初始值

3.Abstract

1
2
3
4
public abstract class Demo {
// 抽象方法
abstract void a();
}

抽象类不能用于实例化对象,唯一的目是将对未来该类进行扩充.final类不能同时与abstact类一起声明.而抽象类一共包含了两种方法分别为”抽象方法 or 非抽象方法”

抽象方法的声明需以分号进行结尾

4.synchronized

1
2
3
4
public class Demo {
public synchronized void thrEad() {
}
}

synchronized方法的特点就是可以同一时间内只能被一个线程所访问,而synchronized修饰符可以应用与四个访问修饰符,也就是说他可以同时被4个线程访问

5.transient

1
2
3
4
5
6
7
public class Demo {
// 不会对此进行序列化
public transient static int t = 10;

// 会对此进行序列化
public int i;
}

在实际的开发过程中,比如一个银行系统他会涉及很多的问题需要序列化,就比如一些用户敏感信息(如身份证,银行卡密码等),为了安全期间,我们不希望对此进行序列化操作,而此时就会需要transient关键字

6.volatile

volatile修饰的成员变量的时候在每次被线程访问时,都其强制共享内存中读取该成员变量的.当成员变量发生变化的时候,都会强制线程将变化值回写到共享内存中.

​ 引用菜鸟教程为例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class MyRunnable implements Runnable {
private volatile boolean active;
public void run()
{
active = true;
while (active) // 第一行
{
// 代码
}
}
public void stop()
{
active = false; // 第二行
}
}

在通常的情况之下,在一个线程调用了**run()**方法后,在另一个

线程调用了stop()方法,如果 第一行缓冲区的active值被使用,那么 第二行的值为false时循环不会停止.

但是如果哟感到了 volatile修饰active,所以循环会停止

⬅️ Go back