继承类之间的静态方法-Java

继承类之间的静态方法-Java,java,inheritance,static,Java,Inheritance,Static,有关以下代码: public class NewClass { public static class superclass { static void print() { System.out.println("print in superclass."); } } public static class subclass extends superclass { s

有关以下代码:

public class NewClass { 
    public static class superclass { 
        static void print() 
        { 
            System.out.println("print in superclass."); 
        } 
    } 
    public static class subclass extends superclass { 
        static void print() 
        { 
            System.out.println("print in subclass."); 
        } 
    } 

    public static void main(String[] args) 
    { 
        superclass A = new superclass(); 
        superclass B = new subclass(); 
        A.print(); 
        B.print(); 
    } 
}
这里
B.print()
prints-->“在超类中打印”,但我希望它打印“在子类中打印”。因为“B”是子类的对象

但是,如果我将
static void print()
更改为
void print()
,那么它将正确地打印“print in subclass.”


有人能帮助理解这一点吗?

静态方法不是继承树的一部分。它们的存在只与它们的类相关,而不是与它们的子类或对象相关。为了减少编译错误,Java允许您调用它们,就好像它们属于子类或对象,但它们不属于子类或对象

为了提高可读性,您应该遵循常见的Java命名约定:
类名以大写字母开头,变量和成员以小写字母开头的camelCase命名。

当您为超类初始化对象时,它将返回超类方法请参见下面的代码

public class NewClass { 
public static class superclass { 
    static void print() 
    { 
        System.out.println("print in superclass."); 
    } 
} 
public static class subclass extends superclass { 
    static void print() 
    { 
        System.out.println("print in subclass."); 
    } 
} 

public static void main(String[] args) 
{ 
    superclass A = new superclass(); 
    subclass B = new subclass(); 
    A.print(); 
    B.print(); 
} 

}

我们可以在子类中声明具有相同签名的静态方法,但它不被认为是重写的,因为不存在任何运行时多态性。

如果派生类定义的静态方法与基类中的静态方法具有相同的签名,则派生类中的方法将隐藏基类中的方法

/* Java program to show that if static method is redefined by 
   a derived class, then it is not overriding. */

// Superclass 
class Base { 

    // Static method in base class which will be hidden in subclass  
    public static void display() { 
        System.out.println("Static or class method from Base"); 
    } 

     // Non-static method which will be overridden in derived class  
     public void print()  { 
         System.out.println("Non-static or Instance method from Base"); 
    } 
} 

// Subclass 
class Derived extends Base { 

    // This method hides display() in Base  
    public static void display() { 
         System.out.println("Static or class method from Derived"); 
    } 

    // This method overrides print() in Base  
    public void print() { 
         System.out.println("Non-static or Instance method from Derived"); 
   } 
} 

// Driver class 
public class Test { 
    public static void main(String args[ ])  { 
       Base obj1 = new Derived(); 

       // As per overriding rules this should call to class Derive's static  
       // overridden method. Since static method can not be overridden, it  
       // calls Base's display()  
       obj1.display();   

       // Here overriding works and Derive's print() is called  
       obj1.print();      
    } 
}   
输出:

来自基的静态或类方法
来自的非静态或实例方法 衍生

下面是Java中方法重写和静态方法的一些要点

1) 对于类(或静态)方法,根据引用类型调用方法,而不是根据被引用的对象调用方法,这意味着方法调用是在编译时决定的

2) 例如(或非静态)方法,方法是根据被引用对象的类型调用的,而不是根据引用的类型调用的,这意味着方法调用是在运行时决定的

3) 实例方法不能重写静态方法,静态方法不能隐藏实例方法。例如,以下程序有两个编译器错误

4) 在子类(或派生类)中,我们可以重载从超类继承的方法。这种重载方法既不隐藏也不重写超类方法-它们是新方法,是子类特有的


静态方法调用在编译时由其静态声明的类型决定:容器(变量)类型

非静态方法在运行时由其实际类型决定:使用“new”创建的对象的类


能够在运行时根据实际类型(而不是容器类型)动态选择目标方法方法重写只存在于实例方法中。静态方法不能被重写。动态绑定不适用于静态方法。静态方法总是属于其定义的类,因此您不能调用继承的方法。@mkemmerz,但
超类B=new subclass();
将创建子类的对象,对吗?@GarimaAgarwal确实如此!但您没有调用实例方法。这很混乱,因为您违反了java命名约定。B.print()没有调用您声明的对象B,而是调用了B的静态方法。