黑马程序员技术交流社区

标题: 父类与子类都是静态方法问题 [打印本页]

作者: 马强    时间: 2012-4-12 21:35
标题: 父类与子类都是静态方法问题
子类继承父类,而且有相同的静态方法。
class Fu{
static void method(){
  System.out.println("fu method");
}

}
class Zi extends Fu{
static void method(){
  System.out.println("zi method");
}
}
class Practice {
public static void main(String[] args) {
  Fu f = new Zi();
  f.method();
}
}
这时候,子类方法无法覆盖。
  ————>      “准确的讲此时只是子类对父类静态方法的隐藏(hide),子类的静态方法完全体现不出多态,就像子类字段隐藏父类的字段一样,在利用引用访问对象的字段或静态方法时,是引用类型(type)决定了事实上访问的是哪个字段,而非当前引用实际代表的是哪个类。因此,子类静态方法不能覆盖父类静态方法。”

想问大家的是,这里的引用类型决定访问的字段,为什么?



作者: 李敏    时间: 2012-4-12 21:58
1. 如果你父类中有一个普通方法,子类继承之后没有对其进行覆写,
    在子类中也将父类这个普通方法继承过来了,那么你用父类引用指向子类对象,调用这个方法是,就是调用的父类的这个方法。
    如果对其覆写,则是调用子类覆写后的。

2. 都是静态方法,子类只是对父类的静态方法隐藏了。同存在于数据共享区。是不能继承过来的,你用父类引用指向这个重名的静态方法当然是就是调用父类自己的方法,
    如果你想调用子类的这个静态方法, 就必须用子类类名来调用。  
    静态方法属于类而不是属于单个实例。


作者: 邓斌    时间: 2012-4-12 22:10
静态随着类的加载而加载。优先于对象存在。
静态方法不属于对象。他属于类。
多态调用也是对象调用。调用静态用类名调用。
不能说子类静态方法无法覆盖父类静态方法。
覆盖:
1。子类覆盖父类。必须保证子类权限大于父类权限,才可以覆盖否则编译失败。
2。静态只能覆盖静态。

作者: 孙国军    时间: 2012-4-12 22:18
这时候,子类方法无法覆盖。
  ————>      “准确的讲此时只是子类对父类静态方法的隐藏(hide),子类的静态方法完全体现不出多态,就像子类字段隐藏父类的字段一样,在利用引用访问对象的字段或静态方法时,是引用类型(type)决定了事实上访问的是哪个字段,而非当前引用实际代表的是哪个类。因此,子类静态方法不能覆盖父类静态方法。”


静态方法的调用模式: 类名.静态方法名()

从这可以看出,调用静态方法的根本是静态方法所属的本类类名,也就是上民所说的引用类型,

而父类的静态方法可以有父类的引用所调用
  1. Fu f = new Zi();
  2.   f.method();
复制代码
这里的f的引用类型是Fu,所以f.method()调用的是父类中的method();




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2