2010-07-26 1 views
17

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

проверить этот код, где 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 
} 

} 

ответ

35

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

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

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

+0

вы меня убедили! – JerryGoyal

8

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

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

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

1

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

4

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

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

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

Аннотация класса.

Смежные вопросы