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
}
}
抽象クラスは(インターフェースではなく)機能を含むことができるため、プライベート変数またはメソッドを持つことができます。
あなたの例では、あなたは次のようなことをするかもしれません
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行のメソッドである場合、他の両方のメソッドで記述するのは面倒です。
非抽象クラスと同じですが、違いはありません。
つまり、抽象クラスの何もプライベートメソッドを呼び出さない場合は、呼び出されないので、それを削除することもできます(いくつかの邪悪なリフレクション作業を除く)。
通常、プライベートメソッドは、クラス内の他のメソッドが作業を行うために使用する非常に特殊なタスクを持つ内部ユーティリティメソッドとしてのみ使用されます。
抽象クラスでメソッドをプライベートとして宣言するのは良いコーディング方法ではないことを私は知っています。
私はしません。そのアイデアはどこで得ましたか?
抽象クラス内でのスコープは何ですか?
抽象クラス。
このメソッドには、抽象クラス内からのみアクセスできます。たとえば、プライベートヘルパーメソッドを利用するpublic final
メソッドを持つ抽象クラスを持つことができます。