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

Javaでのclone()メソッドの重要性?


clone() メソッドは、クローン可能を実装するクラスのオブジェクトのコピーを作成するために使用されます インターフェース。デフォルトでは、フィールドごとのコピーを実行します Objectクラスは、オブジェクトがこのメソッドを呼び出す特定のクラスのメンバーについて何も知らないためです。したがって、クラスにプリミティブデータ型のメンバーしかない場合は、オブジェクトの新しいコピーが作成され、新しいオブジェクトコピーへの参照が返されます。ただし、クラスに任意のクラスタイプのメンバーが含まれている場合は、それらのメンバーへのオブジェクト参照のみがコピーされるため、元のオブジェクトと複製されたオブジェクトの両方のメンバー参照は同じオブジェクトを参照します。

CloneNotSupportedExceptionが発生します clone()を呼び出そうとすると Cloneableを実装していないクラスのオブジェクトのメソッド インターフェース。このインターフェースはマーカーインターフェースです このインターフェースの実装は、単に Object.clone() メソッドは、実装クラスのオブジェクトで呼び出すことができます。

構文

protected Object clone() throws CloneNotSupportedException

clone()メソッドは2つの方法で実装できます

浅いコピー

これは、 Object.clone()によって提供されるデフォルトのクローン作成機能の結果です。 クラスに非プリミティブデータ型のメンバーもある場合はメソッド。浅いコピーの場合、複製されたオブジェクトは、元のオブジェクトが参照しているのと同じオブジェクトも参照します。これは、参照されているオブジェクトではなく、オブジェクト参照のみがコピーされるためです。

public class ShallowCopyTest {
   public static void main(String args[]) {
      A a1 = new A();
      A a2 = (A) a1.clone();
      a1.sb.append("Tutorialspoint!");
      System.out.println(a1);
      System.out.println(a2);
   }
}
class A implements Cloneable {
   public StringBuffer sb = new StringBuffer("Welcome to ");
      public String toString() {
         return sb.toString();
      }
   public Object clone() {
      try {
         return super.clone();
      } catch(CloneNotSupportedException e) {
      }
      return null;
   }
}

出力

Welcome to Tutorialspoint!
Welcome to Tutorialspoint!


ディープコピー

clone()をオーバーライドする必要があります 非プリミティブ型のメンバーを持つクラスがディープコピーを実現するためのメソッド これは、メンバーオブジェクトも複製する必要があるためです。これは、デフォルトの複製メカニズムでは実行されません。

public class DeepCopyTest {
   public static void main(String args[]) {
      A a1 = new A();
      A a2 = (A) a1.clone();
      a1.sb.append(" TutorialsPoint!");
      System.out.println(a1);
      System.out.println(a2);
   }
}
class A implements Cloneable {
   public StringBuffer sb = new StringBuffer("Welcome to ");
   public String toString() {
      return sb.toString();
   }
   public Object clone() {
      try {
         A a = (A) super.clone();
         a.sb = new StringBuffer(sb.toString());
         return a;
      }
      catch(CloneNotSupportedException e) {
      }
      return null;
   }
}

出力

Welcome to TutorialsPoint!
Welcome to

  1. JavaプログラミングにおけるスレッドクラスのisAlive()メソッド

    isAlive関数 −スレッドが生きているかどうかをチェックするために使用されます。アライブとは、開始されたがまだ終了されていないスレッドを指します。 runメソッドが呼び出されると、スレッドは特定の期間動作し、その後実行を停止します。 構文 final Boolean isAlive() 上記は、関数が呼び出されたスレッドが実行中であり、まだ終了していない場合にtrueを返します。それ以外の場合はfalseを返します。 例を見てみましょう- 例 public class Demo extends Thread{    public void run(){  

  2. Java 9でのdestroyForcibly()メソッドの重要性?

    destroyForcibly() メソッドを使用してプロセスを強制終了できます 。プロセスが終了またはフリーズした場合に必要になります。たとえば、 isAlive() destroyForcibly()の後にメソッドはtrueを返します と呼ばれます。 destroyForcibly() メソッドは、終了が正常に要求された場合はtrueを返し、それ以外の場合はfalseを返します。 構文 boolean destroyForcibly() 以下の例では、メモ帳を起動できます。 アプリケーションであり、 destroyForcibly()の後に終了します メソッドが呼び出されました。 例