class A{
int foo=10;
}
class B extends A{
int foo=10;
}
class Test{
public static void main(String [] args){
A a=new B();
System.out.println(a.foo);
//System.out.println(a.getClass());
}
}
В этом случае выводится 10
. Если я не ошибаюсь, это связано с тем, что переменная a
имеет тип A
, а назначение переменной - статическое связывание, а статическое связывание выполняется во время компиляции, просматривая тип переменной. Так как здесь a
имеет тип A
, то вызывается int foo
. Однако, когда я называюОбъект refrence and type casting in java
System.out.println(a.getClass());
, то это дает класс B
, то есть a
имеет тип B
. Я смущен этим. Пожалуйста, объясните мне a
, какой тип и как напечатан int foo
. Но, посмотрев на этот код
class A{}
class B extends A{}
class Test{
public static void main(String [] args){
B b=new B();
A a=b;
B b1=(B)a; // compiles and run fine (a is of type B)
}
}
Как это возможно? Что тут происходит? Первый b
имеет тип B
, затем во второй строке a
становится типа A
, так как A a=..
написано, но a.getClass()
указывает, что он имеет тип B
. Как? Если a
имеет тип B
, то почему он вызывает int foo
в первом примере? Пожалуйста, объясните оба примера.
Кроме того, действительно ли ссылки на изменение кастинга или какие-либо другие вещи?
объект в куче остается тем же самым. То, как вы обращаетесь к нему, меняется. –
Вы затеняете переменную, для переменной нет переопределения. btw нет другого возможного выхода, тогда 10;). В этом случае вы просто получаете доступ к переменной 'foo' из' A', потому что именно так определяется ваша переменная. Поскольку для переменных нет переопределения, тип объявления важен, если вы напрямую обращаетесь к переменным от типа. – SomeJavaGuy
* В этом случае 10 выводится *: что еще он может напечатать? Вы вводите в заблуждение объявленный тип переменной и время выполнения, конкретный тип объекта, на который ссылается эта переменная. Объект никогда не меняет тип. Вызов getClass() возвращает его конкретный тип. Но две переменные разных типов могут относиться к одному и тому же объекту, потому что B ** является ** A. –