Экземпляр абстрактного класса InputStream - PullRequest
1 голос
/ 06 февраля 2012

Класс InputStream определен как-

 public abstract class InputStream extends Object 

Тогда как класс System может содержать объект "in" класса InputStream?

Ответы [ 3 ]

2 голосов
/ 06 февраля 2012

Это потому, что in не объект, это ссылка.

Это ссылка на InputStream ИЛИ подкласс InputStream. В качестве абстрактного он может быть только подклассом.

2 голосов
/ 06 февраля 2012

Поле in, определенное классом System, не обязательно должно ссылаться на конкретную реализацию InputStream - как вы уже работали, оно не может - просто нужно ссылаться на что-то, что расширяет InputStream.

По крайней мере, в Linux in ссылается на BufferedInputStream, который сам оборачивает FileInputStream. Другие реализации могут различаться, и в этом суть: использование абстрактного класса, такого как InputStream, позволяет варьировать реализующий класс и потенциально меняться от одной версии Java к другой, сохраняя при этом вызывающий код довольным.

1 голос
/ 06 февраля 2012

InputStream является абстрактным, но конкретный класс (на который фактически ссылается System.in) может быть любым подклассом InputStream, включая анонимный класс .

Некоторые подклассы, перечисленные в javadoc для InputStream, включают в себя:

  • AudioInputStream
  • ByteArrayInputStream
  • FileInputStream
  • FilterInputStream
  • InputStream (CORBA)
  • ObjectInputStream
  • PipedInputStream
  • SequenceInputStream
  • StringBufferInputStream

Выполнение этого кода, чтобы узнать, какой из подклассов System.in актуален:

System.out.println(System.in.getClass());

Даёт ответ:

class java.io.BufferedInputStream
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...