Java提供了许多非访问修饰符来实现许多其他功能。
用于创建类方法和变量的静态修饰符。
在最终的定稿类,方法和变量的实现修改。
用于创建抽象类和方法的abstract 修饰符。
该小号ynchronized和挥发性 改性剂,其用于螺纹。
静态变量
在静态关键字用于创建将独立存在的类创建的所有实例变量。无论类的实例数量如何,静态变量只有一个副本存在。
静态变量也称为类变量。局部变量不能声明为静态。
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() + " instances"); for (int i = 0; i < 500; ++i) { new InstanceCounter(); } System.out.println("Created " + InstanceCounter.getCount() + " instances"); } }
这将产生以下结果-
输出结果
Started with 0 instances Created 500 instances
最终变量
最终变量只能显式初始化一次。声明为final的引用变量永远不能重新分配为引用其他对象。
但是,可以更改对象内的数据。因此,可以更改对象的状态,但不能更改引用的状态。
对于变量,最终修饰符通常与static一起使用,以使常数成为类变量。
public class Test { final int value = 10; //以下是声明常量的示例: public static final int BOXWIDTH = 6; static final String TITLE = "Manager"; public void changeValue() { value = 12; // will give an error } }
最终方法不能被任何子类覆盖。如前 ,final修饰符可防止在子类中修改方法。
使方法最终化的主要目的是,方法的内容不应由外部人员更改。
您可以在类声明中使用final修饰符声明方法,如以下示例所示:
public class Test { public final void changeName() { //方法主体 } }
使用被声明为final的类的主要目的是防止该类被子类化。如果将一个类标记为final,则任何类都不能从final类继承任何功能。
public final class Test { //类主体 }
抽象类
抽象类永远无法实例化。如果将一个类声明为抽象类,则其唯一目的是扩展该类。
一个类不能同时是抽象类和最终类(因为不能扩展最终类)。如果一个类包含抽象方法,则该类应声明为抽象。否则,将引发编译错误。
抽象类可以同时包含抽象方法和常规方法。
abstract class Caravan { private double price; private String model; private String year; public abstract void goFast(); // an abstract method public abstract void changeColor(); }
抽象方法是声明的没有任何实现的方法。方法主体(实现)由子类提供。抽象方法决不能是最终的或严格的。
任何扩展抽象类的类都必须实现超类的所有抽象方法,除非子类也是抽象类。
如果一个类包含一个或多个抽象方法,则必须将该类声明为abstract。抽象类不需要包含抽象方法。
抽象方法以分号结尾。示例:public abstract sample()
;
public abstract class SuperClass { abstract void m(); // abstract method } class SubClass extends SuperClass { //实现抽象方法 void m() { ......... } }
sync关键字用于指示一种方法一次只能由一个线程访问。同步修改器可以与四个访问级别修改器中的任何一个一起应用。
public synchronized void showDetails() { ....... }
实例变量被标记为瞬态,以指示JVM在序列化包含它的对象时跳过特定变量。
该修饰符包含在创建变量的语句中,该语句位于变量的类或数据类型之前。
public transient int limit = 55; // will not persist public int b; // will persist
volatile修饰符用于让JVM知道访问该变量的线程必须始终将其自身的变量私有副本与内存中的主副本合并。
访问易失性变量将同步主存储器中变量的所有缓存副本。可变变量只能应用于对象类型或私有类型的实例变量。易失性对象引用可以为null。
public class MyRunnable implements Runnable { private volatile boolean active; public void run() { active = true; while (active) { // line 1 //一些代码在这里 } } public void stop() { active = false; // line 2 } }
通常,run()
在一个线程(您使用Runnable开始的那个stop()
线程)中调用,并从另一个线程调用。如果在第1行中使用了动作的缓存值,则在第2行中将active设置为false时,循环可能不会停止,这就是您要使用volatile的时候。