Java语言提供的修饰符主要分为以下两类:
访问修饰符非访问修饰符Java中,可以使用访问修饰符来保护对类、变量、方法和构造方法的访问。Java 支持 4 种不同的访问权限。
default (即默认): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。
private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)
public : 对所有类可见。使用对象:类、接口、变量、方法
protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)。
使用默认访问修饰符声明的变量和方法,对同一个包内的类是可见的。接口里的变量都隐式声明为 public static final,而接口里的方法默认情况下访问权限为 public。
被声明为 private 的方法、变量和构造方法只能被所属类访问,并且类和接口不能声明为 private。声明为私有访问类型的变量只能通过类中公共的 getter 方法被外部类访问。Private 访问修饰符的使用主要用来隐藏类的实现细节和保护类的数据。
被声明为 public 的类、方法、构造方法和接口能够被任何其他类访问。
子类与基类在同一包中:被声明为 protected 的变量、方法和构造器能被同一个包中的任何其他类访问;
子类与基类不在同一包中:那么在子类中,子类实例可以访问其从基类继承而来的 protected 方法,而不能访问基类实例的protected方法。
protected 可以修饰数据成员,构造方法,方法成员,不能修饰类(内部类除外)。
为了实现一些其他的功能,Java 也提供了许多非访问修饰符。
static 修饰符,用来修饰类方法和类变量。final 修饰符,用来修饰类、方法和变量,final 修饰的类不能够被继承,修饰的方法不能被子类重写,修饰的变量为常量。abstract 修饰符,用来创建抽象类和抽象方法。synchronized 、transient和 volatile 修饰符,主要用于线程的编程。native修饰符,标识为本地方法。1.可以修饰:修饰属性、修饰方法、修饰块、修饰类(内部类)
2.特点:
1)静态元素在类加载时就初始化了,此时没有创建对象
2)静态元素存储在静态元素区中,每一个类
3)静态元素只加载一次,全部类对象及类本身共享
4)被static修饰过可以直接通过类名直接访问
5)静态元素属于类,不属于任何一个对象
6)栈内存创建开始用完即回收,堆内存GC回收,静态元素区GC无法管理
7)非静态成员(堆内存中对象)可以访问静态成员(静态区)
8)静态成员中可以访问静态成员
9)静态成员不可以访问非静态成员
个数上:一个点出发访问一堆名字相同的东西
关系上:静态元素属于类 非静态成员属于对象
10)静态元素中不可以出现this或super关键字(静态成员属于类)
修饰变量 如果在定义变量的时候没有赋初始值,给变量一次赋值的机会
一旦变量被存储了一个值,若用final修饰之后,则不允许修改
如果final修饰的变量是基本类型,则变量内的值不允许更改
如果final修饰的变量是引用类型,则变量的地址不允许更改
修饰属性 全局变量 存储在堆内存对象空间内,属性用final修饰后,必须给属性赋初值
修饰方法 方法不可更改,final修饰过的方法,子类继承父类后不能重写
修饰类本身 final修饰的类不可以其他子类继承
修饰方法 用abstract修饰过的方法没有方法体,叫做抽象方法
修饰类 用abstract修饰过的类叫做抽象类
native修饰的成员方法,表示这个方法是本地方法,java调用的是底层代码。
序列化的对象包含被 transient 修饰的实例变量时,java 虚拟机(JVM)跳过该特定的变量。
synchronized 关键字声明的方法同一时间只能被一个线程访问。该修饰符可以应用于所有访问修饰符。
volatile 修饰的成员变量在每次被线程访问时,都强制从共享内存中重新读取该成员变量的值。而且,当成员变量发生变化时,会强制线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。
