我知道在 abstract
类中将方法声明为 private
不是一个好的编码习惯。即使我们无法创建 abstract
类的实例,为什么 private
访问修饰符在 abstract
类中可用,范围是什么abstract
类中的内容?在abstract
类中使用private
访问说明符的场景是什么?
查看这段代码,其中 Vehicle
类是抽象的,Car
扩展了 Vehicle。
package com.vehicle;
abstract class Vehicle {
// What is the scope of the private access modifier within an abstract class, even though method below cannot be accessed??
private void onLights(){
System.out.println("Switch on Lights");
}
public void startEngine(){
System.out.println("Start Engine");
}
}
Within 是创建 Car 类的同一个包
package com.vehicle;
/*
* Car class extends the abstract class Vehicle
*/
public class Car extends Vehicle {
public static void main(String args[]){
Car c = new Car();
c.startEngine();
// Only startEngine() can be accessed
}
}
最佳答案
由于抽象类可以包含功能(与接口(interface)相反),它可以包含私有(private)变量或方法。
在您的示例中,您可能会执行类似的操作
public void startEngine(){
injectFuel();
igniteSpark();
// etc. my understanding of engines is limited at best
System.out.println("Start Engine");
}
private void injectFuel() {}
private void igniteSpark() {}
这样您可以将一些工作分散到其他方法(因此您没有 1000 行的 startEngine 方法),但您不希望 child 能够单独调用 injectFuel,因为它不会在 startEngine 的上下文之外感知(你要确保它只在那里使用)。
甚至更多,您可能有一个私有(private)方法,该方法在其他几个公共(public)方法中被调用,具有不同的参数。这样,您就可以避免在每个公共(public)方法中编写相同的代码两次或多次,并将公共(public)代码分组到私有(private)方法中确保 child 不会访问它(就像他们之前不能只调用公共(public)方法的一部分)。像这样的:
public void startEngine() {
dishargeBattery(50);
System.out.println("Start Engine");
}
public void startRadio() {
dischargeBattery(20);
}
private void dischargeBattery(int value) {
battery.energy -= value; //battery should probably be a private field.
}
这样你的方法可以使用电池,但 children 不应该乱用它,而且你不要在两者中写相同的行 (battery.energy -= value
)其中。但请注意,这些都是非常简单的示例,但如果chargeBattery 是一个 500 行的方法,那么在其他两种方法中都编写它会很麻烦。
关于java - 为什么在 Java 中的抽象类中存在私有(private)访问修饰符,即使我们无法创建抽象类的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3334380/