黑马程序员技术交流社区

标题: 子类和父类的static成员 [打印本页]

作者: fso918    时间: 2011-10-18 15:03
标题: 子类和父类的static成员
父类:
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了吗?

作者: 赵江锋    时间: 2011-10-18 15:50
本帖最后由 赵江锋 于 2011-10-18 16:06 编辑

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

这段代码呢?出错了。。。
这段代码不能通过编译。有人能说下原因吗?
作者: 赵玉成    时间: 2011-10-18 18:06
楼主,这段代码运行的还是Hello,Tom啊 有什么问题吗?
作者: 兰海忠    时间: 2011-10-18 18:28
fso918 发表于 2011-10-18 17:04
父类:
package com.super;
class Super{

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

但是,尽管子类对象可以共享父类的静态方法,那么它为何不能重载父类的静态方法呢,其实我觉得静态只是表明一种全局唯一的概念,如重载(override)应该没有关系
作者: 兰海忠    时间: 2011-10-18 18:52
运行的结果是父类的say的内容即Hello,tom原因是访问静态方法是有类来决定而不是对像来决定的,因为楼主定义了一个父类所以实行了父类的静态方法。因此即便new了一个子类对象仍执行父类的方法。 楼主多看点书本吧有时候光练是不够的
作者: fso918    时间: 2011-10-18 19:01
本帖最后由 fso918 于 2011-10-18 19:04 编辑
兰海忠 发表于 2011-10-18 18:52
运行的结果是父类的say的内容即Hello,tom原因是访问静态方法是有类来决定而不是对像来决定的,因为楼主定 ...


2楼的代码改为public也是不能编译的。
作者: fso918    时间: 2011-10-18 19:19
子类不能override父类的static方法原因:
java的多态的动态绑定,是在对象的基础上的,即动态绑定发生在对象创建后,而静态方法 是不需要对象的,所以是无法动态绑定的。即其只会调用
与其声明的类型的类绑定的静态方法。
作者: 赵江锋    时间: 2011-10-18 19:48
fso918 发表于 2011-10-18 17:04
父类:
package com.super;
public class Super{

父类:
package com.super;

包名不要用关键字super  
作者: 白磊    时间: 2013-5-5 16:54
就是访问权限的原因,你把它放在一个包里就ok了。




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