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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© fso918 黑马帝   /  2011-10-18 15:03  /  3840 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

fso918 黑马帝 2011-10-18 17:04:48
楼主
本帖最后由 fso918 于 2011-10-18 19:03 编辑
赵江锋 发表于 2011-10-18 15:50
static 方法不能被重写(override)。
如果你编译并运行这段代码,你会发现输出文本Hello,Tom
因为名字叫sa ...


父类:
package com.super;
public class Super{
     static String s = "Tom";
     public static void say(){
         System.out.println("Hello," + s);
     }
}
子类:
package com.subclass;
public class Sub extends Super{
     public static void say(){
         System.out.println("Hi," + s);
     }
}
测试类:
class Test{
     public static void main(String[] args){
         Super s = new Sub();
         s.say();
     }
}

这段代码呢?出错了。。。
这段代码不能通过编译。有人能说下原因吗?
回复 使用道具 举报
父类:
class Super{
     public static void say(){
         System.out.println("Hello,Tom");
     }
}
子类:
class Sub extends Super{
     public static void say(){
         System.out.println("Hi,Jacl");
     }
}
测试类:
class Test{
     public static void main(String[] args){
         Super s = new Sub();
         s.say();
     }
}

测试类输出的结果是什么?为什么?override了吗?

10 个回复

倒序浏览
本帖最后由 赵江锋 于 2011-10-18 16:06 编辑

static 方法不能被重写(override)。
如果你编译并运行这段代码,你会发现输出文本Hello,Tom
因为名字叫say 的方法与类发生了关联,而不是与特定的类的实例相关联,它不在乎什么类型的类正在创建它,而仅仅在意引用的类型。因此,如果你在调用say 前改变一下这一行,
Sub  s = new Sub();
你就会发现当你运行程序时,你会得到输出:Hi,Jacl
所以并不满足重写的本质 也就是没有多态
如果是重写的话 应该满足父类引用指向子类对象 也就是有多态存在

评分

参与人数 1技术分 +2 收起 理由
admin + 2

查看全部评分

回复 使用道具 举报
fso918 黑马帝 2011-10-18 19:01:41
板凳
本帖最后由 fso918 于 2011-10-18 19:04 编辑
兰海忠 发表于 2011-10-18 18:52
运行的结果是父类的say的内容即Hello,tom原因是访问静态方法是有类来决定而不是对像来决定的,因为楼主定 ...


2楼的代码改为public也是不能编译的。
回复 使用道具 举报
fso918 黑马帝 2011-10-18 19:19:04
报纸
子类不能override父类的static方法原因:
java的多态的动态绑定,是在对象的基础上的,即动态绑定发生在对象创建后,而静态方法 是不需要对象的,所以是无法动态绑定的。即其只会调用
与其声明的类型的类绑定的静态方法。

评分

参与人数 1技术分 +2 黑马币 +2 收起 理由
admin + 2 + 2

查看全部评分

回复 使用道具 举报
楼主,这段代码运行的还是Hello,Tom啊 有什么问题吗?
回复 使用道具 举报
兰海忠 黑马帝 2011-10-18 18:28:03
7#
fso918 发表于 2011-10-18 17:04
父类:
package com.super;
class Super{

都是因为默认访问权限造成的,楼主看熟悉一下访问权限方面的内容就可以了。
首先 父类class 没有修饰符是是默认的访问权选,访问父类只能在同一个包中,而楼主是分在两个包中,肯定是不可以的。 其实父类的成员变量也是默认的也不可以在不同的包中访问。也就是说即便你把Super 的class修饰符办成public 也还是有错误。还要把变量也修饰成public才行。
回复 使用道具 举报
叶涛 黑马帝 2011-10-18 18:39:54
8#
输出的结果是“hello,Tom”
静态方法和静态变量是属于整个类的,不是哪个具体的类的对象的。所以在静态方法和静态变量中不能够用super,this这些修饰赋。
静态的东西在同类或者所有子类的实例中都是共享的.
综合而言:
1。super,   this等关键字不能用于静态方法中
2。静态方法及对象将被同类或者所有子类的实例所共享,因为子类和父类的关系是 "is-a "。

但是,尽管子类对象可以共享父类的静态方法,那么它为何不能重载父类的静态方法呢,其实我觉得静态只是表明一种全局唯一的概念,如重载(override)应该没有关系

评分

参与人数 1技术分 +2 收起 理由
admin + 2

查看全部评分

回复 使用道具 举报
兰海忠 黑马帝 2011-10-18 18:52:08
9#
运行的结果是父类的say的内容即Hello,tom原因是访问静态方法是有类来决定而不是对像来决定的,因为楼主定义了一个父类所以实行了父类的静态方法。因此即便new了一个子类对象仍执行父类的方法。 楼主多看点书本吧有时候光练是不够的
回复 使用道具 举报
赵江锋 黑马帝 2011-10-18 19:48:40
10#
fso918 发表于 2011-10-18 17:04
父类:
package com.super;
public class Super{

父类:
package com.super;

包名不要用关键字super  
回复 使用道具 举报
就是访问权限的原因,你把它放在一个包里就ok了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马