Почему в абстрактном классе 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
}

}
573   4  

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

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

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

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

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

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

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

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

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

Comments

    Ничего не найдено.