公式の対策
Java言語によって提供されるキーワード「最終」を使用して、このタスクを実行できます。次のソースコードの例をご覧ください。
コードコピーは次のとおりです。
// finaldemo.java
パブリックファイナルクラスfinaldemo {
}
以下の別のクラスを作成しましょう。これにより、上記のクラスを継承します。 Java言語が提供する「拡張」キーワードは、クラスが既存のクラスから継承できるようにします。
コードコピーは次のとおりです。
// finaldemo2.java
Public Class finaldemo2はfinaldemoを拡張します{
}
ファーストクラスをコンパイルした後、2番目のクラスをコンパイルすると、JDKコンパイラがエラーを報告すると、次のエラーメッセージが表示されます。
finaldemo2.java:1:final finaldemoから継承することはできません
Public Class finaldemo2はfinaldemo {}を拡張します
^
1エラー
これで、公式の方法を通じて、ファーストクラスが別のクラスに継承されることを妨げています。
非公式の測定
ただし、クラスが他のクラスに継承されるのを防ぐ方法は一意ではありません。次のコードを考慮して、コンストラクターがプライベートであることを宣言し、クラスオブジェクトを返す静的方法も宣言します。
コードコピーは次のとおりです。
パブリッククラスprivatetest {
private privatetest(){
system.out.println( "private default constructor");
}
public static privatetest getInstance(){
new privatetest()を返します。
}
}
上記で変更されたコードは「Singleton Pattern」と呼ばれ、GetInstanceメソッドは常にこのクラスの1つのインスタンスのみを返します。 しかし、なぜこのコードがクラスの継承を妨げるのでしょうか?次のコードを検討してください。宣言されたクラスは上記のクラスを継承する必要があります。
public class privatetest2はprivatetestを拡張します{
}
ファーストクラスをコンパイルした後、2番目のクラスをコンパイルすると、JDKコンパイラがエラーを報告すると、次のエラーメッセージが表示されます。
privatetest2.java:1:privatetest()はprivatetestでプライベートアクセスを持っています
public class privatetest2はprivatetestを拡張します{
^
1エラー
2番目のクラスは、最初のクラスを継承することはできません。 しかし、エラーはどういう意味ですか? Java言語では、クラスで少なくとも1つのコンポーネントメソッドを提供する必要があります。 アーティファクトメソッドを提供しない場合、JDKは宣言したクラスにデフォルトのアーティファクトメソッドを挿入します。 つまり、デフォルトは、パラメーター、空のコンポーネント本体、およびパブリックアクセス許可のないコンポーネントメソッドです。 ただし、コンポーネントメソッドを自分で定義する場合、JDKコンパイラはそのようなデフォルトコンポーネントメソッドを挿入しません。 Privatetestクラスでデフォルトのコンポーネントメソッドを宣言しましたが、JDKコンパイラ構文チェックのルールに沿ったプライベート許可にデフォルトのパブリックアクセス許可を変更しました。
それでは、2番目の部門を見てみましょう。 Java言語では、コンポーネントメソッドの最初の行でスーパークラスのコンポーネントメソッドを呼び出す必要があります。 これは、継承機能を開始するために必要です。 Javaでは、スーパー()メソッドを呼び出してこのタスクを完了します。これは、スーパークラスのコンポーネントメソッドにマッピングされます。 スーパークラスのデフォルトのコンストラクターを提供しない場合、JDKコンパイラはデフォルトのスーパークラスコンポーネントメソッドを挿入して呼び出します。
私たちは、コンストラクターをファーストクラスのプライベート許可として宣言しました。これで、このクラスを他のクラスから継承すると、コンパイラはデフォルトのスーパークラスコンポーネントメソッドを呼び出そうとします。スーパークラススコープ内のコンポーネントメソッドはプライベート許可として宣言されるため、コンパイラはスーパークラスコンポーネントメソッドを呼び出すことができないというエラーを報告します。したがって、非公式の方法を通じて1つのクラスが他のクラスに継承されるのを防ぎます。
Usman Saleem
モハマドアリジンナ大学
電子メール:[email protected]