版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
访问控制修饰符
- defult:默认,什么都不写,在同一包中可见,不使用任何修饰符,默认访问修饰符。使用对象:类、接口、变量、方法
- private:在同一类内可见。使用对象:变量、方法。声明私有访问类型的变量只能通过类中公共的getter方法被外部类访问,用来隐藏类的实现细节和保护类的数据
- public:对所有类可见。使用对象:类、接口、变量、方法。Java程序中main()方法必须设置成公有的
- protected:对同一包内的类和所有子类可见。使用对象:变量、方法。父类中声明为protected的方法在子类中可以声明为protected、可以声明public,不能声明为private
非访问修饰符
- static:只是一个标志,用来修饰方法和类变量,有static修饰,表明被修饰的成员属于类,没有static修饰,表明它是属于实例的,static成员(Field、方法、初始化块),与类共存亡。声明独立于对象的静态方法(从参数列表得到数据,然后计算这些数据);声明独立于对象的静态变量(静态变量也被成为类变量,只有一份拷贝)。注意:局部变量不能被声明为static变量
//static修饰符用来创建方法和类变量 public class InstanceCounter { private static int numInstances = 0; protected static int getCount(){ return numInstances; } private static void addInstance(){ numInstances++; } InstanceCounter(){ InstanceCounter.addInstance(); } public static void main(String[] arguments){ System.out.println("starting with " + InstanceCounter.getCount() + " instance"); for(int i = 0; i < 500; ++i){ new InstanceCounter(); } System.out.println("Created " + InstanceCounter.getCount() + " instances"); } }
public class StaticTest { //定义一个类Field,它与StaticTest类本身gongcunw static int count = 20; public static void main(String[] args) { //之定义了一个st引用变量,但为指向任何有效的对象 StaticTest st = null; //对于静态field、static方法,我们建议将实例可以直接代替成为类名 System.out.println(StaticTest.count); } }
注意:必须先有类,再有对象,static成员与类共存亡。static成员不允许访问非static成员,this引用,super都不允许出现在static方法中
- final :用于修饰类,用于修饰变量:成员变量(类变量和实例变量)和局部变量(方法里局部变量,代码块的局部变量),用于修饰方法。final 修饰的类不能够被继承,修饰的方法不能被继承类重新定义,修饰的变量为常量,是不可修改的,目的是防止该方法的内容被修改,通常和static修饰符一起使用来创建类常量。注意:定义成员变量时需要指定默认值(final int a = 6;)或者(final static double d; static{ d = 5.6;}),定义之后不可修改内容;final方法被重写,通过修饰private访问权限即可
//final修饰实例变量 public class FinalInstanceVarTest { //final修饰的实例变量必须指定初始值,只能在3个地方指定初始化,并且只能有一个 //1.定义时指定初始值 //final int age = 10; //2.初始化块 /* final int age; { age = 10; } */ //3.构造器方法 final int age; { System.out.println("~~~进入初始化块~~~"); } FinalInstanceVarTest() { //构造其中可为final实例变量赋值,普通方法不允许为final实例变量赋值 age = 45; } public static void main(String[] args) { FinalInstanceVarTest ft = new FinalInstanceVarTest(); System.out.println(ft.age); } }
//final修饰类变量 public class FinalStaticVarTest { //如果final修饰类变量,可以在2个地方为final类变量指定初始值,最多只能指定一次初始值 //普通类方法、普通方法、普通初始化块都不能为final实例变量赋值 //1.定义时指定初始值 //final static int age = 20; //2.静态初始化块 final static int age; static{ age = 20; } public static void main(String[] args) { System.out.println(FinalStaticVarTest.age); } }
- abstract:修饰符,用来创建抽象类(为了将来对类进行扩充,一个类不能同时被abstract和final修饰)和抽象方法(一种没有任何实现的方法,该方法的具体实现由子类提供,不能声明成final和static)
- volatile:成员变量在每次被线程访问时,强制从共享内存中重新读取该成员变量的值,当成员变量发生变化时,会强制线程将变化值回写到共享内存。一个volatile对象引用可能是null
- synchronize:可以应用于四个访问修饰符,关键字声明的方法同一时间只能被一个线程访问
- transient:该修饰符包含在定义变量的语句中,用来预处理类和变量的数据类型