-2
package example;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.Object;

public static Object copy(Object oldObj) {
    Object obj = null;
    try {
        // Write the object out to a byte array
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream out = new ObjectOutputStream(bos);
        out.writeObject(oldObj);
        out.flush();
        out.close();

        // Retrieve an input stream from the byte array and read
        // a copy of the object back in.
        ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
        ObjectInputStream in = new ObjectInputStream(bis);
        obj = in.readObject();
    } catch (IOException e) {
        e.printStackTrace();   
    } catch (ClassNotFoundException cnfe) {
        cnfe.printStackTrace();
    }
    return obj;
}

public class mytest {
    public static void main(String[] args) throws IOException {
        clone

    }
}

上記のコードでは、Java のディープ コピーを表示したいと考えています。しかし、myeclipse はいくつかのエラーを報告します。でも、何が悪いのかわからないですよね?誰かがそれらを指摘するのを手伝ってくれませんか?

ここに画像の説明を入力

あなたの提案に従ってコードを変更しました。

package example;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.Object;

class Utils {
    public static Object copy(Object oldObj) {
        Object obj = null;
        try {
            // Write the object out to a byte array
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ObjectOutputStream out = new ObjectOutputStream(bos);
            out.writeObject(oldObj);
            out.flush();
            out.close();

            // Retrieve an input stream from the byte array and read
            // a copy of the object back in.
            ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
            ObjectInputStream in = new ObjectInputStream(bis);
            obj = in.readObject();
        } catch (IOException e) {
            e.printStackTrace();   
        } catch (ClassNotFoundException cnfe) {
            cnfe.printStackTrace();
        }
        return obj;
    }
}

public class mytest {
    public static void main(String[] args) throws IOException {
        Object clonedObject = Utils.copy(new Object());
        clonedObject.notifyAll();
    }
}

さらに: ありがとうございました! 上記のようにコードを修正したところ、改善されましたが、まだ正常に実行できません。新しいエラー メッセージは次のとおりです。 ここに画像の説明を入力

新しい提案はありますか?

4

10 に答える 10

2

Java ではフローティング メソッドを使用できません。すべてがクラスのメンバーでなければなりません。この場合、静的メソッドのみが呼び出されるダミー クラスを使用するのUtilsが一般的です。

例えば

public class Utils {

    // Static methods go here
    public static Object copy(Object oldObj) {
        // etc
    }

}

次に、次のように呼び出すことができます。

public class mytest {
    public static void main(String[] args) throws IOException {
        Object clonedObject = Utils.copy(new Object());
        // etc
    }
}
于 2013-08-09T08:12:26.213 に答える
1

エラーを解決するための次の手順は次のとおりです。

  1. プロジェクト内にパッケージを作成する(特定の名前)
  2. 作成したパッケージ内に名前を付けMyTestます。
  3. 上記で作成したクラスにメソッドを書き込むかコピーします。
  4. プログラムを実行するには メイン メソッドを 1 つ作成し、それが静的な場合はその名前で呼び出します。
  5. メソッドが静的でない場合は、クラスのオブジェクトを作成し、クラスのそのオブジェクトによって呼び出します。

  6. エラーを解決し、プログラムも実行します...

注:ブロックを配置して、finally オブジェクトなどのリソースを解放して みてください....これにより、プログラムのパフォーマンスが向上します。ByteArrayOutputStreamObjectStream

于 2013-08-09T08:24:12.013 に答える
0

メソッドpublic static Object copy(Object oldObj)がクラス内にありません。そのため、エラーが発生しています。

于 2013-08-09T08:12:22.163 に答える
0

mytestこのファイルの「最上位スコープ」という名前のクラスを追加し、その中に他のすべてのメソッドをネストする必要があります。

class mytest { 
   public static Object copy(Object oldObj) {
       Object obj = null;
       try {
           // Write the object out to a byte array
           ByteArrayOutputStream bos = new ByteArrayOutputStream();
           ObjectOutputStream out = new ObjectOutputStream(bos);
           out.writeObject(oldObj);
           out.flush();
           out.close();

           // Retrieve an input stream from the byte array and read
           // a copy of the object back in.
           ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
           ObjectInputStream in = new ObjectInputStream(bis);
           obj = in.readObject();
       } catch (IOException e) {
           e.printStackTrace();   
       } catch (ClassNotFoundException cnfe) {
           cnfe.printStackTrace();
       }
       return obj;
   }

   public class mytest {
       public static void main(String[] args) throws IOException {
           clone

       }
   }
}

補足として、クラス名 (およびファイル名) の名前をMyTestand MyTest.java- に変更して、Java コーディング規則に一致させる必要があります。

于 2013-08-09T08:12:26.170 に答える
0

メソッドをクラスに配置する必要があります。mytestこれは、次のように宣言されたファイルの名前であるため、できれば呼び出されます

public class mytest {
    //Your method here
}

また、Java の命名規則では、大文字で始まるクラス名を使用することになっているためMyTest、 となります。それを反映するようにファイルの名前を変更する必要があります。

于 2013-08-09T08:12:26.803 に答える
0

メソッドをクラスに入れる必要があります。

public class SomeClass{
public static Object copy(Object oldObj) {
    Object obj = null;
    try {
        // Write the object out to a byte array
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream out = new ObjectOutputStream(bos);
        out.writeObject(oldObj);
        out.flush();
        out.close();

        // Retrieve an input stream from the byte array and read
        // a copy of the object back in.
        ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
        ObjectInputStream in = new ObjectInputStream(bis);
        obj = in.readObject();
    } catch (IOException e) {
        e.printStackTrace();   
    } catch (ClassNotFoundException cnfe) {
        cnfe.printStackTrace();
    }
    return obj;



}

そして、次のように使用できます。

public class mytest {
    public static void main(String[] args) throws IOException {

      Object object = Someclass.copy(someObject);

    }
}
于 2013-08-09T08:11:26.590 に答える
0

Java では、クラスの外部でメソッド (静的なものであっても) を宣言することはできません。すべて (インポートを除く) をクラス内に配置する必要があります。

次のようなものが必要です。

public class YourClass {
    public static Object copy(Object oldObj) {
    ...
    }
}
于 2013-08-09T08:11:26.973 に答える
0

試す

public class MyTest {

public static Object copy(Object oldObj) {
    Object obj = null;
    try {
        // Write the object out to a byte array
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream out = new ObjectOutputStream(bos);
        out.writeObject(oldObj);
        out.flush();
        out.close();

        // Retrieve an input stream from the byte array and read
        // a copy of the object back in.
        ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
        ObjectInputStream in = new ObjectInputStream(bis);
        obj = in.readObject();
    } catch (IOException e) {
        e.printStackTrace();   
    } catch (ClassNotFoundException cnfe) {
        cnfe.printStackTrace();
    }
    return obj;
}
    public static void main(String[] args) throws IOException {
        clone

    }
}

クラスに属さないメソッドはありません (JavaScript 関数など)。静的とは、メソッドがクラスに属しており、非静的メソッドのようにクラスのインスタンスに属していないことを意味します

于 2013-08-09T08:13:11.803 に答える
0

ここはどこclassですか?これらmethodにはクラスが含まれている必要があります。

Java クラスは次のようになります。

 package name;

 imports;

 public class MyClass{

   public void myMethod(){

   }

 }
于 2013-08-09T08:19:31.080 に答える