Java语言提供了很多修饰符,主要分为两类:访问修饰符和非访问修饰符。
访问控制修饰符:
1、private --> 只有本类中可以访问。
2、default --> 只有同一个package中可以访问。
3、protected --> 同一个package中可以访问,不同package的子类中也可以访问。
4、public --> 所有类中都可以访问。 非访问控制修饰符:
5、static --> 静态修饰符。
6、abstract --> 抽象修饰符。
7、final --> 终结修饰符,不能再被扩展。
类支持的修饰符:
访问控制修饰符: default 、public
非访问控制修饰符: static 、 abstract 、final
属性支持的修饰符:
访问控制修饰符: private 、default 、protected 、public
非访问控制修饰符: static 、final
方法支持的修饰符:
访问控制修饰符: private、default、protected、public
非访问控制修饰符: static、abstract、final
修饰符的规则:
1、类修饰符,final和abstract不能并用,而final和static、abstract和static可以并用。
2、属性修饰符,final和static可以并用,并用时表示常量。
3、方法修饰符,final和abstract不能并用,static和abstract也不能并用;而abstract修饰符只能用到有abstract修饰的类和接口中。
其他修饰符:
1、native修饰符:表示被修饰的方法由本地语言实现。 例如: java.lang.System类中: public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
2、transient修饰符:java的类实现了java.io.Serializable接口,当对象被序列化时,被transient修饰的不被序列化,也就是被修饰的不进行保存。
3、volatile修饰符:volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。
4、synchronized修饰符:同步修饰符。如果用它来修饰一个类的非静态方法,有其他对象访问这个方法时,就相当锁定到这个类的对象上,与此同时,如果再有其他对象在访问这个对象的方法时,就需要等待释放锁才能访问。
代码
public class ModifierDemo {
private class A1 {}
class B1 {}
protected class C1 {}
public class D1 {}
private static class A2 {}
static class B2 {}
protected static class C2 {}
public static class D2 {}
public static void main(String[] args) {
System.out.println("outter public=" ModifierDemo.class.getModifiers());
// private --> 只有本类中可以访问。
// default --> 只有同一个package中可以访问。
// protected --> 同一个package中可以访问,不同package的子类中也可以访问。
// public --> 所有类中都可以访问。
System.out.println("inner private=" A1.class.getModifiers());
System.out.println("inner default=" B1.class.getModifiers());
System.out.println("inner protected=" C1.class.getModifiers());
System.out.println("inner public=" D1.class.getModifiers());
System.out.println("inner static private=" A2.class.getModifiers());
System.out.println("inner static default=" B2.class.getModifiers());
System.out.println("inner static protected=" C2.class.getModifiers());
System.out.println("inner static public=" D2.class.getModifiers());
}
}