Java
 Computer >> コンピューター >  >> プログラミング >> Java

なぜJavaクラスは抽象的かつ最終的ではないのですか?


抽象クラス

0個以上の抽象メソッドを含むクラスは、抽象クラスと呼ばれます。少なくとも1つの抽象メソッドが含まれている場合は、抽象として宣言する必要があります。

抽象クラスで具象メソッドを使用する場合は、クラスを継承し、抽象メソッド(存在する場合)に実装を提供してから、サブクラスオブジェクトを使用して必要なメソッドを呼び出す必要があります。

次のJavaの例では、抽象クラスMyClassに、名前が表示される具象メソッドが含まれています。

別のクラス(AbstractClassExample)から、クラスMyClassを継承し、サブクラスオブジェクトを使用してその具象メソッドdisplayを呼び出しています。

abstract class MyClass {
   public void display() {
      System.out.println("This is a method of abstract class");
   }
}
public class AbstractClassExample extends MyClass {
   public static void main(String args[]) {
      new AbstractClassExample().display();
   }
}

出力

This is a method of abstract class

最終クラス

最終クラスを拡張しようとすると拡張できないクラス最終を宣言すると、「最終スーパークラスから継承できません」というコンパイル時エラーが生成されます

次のJavaプログラムには、 SuperClassという名前の最終クラスがあります。 別のクラス(サブクラス)からそれを継承しようとしています。

final class SuperClass {
   public void display() {
      System.out.println("This is a method of the superclass");
   }
}

コンパイル時エラー

コンパイル時に、このプログラムは以下に示すようにコンパイルエラーを生成します-

SubClass.java:7: error: cannot inherit from final SuperClass
public class SubClass extends SuperClass{
                              ^
1 error

抽象と最終の両方

クラス抽象を宣言する場合、それを使用するには、それを拡張する必要があります。クラスfinalを宣言する場合、拡張することはできません。両方が互いに矛盾しているため、コンパイル時エラーを行うと、抽象とfinalの両方のクラスを宣言できません。生成されます。

public final abstract class Example {
   public void sample() {
   }
}

コンパイル時エラー

Example.java:1: error: illegal combination of modifiers: abstract and final

public final abstract class Example {
                      ^
1 error

  1. なぜStringクラスはJavaで不変またはfinalなのですか?

    文字列が不変であることは、オブジェクト自体を変更できないことを意味しますが、オブジェクトへの参照は変更できます。文字列は、他の人が文字列を拡張してその不変性を破壊できないように、最終的に作成されます。 セキュリティ パラメータは通常、ネットワーク接続、データベース接続URL、ユーザー名/パスワードなどで文字列として表されます。可変である場合、これらのパラメータは簡単に変更できます。 同期と同時実行 Stringを不変にすると、自動的にスレッドセーフになり、同期の問題が解決されます。 キャッシュ コンパイラがStringオブジェクトを最適化する場合、2つのオブジェクトが同じ値(a=testおよ

  2. Javaの最終クラス

    finalとして宣言されているクラスを使用する主な目的は、クラスがサブクラス化されないようにすることです。クラスがfinalとしてマークされている場合、どのクラスもfinalクラスから機能を継承できません。 public final class Test {    // body of class }