Кроме того, наследование Java является фундаментальной особенностью языка, у меня есть некоторые вопросы.
Вот источник для моего тестирования, например:Наследование Java (переопределение и перегрузка метода)
class MyClass{
public void say(String t){
System.out.println("Hello MyClass "+t);
}
public void print(MyClass t){
System.out.println("MyClass is printed");
}
public void anotherPrint(int i){
System.out.println("MyClass is printed again");
}
}
class MyClass2 extends MyClass{
public void say(String t){
System.out.println("Hello MyClass2 "+t);
}
public void print(MyClass2 t){
System.out.println("MyClass2 is printed");
}
public void anotherPrint(double i){
System.out.println("MyClass2 is printed again");
}
}
public class HelloWorld{
public static void main(String []args){
MyClass klass = new MyClass2();
klass.say("h"); //Question 1 (Prints: "Hello MyClass2 h")
klass.print(new MyClass2()); //Question 2 (Prints: "MyClass is printed")
klass.print(new MyClass()); //Question 3 (Prints: "MyClass is printed")
klass.anotherPrint(1); //Question 4 (Prints: "MyClass is printed again")
klass.anotherPrint(1.0); //Question 5 (Throws Exception!)
}
}
У меня есть следующие вопросы:
1. Объект по Klass является экземпляр MyClass. Почему он выполняет метод из класса MyClass2?
2,3. В вопросе 1 класс класс вызывает метод класса Class2. Здесь я использовал параметр, который подходит для каждого из переопределенных и перегруженных (одновременно) методов. Почему объект klass всегда вызывает метод из класса MyClass?
4. Это нормально. Никакого вопроса.
5. Право выбросить исключение. Объект klass не имеет этого метода с двойным параметром. Но почему он не называется методом класса MyClass2, как это случилось в вопросе 1?
Наконец, я считаю, что я понял, когда переопределяется метод вызывался или нет. Но я считаю, что метод с параметром «MyClass2» полностью заполняет требования, и этот метод следует вызывать вместо другого. Не могли бы вы уточнить это объяснение? – LiTTle
@LiTTle Это потому, что переменная klass объявлена как MyClass, поэтому доступны только доступные методы, которые я разместил во втором блоке кода. Нет способа получения экземпляра MyClass2. Поскольку MyClass2 является классом, который расширяет MyClass, печать (MyClass t) может быть вызвана любым экземпляром MyClass или их подклассов, но вызовет print (MyClass t). Посмотрите, что Myclass2 имеет два метода печати (один берет MyClass, другой принимает MyClass2). Проверьте вопрос, заданный в вопросе 5. Пытаться вызвать anotherPrint с двойным не работает, другая команда MyClass принимает int, а не double. – Evans