У меня есть следующие 2 класса:Что означает назначение объекта Java?
class Animal {
public static void staticMethod(int i) {
System.out.println("Animal : static -- " + i);
}
public void instanceMethod(int i) {
System.out.println("Animal : instance -- " + i);
}
}
class Cat extends Animal {
public static void staticMethod(int i) {
System.out.println("Cat : static -- " + i);
}
public void instanceMethod(int i) {
System.out.println("Cat : instance -- " + i);
}
public static void main(String[] args) {
Cat myCat = new Cat();
myCat.staticMethod(1); // Cat : static -- 1
myCat.instanceMethod(2); // Cat : instance -- 2
System.out.println("");
Animal myAnimal = myCat;
Animal.staticMethod(3); // Animal : static -- 3
myAnimal.staticMethod(4); // Animal : static -- 4 [ ? ]
System.out.println("");
myAnimal.instanceMethod(5); // Cat : instance -- 5
}
}
И когда я бегу Cat, я получил следующие результаты:
Cat : static -- 1
Cat : instance -- 2
Animal : static -- 3
Animal : static -- 4
Cat : instance -- 5
Я могу понять, 1,2,3 и 5, но почему # 4 не является: «Кошка: статическая - 4»? Мое понимание было бы так:
myAnimal = myCat означает «myAnimal» теперь точно так же, как «myCat», так что в любом месте «myAnimal» apears, вы можете заменить его на «myCat» и получить тот же результат, потому что все внутри myAnimal такое же, как и все внутри myCat, поэтому «myAnimal.staticMethod (4)» должен быть таким же, как «myCat.staticMethod (4)», а вывод должен быть: «Cat: static - 4», аналогичный на «myCat.staticMethod (1)» выше.
Но это, похоже, не так, почему?
Вот затмение, говорящее мне: «Статический метод staticMethod (int) из типа« Animal »должен быть доступен статическим образом», поскольку он является статическим методом, тогда он ограничен только родительскому объекту, когда вы вызываете его obj, который это «Животное». –
Статика связана во время компиляции. Это то, что мешает им переоценить – njzk2
Его дублирующий вопрос, заданный во много раз – madz