为什么Java中的抽象类中存在私有访问修饰符,即使我们不能创建抽象类的实例?
我知道在为什么Java中的抽象类中存在私有访问修饰符,即使我们不能创建抽象类的实例?,java,abstract-class,private,Java,Abstract Class,Private,我知道在abstract类中将方法声明为private不是一个好的编码实践。即使我们不能创建抽象类的实例,为什么抽象类中可以使用私有访问修饰符,以及抽象类中的范围是什么?在哪种情况下,抽象类中使用了私有访问说明符 查看此代码,其中Vehicle类是抽象的,而Car扩展了Vehicle package com.vehicle; abstract class Vehicle { // What is the scope of the private access modifier within
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");
}
}
其中是创建汽车类的同一个包
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
}
}
这与非抽象类中的情况相同,没有区别 这意味着,如果抽象类中没有任何东西调用私有方法,那么您也可以删除它,因为它不会被调用(暴露出一些邪恶的反射工作)
通常,私有方法仅用作内部实用程序方法,这些方法具有非常特定的任务,类中的其他方法使用这些任务来完成其工作。只能从抽象类中访问该方法。例如,您可以拥有一个抽象类,该类具有一个使用私有助手方法的
公共final
方法。因为抽象类可以包含功能(而不是接口),所以它可以具有私有变量或方法
在您的示例中,您可以执行以下操作
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方法),但您不希望孩子们能够单独调用injectFuel,因为它在startEngine的上下文之外没有意义(您希望确保它只在那里使用)
或者,您可能有一个私有方法,在其他几个公共方法中使用不同的参数调用该方法。这样可以避免在每个公共方法中编写相同的代码两次或两次以上,并且将公共代码分组到私有方法中可以确保子级不会访问它(就像他们以前不能只调用公共方法的一部分一样)。大概是这样的:
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.
}
通过这种方式,您的方法可以访问电池,但孩子们不应该弄乱它,并且您不会在这两个方法中写入相同的行(battery.energy-=value
)。但是请注意,这些都是非常简单的示例,但是如果dischargeBattery是一个500行的方法,那么在其他两种方法中编写它将是一个麻烦
我知道这不是一个好的编码
将方法声明为
在抽象类中是私有的
我不知道。你从哪里得到这个主意的
它在抽象类中的范围是什么
抽象类。你说服了我!