Java, уточнение терминологии - PullRequest
1 голос
/ 03 октября 2009

В Java Object может иметь тип времени выполнения (то, чем он был создан) и тип приведения (тип, которым вы его называли).

Мне интересно, каково правильное имя для этих типов. Например

class A {

}

class B extends A {

}

A a = new B();

a был создан как B, однако он был объявлен как A. Как правильно обращаться к типу a, используя каждую перспективу?

Ответы [ 7 ]

8 голосов
/ 03 октября 2009

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

Так что в этом случае:

A a = new B();

a - переменная типа A. Его значение во время выполнения является ссылкой на объект типа B.

Спецификация языка Java использует "класс времени выполнения" (например, с целью переопределения, как в раздел 15.12.4.4 ) для типа объекта. В другом месте я думаю, что он просто использует «тип» для типа выражения, то есть тип времени компиляции.

5 голосов
/ 03 октября 2009

Спецификация языка Java говорит о объявленном типе переменной , javadoc getClass() о классе времени выполнения объекта .

Обратите внимание, что в Java нет такого понятия, как тип времени выполнения; List<String> и List<Integer> - это разные типы, но их экземпляры имеют один и тот же класс времени выполнения.

2 голосов
/ 03 октября 2009

В этом случае A - это тип ссылки , а B - это экземпляр тип

1 голос
/ 03 октября 2009

Тип переменной a равен A. Там нет никаких изменений, так как это ссылка. Это относится к объекту типа B. Пока вы ссылаетесь на этот B объект через ссылку A, вы можете обращаться с ним только как с типом A.

Позже вы можете привести его к более конкретному типу

B b = (B)a;

и использовать методы B для этого объекта.

1 голос
/ 03 октября 2009

Я бы сказал, что вы различаете тип переменной / ссылки и тип объекта. В случае

A a = new B();

переменная / ссылка будет иметь тип A но объект типа B.

0 голосов
/ 11 января 2018

Чтобы определить a - это объект какого класса вы можете использовать:

/*The java.lang.Object.getClass() method returns the runtime class of an object*/   
System.out.println("a is object of: "+a.getClass());
0 голосов
/ 03 октября 2009

Используемая вами терминология: Видимый тип и Фактический тип .

A a = new B();

Видимый тип - это A, потому что компилятор знает только, что объект относится к типу A. Таким образом, в настоящее время вы не можете ссылаться ни на один из конкретных методов B.

Фактический тип - это B. Вам разрешено разыгрывать объект (то есть изменять его видимый тип) для доступа к конкретным методам B.

...