web-dev-qa-db-ja.com

抽象クラスのインスタンスを作成できないのに、Javaの抽象クラスにプライベートアクセス修飾子があるのはなぜですか?

privateクラスでメソッドをabstractとして宣言するのは良いコーディング方法ではないことを私は知っています。 abstractクラスのインスタンスを作成することはできませんが、privateアクセス修飾子がabstractクラス内で使用できるのはなぜですか、またabstractクラス内でのスコープは何ですか。 $ var] _クラス? 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 
 }

}
19
Srinivas M.V.

抽象クラスは(インターフェースではなく)機能を含むことができるため、プライベート変数またはメソッドを持つことができます。

あなたの例では、あなたは次のようなことをするかもしれません

 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のコンテキスト(そこでのみ使用されることを確認する必要があります)。

または、他のいくつかのパブリックメソッドで異なるパラメーターを使用して呼び出されるプライベートメソッドがある場合もあります。このようにして、各パブリックメソッドで同じコードを2回以上記述することを回避し、共通コードをプライベートメソッドにグループ化することで、子がそのコードにアクセスしないようにします(以前はパブリックメソッドの一部を呼び出すことができなかったように) )。このようなもの:

 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)両方で。ただし、これらは非常に単純な例ですが、chargeBatteryが500行のメソッドである場合、他の両方のメソッドで記述するのは面倒です。

38

非抽象クラスと同じですが、違いはありません。

つまり、抽象クラスの何もプライベートメソッドを呼び出さない場合は、呼び出されないので、それを削除することもできます(いくつかの邪悪なリフレクション作業を除く)。

通常、プライベートメソッドは、クラス内の他のメソッドが作業を行うために使用する非常に特殊なタスクを持つ内部ユーティリティメソッドとしてのみ使用されます。

8
Joachim Sauer

抽象クラスでメソッドをプライベートとして宣言するのは良いコーディング方法ではないことを私は知っています。

私はしません。そのアイデアはどこで得ましたか?

抽象クラス内でのスコープは何ですか?

抽象クラス。

4
user207421

このメソッドには、抽象クラス内からのみアクセスできます。たとえば、プライベートヘルパーメソッドを利用するpublic finalメソッドを持つ抽象クラスを持つことができます。

1