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