Почему в абстрактном классе в Java есть модификатор закрытого доступа, хотя мы не можем создать экземпляр абстрактного класса? - PullRequest
18 голосов
/ 26 июля 2010

Я знаю, что это плохая практика кодирования - объявлять метод как private в abstract классе.Даже если мы не можем создать экземпляр класса abstract, почему модификатор доступа private доступен в классе abstract, и какова его область действия в классе abstract?В каком сценарии спецификатор доступа private используется в классе abstract?

. Проверьте этот код, где класс 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");
  }

}

В том же пакете создается класс 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 
 }

}

Ответы [ 4 ]

38 голосов
/ 26 июля 2010

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

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

 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) в обоихиз них.Заметьте, однако, что это очень простые примеры, но если бы метод dumpBattery представлял собой метод с 500 строками, записать его в обоих других методах было бы непросто.

8 голосов
/ 26 июля 2010

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

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

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

4 голосов
/ 27 июля 2010

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

Не знаю. Откуда у тебя эта идея?

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

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

1 голос
/ 26 июля 2010

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

...