Я понял, что статические переменные и статические методы относятся к классу, а не к объектам класса. Поэтому Override статического метода не будет работать в Java, так как для переопределения нам нужен экземпляр класса, который будет создан. Но сегодня я что-то пробовал, что противоречило моим знаниям Java.
Пожалуйста, следуйте этому коду:
class Parent{
public static void doIt(){
System.out.println("In static method 'doit' of class Parent ");
}
}
class Child extends Parent{
public static void doIt(){
System.out.println("In static method 'doit' of class Child ");
}
}
public class StaticPractise{
public static void main(String[] args){
Parent.doIt();
Child.doIt();
}
}
Результат реализации выше:
D:\Rahul Shivsharan\MyPractise\JAVA>java StaticPractise
In static method 'doit' of class Parent
In static method 'doit' of class Child
Из этого вывода я могу понять, что, хотя класс Child расширяет класс Parent, методы doit являются индивидуальными для каждого класса, так как они static. Поэтому не допускается их переопределение.
Теперь, пожалуйста, следуйте приведенному ниже коду, где @Override добавляется к методу child doit:
class Parent{
public static void doIt(){
System.out.println("In static method 'doit' of class Parent ");
}
}
class Child extends Parent{
@Override // Adding this annotation here
public static void doIt(){
System.out.println("In static method 'doit' of class Child ");
}
}
public class StaticPractise{
public static void main(String[] args){
Parent.doIt();
Child.doIt();
}
}
Результат приведенного выше кода дает ошибку компиляции следующим образом:
D:\Rahul Shivsharan\MyPractise\JAVA>javac StaticPractise.java
StaticPractise.java:31: error: method does not override or implement a method from a supertype
@Override
^
1 error
Здесь ясно сказано, что аннотация Override не может применяться в методах static, поскольку они не становятся переопределенными.
Теперь, пожалуйста, следуйте приведенному ниже коду, где Child не имеет метода doit:
class Parent{
public static void doIt(){
System.out.println("In static method 'doit' of class Parent ");
}
}
class Child extends Parent{ /* no doIt method */ }
public class StaticPractise{
public static void main(String[] args){
Parent.doIt();
Child.doIt();
}
}
Вывод:
D:\Rahul Shivsharan\MyPractise\JAVA>java StaticPractise
In static method 'doit' of class Parent
In static method 'doit' of class Parent
Почему этот код компилируется и запускается? Я ожидал ошибку компиляции для метода doit для класса Child, и я ожидал, что "Метод не найден". Я не понимаю.
Также следуйте приведенному ниже коду. Здесь метод doit в Parent теперь final.
class Parent{
public static final void doIt(){ // now final
System.out.println("In static method 'doit' of class Parent ");
}
}
class Child extends Parent{
public static void doIt(){
System.out.println("In static method 'doit' of class Parent ");
}
}
public class StaticPractise{
public static void main(String[] args){
Parent.doIt();
Child.doIt();
}
}
Выход после запуска вышеуказанного кода выглядит следующим образом:
D:\Rahul Shivsharan\MyPractise\JAVA>javac StaticPractise.java
StaticPractise.java:30: error: doIt() in Child cannot override doIt() in Parent
public static void doIt(){
^
overridden method is static,final
1 error
D:\Rahul Shivsharan\MyPractise\JAVA>
Я ожидал, что вышеприведенный код должен работать нормально, поскольку методы doit являются статичными в каждом классе, поэтому даже ключевое слово final не должно компилировать ошибку, поскольку метод static.
Пожалуйста, объясните мне, как метод переопределяет работу в статических классах на Java.
- Можно ли переопределить статические методы? Если да, то как закончится аннотация
@Override? - Если статические методы не могут быть переопределены, тогда как мой третий блок кода работает нормально?
- Если статические методы не могут быть переопределены, то почему ключевое слово
finalимеет значение?