📅  最后修改于: 2023-12-03 14:43:02.869000             🧑  作者: Mango
在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要少,但在一些特定的场景中也非常有用,比如定义常量和防止子类修改某些方法。