上节课给大家介绍的数据类型都学会了吗?
java当中的类,方法,变量前面可以加入一些关键字,来表示这个定义的对象的访问方式,这些关键字让类,方法,变量有多种多样的访问方式。
那么我们今天来看看今天的主角
今天的内容是修饰符:
1、修饰符
2、访问控制符
3、非访问控制符
第一部分:修饰符
修饰符是用来修饰类,方法,变量的关键字,放在标识符之前,用来表示这些对象访问方式。
如public表示这个对象可以被工程内的所有对象可访问。static表示对象以内存共享的方式访问,且不需要实例化。等等。
按照修饰符的特点分为:
1、访问控制符
2、非访问控制符
第二部分:访问控制符。
访问控制符来定义类、变量、方法和构造方法的访问权限。也用来参与对象的封装。
Java支持4种不同的访问权限。分为:
默认的,不指定修饰符,在同一包内可见,不使用任何修饰符。
私有的,以 private 修饰符指定,在同一类内可见。
共有的,以 public 修饰符指定,对所有类可见。
受保护的,以 protected 修饰符指定,对同一包内的类和所有子类可见。
图解:
注意:
对象的成员属性和成员方法即使有可访问的权限(如public),也必须先创建对象,才能调用属性和方法。
第二部分:非访问控制符
除了访问控制符之外的,其他的修饰符称为非访问控制修饰符。主要有:
static 静态访问修饰符,内存共享唯一实例
final 最终访问修饰符,表示类、方法无法继承,变量无法更改
abstract 抽象访问修饰符,表示类或方法需要重新实现
synchronized 同步访问修饰符,线程同步互斥锁
transient 非序列化访问修饰符,变量不参与序列化
volatile 内存共享访问修饰符,变量内存访问共享值
一一来介绍下:
1、static
static可以用来修饰变量、方法和类
static关键字用来声明独立于对象的静态变量,无论一个类实例化多少对象,它的静态变量只有一份拷贝。静态变量也被称为类变量。局部变量不能被声明为 static变量。
例:
class Test{
public static flag = "A";
}
任何Test创建的对象都共享这个属性flag的值,任一对象更改这个属性值,其他对象的该属性值也会被改变。
static关键字用来声明独立于对象的静态方法。静态方法不能使用类的非静态变量。静态方法从参数列表得到数据,然后计算这些数据。
静态方法不需要初始化对象,直接可以使用。
例:我们定义一个工具方法,判断数字是否大于0 且小于100
public class Util{
public static boolean isLargeThanZero(int x){
return x>0 && x<100;
}
}
那么,其他类的方法使用时,就可以直接Util.isLargerThanZero(50)去调用。不需要Util util = new Util();util.isLargerThanZero(50)
静态内部类
static关键字声明的内部类不需要初始化,直接可以使用内部的方法和变量。但是只能声明为内部类。
这部分内部类再详述。
2、final修饰符
final修饰符也可以修饰类,方法,变量
final 变量:
final 变量能被显式地初始化并且只能初始化一次。如果变量是对象类型,只可以更改对象属性值。
final 修饰符通常和 static 修饰符一起使用来创建类常量。
例:
final int x = 0; 此时,x=10就是错误的,因为不能再赋值啦。
final User user = new User(); 此时,user = new User()是错误的,但是user.setName(“aa”)是可以的,因为没有更改变量的地址。
final 方法
类中的 final 方法可以被子类继承,但是不能被子类修改。
声明 final 方法的主要目的是防止该方法的内容被修改。
final 类
final 类不能被继承,没有类能够继承 final 类的任何特性。
final类和方法我们再讲述继承时再详述。
3、abstract修饰符
abstract能修饰类和方法,不能修饰变量
abstract修饰类:
abstract修饰类时,类称为抽象类。
一个类不能同时被 abstract 和 final 修饰。
abstract修饰方法
abstract修饰方法时,方法称为抽象方法,抽象方法是一种没有任何实现的方法。
抽象方法不能被声明成 final 和 static。
abstract类和方法我们再讲述继承时再详述。
4、synchronized修饰符
synchronized可以修饰方法、方法块
可用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这段代码。当两个并发线程访问同一个对象object中的这个加锁同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。然而,当一个线程访问object的一个加锁代码块时,另一个线程仍然可以访问该object中的非加锁代码块。
同步方法:
public synchronized void synMethod(){
//方法体
}
同步代码块:
public Object synMethod(Object a1){
synchronized(a1){
//一次只能有一个线程进入
}
}
5、transient修饰符
transient修饰符用于修饰成员变量,代表该成员变量不参与对象的序列化。
也就是说,对象在被转换为流时,会忽略这个关键字修饰的属性;流转换为对象时,也会忽略这个属性。
序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程。
6、volatile修饰符
volatile修饰符用于修饰成员变量,表示这个变量在内存中对各个线程的内存可见性。
一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义:
1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。
2)禁止进行指令重排序。
至此,修饰符就告一段落啦。。我们回顾下今天的内容:
1、四种访问控制符和范围
2、非访问控制符和修饰对象,特性。
are you get it?