There is a code:
class Test1{
public static void main(String[] args){
System.out.println("Test1");
}
}
class Test2 extends Test1{
}
When I try to execute java Test1 I'm getting, of course, this:
Test1
But, when I try to execute java Test2 I'm still getting:
Test1
Why? In class Test2 doesn't exist main() method. And static methods don't inherited. If I'll add main() in Test2 (with string "Test2" instead of "Test1") I'll get:
Test2
I understand why I'm getting Test2 in this example. But don't understand why I'm getting Test1 if main() doesn't exist in class Test2.
And static methods don't inherited.
Static methods are inherited. Take a look at jls-8.4.8 Inheritance, Overriding, and Hiding
A class C inherits from its direct superclass and direct superinterfaces all
abstractandnon-abstractmethods of the superclass and superinterfaces that arepublic,protected, or declared withdefaultaccess in the same package as C, and are neither overridden (§8.4.8.1) nor hidden (§8.4.8.2) by a declaration in the class.
There is no information about not inheriting static methods, which is why you can run main declared in Test1 via Test2 class (it was inherited).
Also from jls-8.4.8.2 Hiding (by Class Methods)
If a class declares a
staticmethodm, then the declarationmis said to hide any methodm', where the signature ofmis a subsignature (§8.4.2) of the signature ofm', in the superclasses and superinterfaces of the class that would otherwise be accessible to code in the class.
So when you created new main method in Test2 class you hidden (not overridden) Test1.main method which is why you saw as output
Test2
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With