【问题标题】:Alternative way to instantiate a class not implements the parent interfaces实例化类的替代方法不实现父接口
【发布时间】:2014-03-02 18:14:41
【问题描述】:

在某个我不记得的地方,我读到了另一种方法来实例化对象:

通常,我们以这种方式实例化(和分配):

User userObj = new User();
userObj.setId(1);
userObj.setName("Foo");

另一种方法可能是:

User userObj = new User()
{{
    setId(1);
    setName("Foo");
}}

我正在使用这种替代方法,并且它有效。

1) 有人知道它是什么吗?提到它的 Java 文档链接在哪里?

我停止使用它是因为我在使用 ClassName 实现的接口时遇到问题,但替代方法没有实现。哦

public class User implements Serializable
{
    private int id;
    private String name;
    //public Getters and Setters
}

2) 当我尝试序列化并使用它时(从一个活动传递到另一个活动,使用: putExtra(String, Serializable) 它会抛出 NotSerializableException。为什么?

编辑 1:匿名类也实现了父类“实现”,例如来自 ClassName 的 Serializable?

【问题讨论】:

  • 实例初始化块结合匿名类。
  • 我怀疑您的第一个问题的答案与您的第二个问题完全无关,也与您收到的错误无关。

标签: java android inheritance assign


【解决方案1】:

您正在使用带有初始化块的匿名类。所以它只是等价于:

SubClass extends ClassName{
   {
      classObj.setParam1(1);
      classObj.setParam2(1);
   }

}

new SubClass();

这种构造没有问题 - 但请注意,您创建的不是 ClassName 类的对象,而是 SubClass 类的对象。

正如我所说,您正在使用匿名类(没有名称的类)。这很糟糕 - 因为虽然序列化/反序列化 JVM 应该确切地知道什么是序列化数据的类,所以基本上 - 如果你想序列化它们,不要使用匿名类。

【讨论】:

  • 虽然最后有一些总结,但这是一个很好的答案。谢谢!
【解决方案2】:

广告 1.:这种结构称为“匿名类”。

广告 2.:我敢打赌,您的课程包含一个不是 Serializable 的字段。

【讨论】:

  • 没有。我只有原始类型属性,例如 float 和 int。
  • 请将您的课程内容添加到帖子中。
猜你喜欢
  • 2017-08-21
  • 2014-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-20
  • 2020-02-04
  • 2014-12-10
相关资源
最近更新 更多