-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. 运行程序 如果它是静态的,则使一个主要方法通过该名称调用它。
  5. 如果您的方法不是静态的,请创建类的对象并由该类的对象调用。

  6. 它将解决您的错误并运行您的程序...

注意:尝试 放置finally 块以释放对象等资源......它将提高程序的性能。ByteArrayOutputStreamObjectStream

于 2013-08-09T08:24:12.013 回答
0

您应该将您的方法放在一个类中,最好调用,mytest因为它是文件的名称,声明如下

public class mytest {
    //Your method here
}

另请注意,Java 中的命名约定是以大写字母开头的类名,因此应该是MyTest,并且您的文件应该重命名以反映这一点。

于 2013-08-09T08:12:26.803 回答
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

您不能在类之外编写方法。将您的方法#copy放在类中。像这样:

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

public class mytest 
{
    public static void main(String[] args) throws IOException 
    {
        // Now you can use your method here
    }

    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;
    }
}
于 2013-08-09T08:14:33.927 回答
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 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

       }
   }
}

作为旁注,您应该将类​​名(和文件名)重命名为MyTestMyTest.java- 以匹配 java 编码约定。

于 2013-08-09T08:12:26.170 回答
0

这里在哪里class?这些method应该包含一个类。

你的 java 类应该是这样的

 package name;

 imports;

 public class MyClass{

   public void myMethod(){

   }

 }
于 2013-08-09T08:19:31.080 回答