Java:当具有受保护的构造函数时,如何从 java.io 为 Reader 类创建新的类对象

Posted

技术标签:

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

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

Reader Class Description

Reader myReader = new Reader(); 

不会工作。

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

【问题讨论】:

这是一个问题。当您调用 read() 时,您期望 Reader 类的(假设的)实例实际上会做什么?它会从哪里得到角色? 【参考方案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

BufferedReaderCharArrayReaderFilterReaderInputStreamReaderPipedReaderStringReader

【讨论】:

以上是关于Java:当具有受保护的构造函数时,如何从 java.io 为 Reader 类创建新的类对象的主要内容,如果未能解决你的问题,请参考以下文章

为啥Java抽象类中需要受保护的构造函数

特征可以具有具有私有和受保护可见性的属性和方法吗?特质可以有构造函数、析构函数和类常量吗?

将 make_shared 与受保护的构造函数 + 抽象接口一起使用

无法从派生类构造函数参数访问受保护的基类成员[重复]

Scala:定义案例类构造函数时“覆盖受保护的val”导致错误

Kotlin:为什么构造函数参数默认具有“内部”可见性?