Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的继承与静态_Java_Oop - Fatal编程技术网

Java中的继承与静态

Java中的继承与静态,java,oop,Java,Oop,我不太明白为什么静态方法可以在Java中继承 继承类似于从基类继承,静态属于类而不是对象 那么,如果静态数据只属于类,为什么它会流到派生类? 它不应该只停留在定义它的类中吗 继承静态方法是一种很好的编程实践吗 如您所述,静态方法属于该类,并且由于继承描述了类型之间的IS-a关系,因此子类不应该继承其超类的所有成员吗 我个人认为这个实现很有意义 在java中,静态方法不会被继承(或覆盖正确的单词),但它们可以被隐藏 这里最大的不同在于它们不像对象方法那样受到多态性的影响 public class

我不太明白为什么静态方法可以在Java中继承

继承类似于从基类继承,静态属于类而不是对象

那么,如果静态数据只属于类,为什么它会流到派生类? 它不应该只停留在定义它的类中吗


继承静态方法是一种很好的编程实践吗

如您所述,静态方法属于该类,并且由于继承描述了类型之间的
IS-a
关系,因此子类不应该继承其超类的所有成员吗


我个人认为这个实现很有意义

在java中,静态方法不会被继承(或覆盖正确的单词),但它们可以被隐藏

这里最大的不同在于它们不像对象方法那样受到多态性的影响

public class C1 {

    static public void M1() {
        System.out.println("C1.M1().");
    }

    static public void main(String ... Args) {
        M1();
    }

}

public class C2 extends C1 {

    static public void M1() {
        System.out.println("C2.M1().");
    }

    static public void main(String ... Args) {
        M1();
        C1.main(Args);
    }

}
当运行
C2.main(null)
时,您将得到:

C2.M1().
C1.M1().
如你所见

在C1中调用
M1()
。main(…)是指C1中的M1和

在C2中调用
M1()
。main(…)指C2中的M1

M1的调用(不带任何前缀,请参见每个
main()
)的第一行)不受多态性的影响,因为C1中的M1不会被C2覆盖

但是来自C2的调用指的是C2的M1,因为C2的M1是C1中的M1

阅读更多

编辑:我刚刚重读了你的问题,看到了关于“良好编程实践”的部分

正如我所说的,静态方法不是继承的,而是隐藏的,所以它们和其他方法一样好

从代码的角度来看,它们是完全不同的方法

比如说

C1                has static method M1.
C2 extends C1 and has static method M1.
C3 extends C2.
从C1调用M1(不带前缀)时,调用C1.M1()。 从C2调用M1(不带前缀)时,调用C2.M1()衍生而隐藏 从C3调用M1(不带前缀)时,调用C3.M1()派生而不隐藏

要指定哪个方法,请使用类名称,如
C1.M1()
C2.M1()
C3.M1()
(这将被称为
C2.M1()

所以这个实现允许重新实现静态方法,但只能作为不同的方法,而不能作为重写(或替换)方法

因此,这通常与对它们进行不同的命名没有什么不同,比如:
C1_M()
C2_M()

所以你可能会问,为什么要费心拥有这个功能?我真的不知道。也许允许对方法进行更灵活的命名

但我使用的用法(可能是有意的,也可能不是有意的)是通过反射实现多态性

由于可以使用反射按名称获取和调用方法,因此允许它们具有相同的名称将在通过反射执行操作时启用多态性

例如(粗代码,可能无法运行):

仔细想想,我认为Java也使用了它(比如,
writeObject(…)
用于序列化),所以它可能是有意的

因此,总而言之,隐藏静态方法不是一个好的编程实践(Eclipse也建议不要这样做),但它在两种情况下是有用的,(1)精确地命名该方法,以及(2)使用反射对其进行变形

希望这有帮助

public class StaticTest extends StaticBase {

public static void main(String[] args) {
    // TODO Auto-generated method stub
    System.out.println("Start");
    StaticTest.printIt();
}
}

类静态基{

public static void printIt(){
    System.out.println("Inside bas Class");
}
}

这段代码不能证明静态是继承的吗

我不太明白为什么 方法可以在Java中继承吗

简而言之,静态不是在Java中继承的。相反,在类中声明的静态成员(受“访问”限制)在派生类的命名空间中直接可见,除非它们被派生类中的声明“隐藏”

因此,如果Static属于该类 只是为什么它会流到 派生类?它不应该就这样呆着吗 使用定义它的类 ?

涓流不是一个专业术语。但事实并非如此。类的静态成员不是派生类的成员

继承静态方法是一个好方法吗 编程练习

你不能阻止它发生

仅供参考,以下是一些与静力学相关的“良好实践”问题:

  • 可变的静态属性应该是私有的,最好是作为单例对象重新编码

  • 很多静态成员(方法或属性)甚至是单例都可能是糟糕设计的标志。这当然不是“面向对象的方式”

  • 在某些类型的应用程序(例如web应用程序)中,即使是单例对象也是有问题的

  • 引用静态方法a
    obj.someStaticMethod()
    this.someStaticMethod()
    是一种不好的做法。要么用类名限定静态名称,要么不加限定地引用它

  • 在超类中限定对静态的引用(可以说)更好;e、 g.在子类中,参考
    超类.someStaticMethod()
    而不是
    someStaticMethod()
    。(但缺点是代码更加冗长。这与导入的优缺点是一致的。)

  • static final
    常量应使用所有caps名称声明


如果
B
a
的子类,我们有
a=newb()
作为一种法律声明,因此它们是相同的类型,如果静态方法是在
a
上,那么
B
将具有它,因为它们在这方面是相同的类型。我认为您的困惑在于,静态方法可以通过
this
引用,使其看起来像是继承的


通过类的实例分派静态方法是不好的做法,因此它应该始终是
a.staticMethod()
,这也消除了您对继承的误解,因为
B.staticMethod()
在隐藏/重写时不会引用与
a
相同的方法。

对于使用
public class StaticTest extends StaticBase {

public static void main(String[] args) {
    // TODO Auto-generated method stub
    System.out.println("Start");
    StaticTest.printIt();
}
public static void printIt(){
    System.out.println("Inside bas Class");
}