黑马程序员技术交流社区
标题:
关于static方法的覆写
[打印本页]
作者:
张艳艳
时间:
2013-1-6 00:27
标题:
关于static方法的覆写
本帖最后由 张艳艳 于 2013-1-9 14:45 编辑
看到一些资料说是父类中的static方法不能被子类所覆写,自己写了个小程序,也没看到任何错误提示,我写得这个到是不是覆写,谁能深入解释一下
到底怎么才是覆写
class fu{
static void print(){
System.out.println("fu");
}
}
class zi extends fu{
static void print(){
System.out.println("zi");
}
}
public class fuxie {
public static void main(String[] args)
{
fu.print();//打印fu
zi.print();//打印zi
}
}
作者:
金鑫
时间:
2013-1-6 00:35
首先要明确的是什么是复写?当父子类中出现了一模一样的函数,就叫做复写
复写的要求或者说什么叫一模一样的函数:必须是父子类之间,方法名相同,参数列表相同,返回类型一致
不能复写的情况,如果父类中的方法是用private修饰,那么子类就无法复写父类中的方法。就算子类中有一个方法与父类方法名相同,参数列表以及返回值都相同,依然不是重写,只是相当于在子类中重新定义了一个方法,可以加static关键字。
static修饰的函数:父类中static修饰的函数也可以被复写,只是子类中复写的函数也必须要用static来修饰。
作者:
希望的曙光
时间:
2013-1-6 01:00
在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法
作者:
黑马刘杰
时间:
2013-1-6 20:17
static 修饰符修饰的方法存储在属于这个类的单独空间里,在类加载的时候就已经存在了,他是存在于这个类文件的,全局的,所以对于static的方法或变量应该用类名来引用。而重写是体现在对象上,当new一个子类对象时,父类中被重写的方法将不会在对象中出现了,而static类型的将会全局存在,无法覆盖。看下下面的例子
class Fu {
static void print() {
System.out.println("fu");
}
public void foo(){
System.out.println("父类。。。");
}
}
class Zi extends Fu {
static void print() {
System.out.println("zi");
}
public void foo(){
System.out.println("子类。。。");
}
}
public class FuXie{
public static void main(String[] args) {
Fu.print();// 打印fu
Zi.print();// 打印zi
Zi z=new Zi();
z.print();
Fu f=new Zi();
f.print();
f.foo();
}
}
复制代码
f的类型是父类的,所以调用静态方法f.print();时会打印 “fu”
f所指向的内存地址是子类new出来的,所以调用普通方法f.foo();时会打印 “子类。。。”
作者:
王阳
时间:
2013-1-6 23:14
最简单的办法,尝试加上一个@Override就能验证你那个问题了。
作者:
何竹冬
时间:
2013-1-6 23:48
这个毕老师讲过的,静态只能覆盖静态,
作者:
杨建聪
时间:
2013-1-6 23:55
静态可以覆写的,只是静态只能覆写静态,因为静态是随着类的加载而加载,生命周期最长,和对象无关,
所以如果子类的对象不是静态的话,无法覆写父类中的静态,
覆写的前提是:子父类中的方法必须一模一样,包括返回值类型。所以楼主写的是覆写。
作者:
shuima
时间:
2016-6-27 22:29
黑马刘杰 发表于 2013-1-6 20:17
static 修饰符修饰的方法存储在属于这个类的单独空间里,在类加载的时候就已经存在了,他是存在于这个类文 ...
你这说的是多态吧!父类调用的static还是父类的方法,而对于非static ,则调用的是子类的方法,但是static似乎也能够被重写,不过我在书上看过,上面写static方法不能被重写
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2