您的位置:

Java修饰符大全

Java修饰符是Java中常用的关键字之一,在Java语言中使用它来控制访问权限、实现封装、继承和多态。本文将从多个方面对Java修饰符进行详细阐述,包括访问修饰符、非访问修饰符、final修饰符、static修饰符、abstract修饰符、synchronized修饰符、volatile修饰符、transient修饰符、native修饰符和strictfp修饰符。

一、访问修饰符

访问修饰符用于控制Java类、Java接口或类中的成员变量和方法的访问权限,可以分为public、protected、private和默认(即不加任何修饰符)四种类型。

1、public修饰符

public修饰符可以被任何类、接口和成员变量和方法访问,是最开放的修饰符,通常被用于设置Java中的公共API。本质上讲,类和接口的public修饰符必须与文件名相同。

public class MyClass {
    public int num = 10;

    public void print() {
        System.out.println("This is a public method");
    }
}

2、protected修饰符

protected修饰符允许Java类、Java接口和其成员变量和方法在其包内被访问。同时,可以让继承自该类的子类访问该类的成员变量和方法,即使该子类的父类在另外一个包内也可以。

package com.example.demo;

public class MyParentClass {
    protected int num = 10;

    protected void print() {
        System.out.println("This is a protected method");
    }
}

public class MyChildClass extends MyParentClass {
    void printNum() {
        System.out.println("The value of num is " + num);
    }
}

3、private修饰符

private修饰符是Java中最严格的限制访问权限的修饰符,它可以限制Java类、接口和成员变量和方法的访问范围仅在该类或接口本身的内部。即使继承自该类的子类也无法访问该类的私有成员变量和方法。

public class MyClass {
    private int num = 10;

    private void print() {
        System.out.println("This is a private method");
    }
}

4、默认修饰符

当Java类、接口或成员变量和方法不使用任何访问修饰符时,Java将会采用默认修饰符来限制它们的访问范围。默认修饰符只能在同一个包中的类或接口中进行访问。

package com.example.demo;

class MyClass {
    int num = 10;

    void print() {
        System.out.println("This is a default method");
    }
}

二、非访问修饰符

Java中的非访问修饰符主要用于类、方法和变量的修饰,可以分为final、static、abstract和synchronized四种类型。

1、final修饰符

final修饰符可以用于Java类、Java方法和Java变量中,表示该类、方法或变量只能被赋值一次。在声明final变量时必须要赋初值,而final方法表示该方法不可以被子类重写,final类代表该类不可以被继承。

public class MyClass {
    public static final double PI = 3.1415926;

    final int num = 10;

    final void print() {
        System.out.println("This is a final method");
    }
}

final class MyFinalClass {
    void print() {
        System.out.println("This is a final class");
    }
}

2、static修饰符

static修饰符可以用于Java类、Java变量和Java方法中,表示该类、变量或方法属于类而非实例化对象,多个实例的静态成员变量可以共享。而静态方法可以直接调用,无需实例化对象,使用类名.方法名的方式即可调用。

public class MyClass {
    public static int num = 10;
    public int count = 0;

    public static void printNum() {
        System.out.println("The value of num is " + num);
    }

    public void increment() {
        num++;
        count++;
    }
}

3、abstract修饰符

abstract修饰符可以用于Java类、Java方法中,表示该类或方法只是一个声明而没有实现。一旦Java类使用abstract修饰符,则该类就必须被声明为抽象类(abstract class)。而抽象方法必须被声明在抽象类中,子类必须实现父类的所有抽象方法。

public abstract class MyAbstractClass {
    public abstract void print();
}

public class MyChildClass extends MyAbstractClass {
    @Override
    public void print() {
        System.out.println("This is a concrete method");
    }
}

4、synchronized修饰符

synchronized修饰符可以用于Java方法中,表示该方法只能在一个线程中执行。当一个线程正在访问synchronized方法时,其他线程必须等待该线程执行完成后才能继续执行该方法。

public class MyClass {
    public synchronized void print() {
        for (int i = 0; i < 5; i++) {
            System.out.println("This is thread " + Thread.currentThread().getName());
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

三、其他非访问修饰符

除了以上几种非访问修饰符之外,Java中还有volatile、transient、native和strictfp修饰符。它们分别用于保证多线程可见性、防止Java序列化、本地方法调用和定义浮点精度。

1、volatile修饰符

volatile修饰符可以用于Java变量中,可以确保多个线程之间变量值的可见性。当多个线程同时访问同一个volatile变量时,它们会从内存中读取该变量的值,而不是从线程的本地缓存中读取。同样的,当更新一个volatile变量时,它会立即写入到内存中,而不是延迟更新。

public class MyVolatileClass {
    public volatile int num = 0;

    public void increment() {
        num++;
        System.out.println("The value of num is " + num);
    }
}

2、transient修饰符

transient修饰符可以用于Java变量中,表示该变量不参与Java序列化。当Java对象被序列化时,transient变量的值将被忽略。

public class MyTransientClass implements Serializable {
    public transient String name = "Alice";
}

3、native修饰符

native修饰符可以用于Java方法中,表示该方法是使用其他编程语言编写的库函数。只有声明有native修饰符的方法才可以使用Java调用其他语言编写的方法。

public class MyNativeClass {
    public native void callCFunction();
}

4、strictfp修饰符

strictfp修饰符可以用于Java方法中或Java类声明中,表示该方法或类的浮点运算采用IEEE 754规范。在不同的平台之间,浮点数的计算可能会有一些微小的差异。但使用strictfp修饰符可以确保相同的结果在不同的平台上运行时都是相同的。

public strictfp class MyStrictfpClass {
    public strictfp double add(double a, double b) {
        return a + b;
    }
}

结论

Java修饰符是Java程序设计中的核心概念,通过对Java修饰符的详细阐述,我们了解了访问修饰符和非访问修饰符的含义和用法,并给出了具体的代码示例。根据不同的需求,开发人员可以采用不同的Java修饰符进行修饰,以实现相应的功能和效果。