Что означает это утверждение и ...? - PullRequest
2 голосов
/ 28 июля 2011

Недавно я сталкивался с этим утверждением:

InputStream in = new FileInputStream(Filename);

Что означает это утверждение?

Что означает in?

Является ли in объектом FileInputStream?

при написании оператора: InputStream is = new InputStream(); выдает ошибку b'coz InputStream - абстрактный класс, но тогда зачем нам конструктор для этого класса? ---> InputStream ()

Ответы [ 8 ]

3 голосов
/ 28 июля 2011

Это утверждение усиливает эффект наследования. Вы создаете новый экземпляр объекта FileInputStream и присваиваете его переменной in.

Что касается пользователей этой переменной, они видят только объект типа InputStream - это может быть любой подкласс абстрактного класса InputStream. После этой строки вы можете вызывать любые методы, объявленные в классе InputStream для этого объекта. Даже если объект действительно FileInputStream, вы не можете видеть это, и, следовательно, не можете вызывать эти методы (без приведения).

Конструктор существует, так что подклассы могут вызывать его для создания экземпляров и настройки любых методов экземпляров, которые нужны всем входным потокам. Вы не можете вызвать это, но подклассы могут вызвать это.

1 голос
/ 28 июля 2011

Да in - это имя объекта типа InputStream (который является абстрактным классом). Может быть много классов, расширяющих этот абстрактный класс (включая FileInputStream), каждый из которых реализует требуемые компонентыInputStream.

Вы можете создать конкретный объект того типа класса, который вы используете, но с помощью абстрактной версии или интерфейса - вы уверены, что класс имеет определенный набор функций, ноВы можете легко переключать реальную реализацию без изменения кода.(Наследование в действии!)

Например, приведенная выше строка в будущем может вместо этого использовать:

InputStream in = new SocketInputStream();

Для получения дополнительной информации прочитайте фон InputStream .

0 голосов
/ 28 июля 2011

Вот существующее объяснение того, почему у абстрактных классов есть конструкторы, которые могут иметь отношение:

Почему у абстрактных классов в Java есть конструкторы?

Кроме этого дополненияЯ согласен с ответом Руду, in, это локальная переменная в нашей программе, которая ссылается на экземпляр класса FileInputStream.Тот факт, что в присваивании он связан только с локальной переменной типа InputStream, означает, что в этой области он обрабатывается как этот тип только компилятором.То есть, как уже упоминалось, вы можете вызывать только методы, которые существуют в интерфейсе / абстрактном классе. InputStream.

Так что во время выполнения это будет экземпляр типа FileInputStream из-за статической системы типов Java и реализации наследования.и назначения, это во время компиляции в области видимости, используемой только как InputStream.

0 голосов
/ 28 июля 2011

InputStream является абстрактным классом, поэтому его нельзя напрямую создать. Вы можете назначить только экземпляр его подкласса, который в этом случае FileInputStream.

Следующий очевидный вопрос: почему вы не можете назначить его FileInputStream? Ответом на этот вопрос будет понимание наследования, абстрактного класса и понятий слабой связи. Проще говоря, завтра, если вы хотите изменить свой код так, чтобы вместо чтения его из файла читать его, скажем, с URL-адреса ... Вы можете сделать это, не затрагивая остальную часть кода, просто изменив свой FileInputStream на URLInputStream Вы должны написать это), который также расширяет абстрактный класс InputStream ....

0 голосов
/ 28 июля 2011
  1. Идентификатор «in» относится к объекту InputStream.В этом случае действительно ссылается на объект FileInputStream, который был создан конструктором.Это возможно, потому что ...

  2. InputStream - абстрактный класс.В Java абстрактный класс может иметь определенные методы (и конструкторы), однако его нельзя создать до тех пор, пока он не будет расширен.Подклассы, расширяющие абстрактный класс, должны вызывать конструктор абстрактного класса.

FileInputStream расширяет InputStream.

0 голосов
/ 28 июля 2011

in - это имя переменной, выбранное здесь, и оно содержит объект, класс которого - FileInputStream. Причина, по которой абстрактный класс InputStream определяет конструктор, заключается в том, что он заставляет (не абстрактные) подклассы реализовывать его.

0 голосов
/ 28 июля 2011

Вы открываете файл для чтения.

in - это переменная, которую вы назначаете входному потоку.Это класса InputStream.

0 голосов
/ 28 июля 2011

in - это имя переменной, в то время как вы храните экземпляр InputStream.

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