Я знаю, что это не хорошая практика кодирования для объявления метода как private
в abstract
класс. Даже при том, что мы не можем создать экземпляр abstract
класс, почему private
модификатор доступа, доступный в abstract
класс, и каков объем его в abstract
класс? В котором сценарий private
спецификатор доступа, используемый в abstract
класс?
проверьте этот код где Vehicle
класс абстрактен и Car
расширяет Механизм.
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
}
}
Поскольку абстрактный класс может содержать функциональные возможности (в отличие от интерфейса), он может иметь частные переменные или методы.
В вашем примере вы можете сделать что-то вроде
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
) в них обоих. Однако обратите внимание, что это очень простые примеры, но если бы разгрузка батареи была методом на 500 строк, записать его в обоих других методах было бы хлопотно.
Это то же самое, что и в неабстрактном классе, нет никакой разницы.
Что означает, что если ничто в вашем абстрактном классе не вызывает приватный метод, то вы можете просто удалить его, так как он не будет вызван (если только не произойдет какая-нибудь злая работа отражения).
Обычно приватные методы используются только как внутренние полезные методы, которые имеют очень специфическую задачу, которую другие методы в классе используют для выполнения своей работы.
Я знаю, что это плохая кодировка практика объявлять метод как private в абстрактном классе.
Я не знаю. Откуда у вас эта идея?
какова ее область применения в абстрактном классе?
в абстрактном классе.
Доступ к методу можно получить только из абстрактного класса. Например, у вас может быть абстрактный класс с общедоступным методом final
, который использует частный вспомогательный метод.