Почему там частный модификатор доступа в абстрактном классе в 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");
  }

}

В тот же пакет, создающий Автомобильный класс

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 
 }

}
19
задан user207421 3 October 2015 в 19:31
поделиться

4 ответа

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

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

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

39
ответ дан 30 November 2019 в 02:33
поделиться

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

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

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

8
ответ дан 30 November 2019 в 02:33
поделиться

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

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

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

в абстрактном классе.

4
ответ дан 30 November 2019 в 02:33
поделиться

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

1
ответ дан 30 November 2019 в 02:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: