Java有哪些非访问修饰符呢?

转自:

Java有哪些非访问修饰符呢?

Java提供了许多非访问修饰符用于实现一些其它功能:

  • static修饰符用于创建类方法和变量。
  • final修饰符用于完成类,方法和变量的实现。
  • abstract修饰符用于创建抽象类和方法。
  • synchronizedvolatile修饰符,用于线程。

下文将依次讲述这些----非访问修饰符

1. static修饰符

1.1. 静态变量

static关键字用于创建独立于类实例的变量。无论类的实例数有多少个,都只存在一个静态变量副本。静态变量也称为类变量。局部变量不能声明为static

1.2. 静态方法

static关键字用于创建独立于类实例的方法。
静态方法不能使用作为类的对象的实例变量,静态方法也叫作类方法。静态方法从参数中获取所有数据并从这些参数计算某些内容,而不引用变量。可以使用类名后跟一个点(.)以及变量或方法的名称来访问类变量或方法。

  • static修饰符用于创建类方法和变量,如下例所示 -
public class testClass{

   private static int qty= 0;

   protected static int getQty() {
      return qty;
   }

   private static void addQty() {
      qty++;
   }

   InstanceCounter() {
      testClass.addQty();
   }

   public static void main(String[] arguments) {
      System.out.println("qty: " + testClass.getQty());

      for (int i = 0; i < 500; ++i) {
         new testClass();
      }
      System.out.println("qty:" + testClass.getQty());
   }
}

2. final修饰符

2.1. final变量

final变量只能显式地初始化一次,
声明为final的引用变量永远不能重新分配以引用不同的对象。
但,可以更改对象内的数据。
所以,可以更改对象的状态,但不能更改引用。
对于变量,final修饰符通常与static一起使用,
以使常量成为类变量。

如:

public class JavaTest{
   final int qty= 888;

   // 以下是声明常量的示例:
   public static final int widthInfo= 8;
   static final String Name= "java265.com";

   public void changeInt() {
      qty = 12;   // 会出错,不能重新赋值
   }
}

2.2. final方法

任何子类都不能覆盖final方法。
如前所述,final修饰符可防止在子类中修改方法。

声明final方法的主要目的是不让其它人改变方法的内容。


可以在类声明中使用final修饰符声明方法,如下例所示 -

public class JavaTest{
   public final void changeName() {
      // 方法主体
   }
}

2.3. final类

使用声明为final的类的主要目的是防止类被子类化。
当一个类被标记为final,则这个类不能被其它类所继承

如:

public final class JavaTest {
   // body of class
}

Java

3. abstract饰符

3.1. 抽象类

抽象(abstract)类不能实例化。
当一个类声明为抽象(abstract),那么此类需被扩展 才有意义

一个类不能是同时是abstractfinal(因为final类不能被扩展)。
当一个类包含抽象方法,
则该类应该被声明为abstract
否则,将抛出编译错误。

抽象类可以包含抽象方法以及普通方法。

abstract class TestClass{
   private double a;
   private String b;
   private String c;
   public void getB(String b){};// 这是一个普通方法
   public abstract void getC();   // 这是一个抽象方法
   public abstract void setA();// 这是一个抽象方法
}

3.2. 抽象方法
抽象方法是在没有任何实现的情况下声明的方法。
方法体(实现)由子类提供。
抽象方法永远不会是最终的或严格的。

扩展抽象类的任何类都必须实现超类的所有抽象方法,
除非子类也是抽象类。

如果一个类包含一个或多个抽象方法
,那么该类必须声明为abstract。
抽象类不需要包含抽象方法。

抽象方法以分号结尾。
如:public abstract sample();

public abstract class testClass{
   abstract void test();   // 抽象方法
}

class SubClass extends TestClass{
   // 实现抽象方法
   void test() {
      // 实现代码.........
   }
}

4. synchronized修饰符

synchronized关键字用于指示一次只能访问一个方法的方法。
synchronized修饰符可以应用于四个访问级别修饰符中的任何一个。

public synchronized void showInfo() {
   .......
}

5. transient修饰符

 当实例变量标记为transient时
 则表示JVM在序列化包含它的对象时跳过特定变量。

此修饰符包含在创建变量的语句中,
位于变量的类或数据类型之前

如:

public transient int max= 88;   // 
public int b;   

6. volatile修饰符

volatile修饰符用于让JVM知道访问变量的线程必须始终将其自己的变量私有副本与内存中的主副本合并。

访问volatile变量会同步主内存中变量的所有缓存复制。
volatile只能应用于实例变量,类型为private
volatile对象引用可以为null

public class MyClass implements JavaTest{
   private volatile boolean t;

   public void runMain() {
      t= true;
      while (t) {   
         // 
      }
   }

   public void runStop() {
      t= false;    
   }
}

通常,在一个线程(使用JavaTest开始的线程)中调用runMain()
并从另一个线程调用runStop()
如果在第1行中使用了t的缓存值,
那么当在第2行中将t设置为false时,
循环可能不会停止。
所以此时使用 
volatile  修饰符可使程序运行时,将内存中主附本合并读取

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值