继承类之间的静态方法-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的静态方法。