Java修饰符

Java语言提供了很多修饰符,主要分为以下两类:

  • 访问修饰符
  • 非访问修饰符

修饰符用来定义类、方法或者变量,通常放在语句的最前端。

访问修饰符

名称 说明 备注
public 可以被所有类访问(使用) public类必须定义在和类名同名的文件中
无访问修饰符(默认) 可以被同一个包中的类访问(使用) 默认的访问权限,可以定义在其他文件中

接口

名称 说明 备注
public 可以被所有类访问(使用) public接口必须定义在和接口名同名的文件中
无访问修饰符(默认) 可以被同一个包中的类访问(使用) 默认的访问权限,可以定义在其他文件中


注意:

  • 一个.java文件中只能有一个public修饰的类或者接口,如果有其它类或者接口,都是默认的无访问修饰符。

  • 接口里的变量都隐式声明为 public static final,而接口里的方法默认情况下访问权限为 public abstract

变量

名称 说明 备注
public 可以被任何类访问
protected 可以被同一包中的所有类访问
可以被所有子类访问
子类没有在同一包中也可以访问
无访问修饰符(默认) 可以被同一包中的所有类访问 如果子类没有在同一个包中,也不能访问
private 只能够被当前类的方法访问

方法

名称 说明 备注
public 可以被任何类访问
protected 可以被同一包中的所有类访问
可以被所有子类访问
子类没有在同一包中也可以访问
无访问修饰符(默认) 可以被同一包中的所有类访问 如果子类没有在同一个包中,也不能访问
private 只能够被当前类的方法访问


注意:

  • Java中子类重写方法的访问权限不能低于父类中权限

非访问修饰符

为了实现一些其他的功能,Java 也提供了许多非访问修饰符。

static

用来修饰类方法和类变量。

静态变量
static 关键字用来声明独立于对象的静态变量,无论一个类实例化多少对象,它的静态变量只有一份拷贝。 静态变量也被称为类变量。局部变量不能被声明为 static

静态方法
static 关键字用来声明独立于对象的静态方法。静态方法不能使用类的非静态变量。静态方法从参数列表得到数据,然后计算这些数据。

final

用来修饰类、方法和变量。

final 修饰的类不能够被继承,修饰的方法不能被重写,修饰的变量为常量,不可修改

final 变量能被显式地初始化并且只能初始化一次。被声明为 final 的对象的引用不能指向不同的对象。但是 final 对象里的数据可以被改变。也就是说 final 对象的引用不能改变,但是里面的值可以改变

final 修饰符通常和 static 修饰符一起使用来创建类常量。

abstract

用来创建抽象类和抽象方法。

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

抽象方法:
抽象方法是一种没有任何实现的方法,该方法的的具体实现由子类提供。
抽象方法不能被声明成 final 和 static。
任何继承抽象类的子类必须实现父类的所有抽象方法,除非该子类也是抽象类
如果一个类包含若干个抽象方法,那么该类必须声明为抽象类。抽象类可以不包含抽象方法

synchronized

用来修饰方法,变量还有代码块。

主要用于线程的编程。

进一步研究可以参考:Java关键字synchronized

volatile

用来修饰成员变量。

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

进一步研究可以参考:对于volatile型变量的特殊规则(深入理解Java虚拟机学习笔记)

transient

用来修饰成员变量。

告诉编译器,在类对象序列化时,此变量不需要持久保存。然后序列化的对象包含被transient修饰的实例变量时,Java虚拟机(JVM)跳过该特定的变量。

参考:
1.Java中各种修饰符与访问修饰符
2.Java 修饰符

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章