A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李成航 中级黑马   /  2012-3-14 17:37  /  2344 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Animal {
static void doStuff(){System.out.println("a");}
}


class Dog extends Animal{

static void doStuff(){System.out.println("d");}//既然静态方法不能被重写,那为什么要用与重写完全一样的形式呢?此究竟属于重写吗?

public static void main(String[] args){

...................................
}

}

5 个回复

倒序浏览
我觉得不属于重写,静态方法是类在加载时就被加载到内存中的方法,在整个运行过程中保持不变,虽然在形式上可以重写,但从本质上来说不是JAVA的重写。因为静态方法只与类相关,与具体实例无关,可以直接被类名引用,假如在你代码主函数中加入以下代码:
Animal d=new Dog();
Animal a=new Animal();
Dog g=new Dog();
d.doStuff();
a.doStuff();
g.doStuff();
输出结果是a a d
回复 使用道具 举报
static方法表示该方法不关联具体的类的对象,可以通过类名直接调用,也就是编译的前期就绑定了,不存在后期动态绑定,也就是不能实现多态。子类的非静态方法是与具体的对象绑定的,两者有着不同的含义。方法前面加上static修饰符,确实能通过编译!但是不要以为这就是多态。
class Animal {
static void doStuff(){System.out.println("a");}}

class Dog extends Animal{
static void doStuff(){System.out.println("d");}

public static void main(String[] args){

     Animal d=new Dog();
     d.print();
}
}
这时打印的是a,并不是d,从这个结果可以看出,并没有实现多态,它不符合覆盖表现出来的特性,不应该算是重写!
回复 使用道具 举报
应该不算是,我觉得你是记错了
final修饰的方法是不能重写的
因为静态方法只与类相关,不与具体实现相关,声明的是什么类,则引用相应类的静态方法
总结来说应该算是形式上的重写,不过毫无意义

所以我能说,这又算是重写又不算重写么···
回复 使用道具 举报
话说这是涉及到老毕讲的什么编译看哪边,运行看哪边的那一集么
回复 使用道具 举报
不用new对象,这两个方法可以直接这样调用
Animal.doStuff();
Dog.doStuff();
然后因为与对象无关,所以应该是声明谁就是谁的方法
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马