Я понял, что статические переменные и статические методы относятся к классу, а не к объектам класса. Поэтому 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
имеет значение?