📜  Java的受保护与最终访问修饰符(1)

📅  最后修改于: 2023-12-03 14:43:02.869000             🧑  作者: Mango

Java的受保护与最终访问修饰符

在Java中,我们可以使用访问修饰符来控制类、变量和方法的可见性。Java中有四种访问修饰符:public、protected、private和默认(即不写修饰符)。其中,public是最开放的,可以在任何地方被访问到;private是最严格的,只能在其声明的类中访问。

除了public和private之外,还有两种访问修饰符,即protected和最终访问修饰符。本文将着重介绍这两种访问修饰符的使用方法以及其区别。

受保护的访问修饰符

protected是一种比默认访问修饰符更严格的访问修饰符。使用protected修饰的变量和方法只能在当前类、同一包内的类和该类的子类中访问。这种修饰符通常应用于类的成员变量和成员方法。

示例:

package com.example;

public class Animal {
    protected int age;
    protected void bark() {
        System.out.println("Animal is barking");
    }
}

package com.example;

public class Dog extends Animal {
    public void info() {
        System.out.println("Age of dog is " + age);
    }
    public void bark() {
        System.out.println("Dog is barking");
    }
}

package com.example;

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.age = 3; // 非同一包内的类中不可访问
        dog.info(); // 在子类中可以访问父类成员变量
        dog.bark(); // 调用子类中的方法
    }
}

在上面的示例中,我们定义了一个Animal类,在其中声明了一个protected类型的age变量和一个protected类型的bark()方法。然后,我们又定义了一个Dog类,继承了Animal类,并重写了bark()方法。在Main类中,我们实例化了一个Dog类的对象,然后调用了dog.age和dog.info()方法,这里展示了在子类中可以访问父类中protected类型的成员变量的例子。最后,我们调用了dog.bark()方法,由于我们在子类中重写了bark()方法,因此输出的内容是“Dog is barking”。

最终访问修饰符

最终访问修饰符(final)可以应用于类、变量和方法。使用final修饰的类不能被继承,使用final修饰的变量是一个常量,不能被修改,使用final修饰的方法不能被重写。

示例:

package com.example;

public final class Animal {
    public final String TYPE = "mammal";
    public final void bark() {
        System.out.println("Animal is barking");
    }
}

public class Dog extends Animal { // 无法继承final修饰的类
    // 编译错误:Cannot override the final method from Animal
    public void bark() {
        System.out.println("Dog is barking");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal animal = new Animal();
        animal.TYPE = "bird"; // 编译错误:The final field Animal.TYPE cannot be assigned
        animal.bark(); // 方法不能在子类中重写
    }
}

在上面的示例中,我们定义了一个Animal类,并把它声明为final类型。在该类中,我们声明了一个final类型的TYPE变量和一个final类型的bark()方法。然后,我们定义了一个Dog类,尝试继承Animal类并重写bark()方法,由于Animal类是final类型,无法被继承,所以编译时会出错。在Main类中,我们实例化了一个Animal类对象,并尝试修改它的TYPE变量的值,然而由于该变量是final类型,不能被修改,所以编译时会出错。

最终访问修饰符的使用场景比protected要少,但在一些特定的场景中也非常有用,比如定义常量和防止子类修改某些方法。