【问题标题】:Java: How to create new class object for Reader class from java.io when it has protected constructorJava:当具有受保护的构造函数时,如何从 java.io 为 Reader 类创建新的类对象
【发布时间】:2012-09-08 18:07:40
【问题描述】:

我想为 java 的 Reader 类创建一个新的类对象,但我无法访问构造函数,因为它受到保护。

Reader Class Description

Reader myReader = new Reader(); 

不会工作。

通常,我会创建一个新函数,该类来访问该构造函数,但由于该函数是 java 默认库的一部分,我该如何访问它?感谢您的帮助。

【问题讨论】:

  • 这是一个问题。当您调用 read() 时,您期望 Reader 类的(假设的)实例实际上会做什么?它会从哪里得到角色?

标签: java class constructor protected


【解决方案1】:

Reader 是一个抽象类。您不能实例化它,只能用于创建子类实例。

你是说

Reader myReader = new InputStreamReader(in, "UTF-8");

【讨论】:

  • 这个例子中的“in”是什么?
  • in 是 InputStreamReader 应该读取的 InputStream。
  • 我有这个BufferedReader br=new BufferedReader(new InputStreamReader(in));,运行它时出现错误“找不到符号in”。
  • 这里 in 是未定义的,所以通过导入 import static java.lang.System.in 解决了这个问题。
【解决方案2】:

Reader是一个抽象类,所以你必须实例化它的一个实现,比如BufferedReader或者InputStreamReader

【讨论】:

    【解决方案3】:

    正如其他人所说,您可以创建Reader 的子类实例,例如BufferedReader

    如果您不想使用 Reader 的子类,您可以创建 Reader 的实例,如下所示

    Reader reader = new Reader() {
    
            @Override
            public int read(char[] cbuf, int off, int len) throws IOException {
                // TODO Auto-generated method stub
                return 0;
            }
    
            @Override
            public void close() throws IOException {
                // TODO Auto-generated method stub
    
            }};
    

    【讨论】:

    • +1 用于演示子类(这个是匿名的,尽管它可能是匿名的)可以调用受保护的构造函数。
    • @Thilo 感谢您的评论。是的,它实际上创建了一个匿名子类实例。当然,子类实例就是超类实例。
    【解决方案4】:

    如果您检查Reader Java Doc,您可以看到Reader 的具体子类,根据您的要求初步分析其中的任何一个。您不能像 abstract 那样即时化 Reader

    BufferedReader
    CharArrayReader
    FilterReader
    InputStreamReader
    PipedReader
    StringReader

    【讨论】:

      猜你喜欢
      • 2020-04-28
      • 2011-09-07
      • 2011-10-23
      • 1970-01-01
      • 2013-08-29
      • 2011-05-30
      • 2010-11-08
      • 2019-11-18
      • 2017-03-11
      相关资源
      最近更新 更多