Подтвердить что ты не робот

Почему существует специальный модификатор доступа в абстрактном классе на Java, хотя мы не можем создать экземпляр абстрактного класса?

Я знаю, что это не хорошая практика кодирования, чтобы объявить метод как 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");
  }

}

Внутри этого же пакета создается класс 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 
 }

}
4b9b3361

Ответ 1

Поскольку абстрактный класс может содержать функциональность (в отличие от интерфейса), он может иметь частные переменные или методы.

В вашем примере вы можете сделать что-то вроде

 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 строк, запись ее в обоих методах была бы затруднительной.

Ответ 2

Это то же самое, что и в не-абстрактном классе, нет разницы.

Это означает, что если ничто в вашем абстрактном классе не вызывает частный метод, тогда вы можете просто удалить его, так как он не будет вызван (запрещение работы с неправильным отражением).

Обычно частные методы используются только как внутренние утилиты, которые имеют очень специфическую задачу, которую другие методы в классе используют для выполнения своей работы.

Ответ 3

Я знаю, что это не хорошая кодировка практике, чтобы объявить метод как частный в абстрактном классе.

Я этого не делаю. Откуда у вас эта идея?

какова его область действия в абстрактном классе?

Абстрактный класс.

Ответ 4

Доступ к методу можно получить только из абстрактного класса. Например, у вас может быть абстрактный класс с помощью метода public final, который использует частный вспомогательный метод.