Код: Выделить всё
class A {
{
m1();
}
A(){
System.out.println("A constructor");
}
void m1(){
System.out.println("A m1");
}
}
public class Main extends A {
public static void main(String[] args) throws Exception {
Main m = new Main();
}
void m1(){
System.out.println("Main m1");
}
}
Main m1
Конструктор
Я знаю, это потому, что:
Во-первых, статические блоки и переменные были идентифицированы сверху вниз, от родителя к дочернему элементу, в данном случае был просто main() это было статическим.
Во-вторых, выполняются статические блоки и назначения переменных, поэтому начинается выполнение main() и предпринимается попытка создать новый объект Main().
Итак, в-третьих, блоки экземпляров и переменные родительского класса будут идентифицировано. Тогда они будут выполняться сверху-снизу. (После этого запустится конструктор родительского класса, затем будут идентифицированы блоки экземпляров и переменные дочернего класса, после чего они будут выполнены сверху вниз и, наконец, выполнится конструктор дочернего класса).
Итак, блок экземпляра внутри A вызывает `m1()`. Затем выполняется конструктор A. Наконец, поток управления возвращается в `main()`, и программа завершается.
Теперь вызов `m1()` из A вызывает `m1()` из `Main` . Однако, если бы я сделал оба метода `m1()` статическими, а все остальное осталось бы прежним, вызов `m1()` из блока экземпляра A затем вызвал бы `m1()` A.
У меня два вопроса (Почему? Чисто из академических соображений я все еще изучаю Java):
- Когда оба метода m1() нестатический, можно ли вызвать m1() A из блока экземпляра A? Я пытался выполнить this.m1(), но это все равно вызывало функцию m1() Main. (Почему?)
- Когда оба m1( ) методы являются статическими, можно ли вызвать Main m1() из блока экземпляра A? (Думаю, нет, но я не уверен).
Я знаю, что в первом случае происходит переопределение, а во втором случае — сокрытие метода. . Но я до сих пор не знаю, как отвечать на свои вопросы, основываясь на этих знаниях.
Подробнее здесь: https://stackoverflow.com/questions/626 ... hod-hiding