我觉得楼主换个角度去想一下可能会更容易接受!
      A.method()跟他的子类B.method()你看调用上就知道了!
     是用类名去调用!因为静态的方法是属于类的!所以继承当然无法覆盖呀!
     至于继承静态方法这句话是有点问题!
     具体怎么去理解就看各人的角度啦!
     只要理解就行,如果要知道个所以然的话,那你可得把java去仔细研究一下!
     说不定到时候一个系统级人物就旦生啦!
     呵呵!

解决方案 »

  1.   

    在程序中,子类根本就没有去继承父类StaticExtends.hello("ni hao");只是引用父类的方法。
      

  2.   

    只因为他是属于一个类的,不需要被实例化,才称之为static方法.
    也是因为他是属于一个类的.子类不能覆盖static方法,在调用的时候也是调用父类的static的方法.
    呵呵.看你的理解了
      

  3.   

    没覆盖也没继承,子类存有指向父类的引用(所以输出UpClass: ni hao),当你的子类与父类都有同个类型的静态方法,调用时就只会找调用的类的那个方法。
      

  4.   

    还有一个问题,我把父类的static 方法声明为private,这样以后就不能在子类中实例新的父类对象来访问改static方法,只能在父类里访问,不知道为什么#########################################################
    class UpClass
    {
    private static void hello(String input)
    {
    System.out.println("UpClass: "+input);
    }

    public static void main(String[] args)
    {
    //StaticExtends se = new StaticExtends();
    UpClass.hello("ni hao");
    }
    }
    #########################################################这样可以编译运行public class StaticExtends extends UpClass
    {
    /*
    static void hello(String input)
    {
    System.out.println("subClass: "+input);
    }
    */


    public static void main(String[] args)
    {
    //StaticExtends se = new StaticExtends();
    //StaticExtends.hello("ni hao");
    UpClass upclass = new UpClass();
    upclass.hello("ni hao");
    }
    }###############################################
    编译报错,称该方法的访控制声明为private,但是我用的是父类的实例对象阿??WHY
      

  5.   

    你声明成private了,外界又怎么能访问呢??这跟是不是实例对象没关系
      

  6.   

    我明白了,你的意思是说为什么在子类中无法访问父类的private成员
    子类只能访问父类中声明为public和protected成员,这是java机制了
      

  7.   

    楼上的大哥,也许是我解释的不清楚,我再说一遍,不好意思了private static void hello(String input)是UpCalss的一个方法(private),现在我要调用这个方法,我声明了UpClass类的一个实例对象
    UpClass upclass = new UpClass();
    然后用它来调用hello()
    upclass.hello("ni hao");我的理解是:
    这就好我是一家连锁银号的老板(UpClass),现在我印制了一种银号专用的支票(hello是private),我在自己的总行(UpClass内)用这个支票(在UpClass里用hello()),没问题,系统给钱了(输出信息),
    接着我开了另一家银号(在StaticExtends类的main方法里new 一个UpClass),
    我靠,他说:这是UpClass银号专用支票,可是他TMD就是我的分号阿,不认我了现在我问的是,JAVA规定的这家银号的机制是什么,为什么自己的实例对象访问自己的方法(就算是私有的),都不能编译通过
      

  8.   

    晕,OOP的概念之一就是封装,你为什么要把某个方法声明为private,既然你声明了,就意味着你不希望别人能访问这个方法,你这个方法是提供给内部使用的。如果你想让人访问就默认声明或者声明为public
    为什么自己的实例对象访问自己的方法(就算是私有的),都不能编译通过?
    原因就是因为它是私有的啊!!!就像你的例子,你是在StaticExtends调用,这就是在外部了,当然不能通过了
    还有,类方法(static声明)跟实例对象没有关系,它是这个类的所有对象共享的,在内存中占同一个位置
      

  9.   

    我觉得如果static方法如果不是私有的话,那么被继承之后子类和超类是共享此方法的,如果是私有的话,那么就只属于超类!!
      

  10.   

    多谢  killme2008(流浪的蛤蟆) ( ) 是否可以这样理解,声明为private的方法只能在该类中使用,也就是说我在UpClass中声明了一个private的hello方法,但是我在UpClass中没有使用它,这样,UpClass对外界就表现出没有这个方法的样子(private不能被外界访问),
    也就是说,如果你写了一个private方法,在类中不使用它,就和没有写这个方法一样(在外界反正不能用),区别大概就是你真的调用了,会报错而已??
    Right??
      

  11.   

    多谢  killme2008(流浪的蛤蟆) ( ) 是否可以这样理解,声明为private的方法只能在该类中使用,也就是说我在UpClass中声明了一个private的hello方法,但是我在UpClass中没有使用它,这样,UpClass对外界就表现出没有这个方法的样子(private不能被外界访问),
    也就是说,如果你写了一个private方法,在类中不使用它,就和没有写这个方法一样(在外界反正不能用),区别大概就是你真的调用了,会报错而已??
    Right??-----------------------------
    对了,当然,你写一个不使用的private方法是没有任何意义的,建议还是找本介绍OOP的书认真看看
      

  12.   

    实际上问题就怕深究以前不明白很多人说,调用static声明的属性和方法时最好用类名,(估计很多人也只是人云亦云)而private的用法估计也没有人没事找事,声明一个private后,还要new一个对象去调用它,经过温习,还是发现自己学的远远不够再次归纳一下楼上众人的观点:对子类与父类的static问题
    ——没覆盖也没继承,子类存有指向父类的引用对于private
    ——该方法或属性只能在该类内使用
      

  13.   

    呵呵,来晚了,看来FaneAnn(十年等待)已经明白了!
    你最后说的很对,在写java程序的时候只在类内部调用的方法定义为
    private的是个很好的编程习惯。另外子类的static方法和父类有同名、
    同参数的static方法,但他们之间没什么覆盖、继承的关系,你调用的
    时候看是用那个类名引用了,用子类的类名就调用子类的static方法,
    用父类类名就调用父类的static方法。
      

  14.   

    本人又一个假设,不知道是否正确,请大家批评指正对于static而言,父类含有这个static方法,子类没有继承它,但是能够用实例对象或类名调用(验证过),是否代表子类在调用一个方法的时候,若找不到该方法,都会到父类去寻找该方法,若找到了该方法并且不是private的,就直接调用,如果是private,就回报说无此方法(实际上真正的原理是找到了private方法,而由于没有访问权限),也就是说不能继承private方法而报告没有这个方法是表现,实质上是没有对这个方法的访问权以下是将hello写成private void hello(String input)后
    用StaticExtends se = new StaticExtends();来子类对象调用的结果
    StaticExtends.java:28: hello(java.lang.String) has private access in person.fane
    .test.UpClass
                    se.hello("ni hao");
                      ^
    1 error
    事实证明,子类在调用方法的时候找不到方法都会上朔到父类去找方法哈哈,StarCraft去先,private的假设待续.....
      

  15.   

    试下这段代码,解释一下:
    public class StaticExtends extends UpClass
    {
    private static void hello(String input)
    {
    System.out.println("subClass: "+input);
    }
    public static void main(String[] args)
    {
    StaticExtends.hello("ni hao");
    UpClass.hello("ni hao");
    }
    }class UpClass
    {
    static void hello(String input)
    {
    System.out.println("UpClass: "+input);
    }
    }
      

  16.   

    上面一段代码的错误是不能降低自upclass继承方法的可视性
      

  17.   

    To:  umbrella1984(雨伞(梅州垃圾)) ( ) StaticExtends.java:14: hello(java.lang.String) in person.fane.test.StaticExtends
     cannot override hello(java.lang.String) in person.fane.test.UpClass; attempting
     to assign weaker access privileges; was package
            private static void hello(String input)
                                ^呵呵,如果没有继承的话,那么即使写了也因该没错的,StaticExtends和UpClass各自调用自己的方法只能说这里的继承还是有待研究
      

  18.   

    我的理解:
    static是静态的。特点是在类被装载时最先开辟内存空间,而且无论类被实例化多少次都只开辟一次内存空间。他本身与能否继承没有关系。就是说static的成员与其他成员一样被继承或重写。
    如果父类先被实例化,子类后被实例化的话。在父类被实例化时会按照父类的static成员开辟内存空间。而子类被实例化的时候会按照子类的static成员开辟内存空间。无论是否被覆盖,过程都是一样的。
    private只要记住他只能在类内使用就可以了。任何被定义为private的成员都只能在所在类内部使用。还要记得class只能用public和默认的来修饰,不能用private修饰(这个好象没必要说)
      

  19.   

    通篇看下来,自己也试了试,真是受益非浅。不过static方法到底能否被继承这个问题还是没有结论,
    希望能再看到高人的指点。
      

  20.   

    怎么没有结论??
    static方法是不能被继承的,子类就算覆写了本质上还是使用父类的
      

  21.   

    用代码来验证就知道结果了。
    static方法一样可以被继承的。
    public class Test extends SupTest
    {
    static void hello(String msg){
    System.out.println("sub :"+msg);
    }
    public static void main(String[] args){
    Test test=new Test();
    test.hello("sub instance Hello");
    Test.hello("sub class hello");
    SupTest.hello("parent Hello");
    }
    };class SupTest
    {
    static void hello(String msg){
    System.out.println("sup:"+msg);
    }
    };
    以上代码在jdk1.4.1下编译通过,没有任何问题。
    运行结果:
    sub:sub instance Hello
    sub:sub class hello
    sup:parent Hello
    当然,超类的静态方法如果是私有当然就不能继承了。
      

  22.   

    我只能说,从代码分析的角度,static方法表现出来的是能被继承的一面(不知道这算不算继承),本人大胆假设:java中继承是全继承的,就是不论方法为何,都在子类中保存有样本,
    在非private时,这个比较好理解,
    但是碰到private方法的时候,子类中其实有这个方法,只是访问时会报错,提示private访问控制(上文已提到),如果子类重写了该方法,由于在父类中该方法为private,所以无论用什么修饰符都不会出错,因为父类中已经是private了,我重写为public或其他不会有影响,也就是表现出了子类没有继承到private方法的现象,java中不允许子类降低父类方法的访问控制(把父类的public方法该为protected或更低),估计就是由于这种机制的原因。
      

  23.   

    1,程序运行时,内存分为:
    代码区:存放程序指令
    全局数据区:存放全局和static之类的静态变量。他在程序运行生命期内都存在
    栈:存放局部变量,如方法内部声明的变量
    堆:用new 分配的内存。如创建一个类的实例。2,static只能说明方法的内存位置。3,OOP的重要思想就是继承。如果基类有这个方法,不管是static或是其它类型的,子类都拥有。但子类能否调用该方法,要看这个方法所处的是 private,public,protected,或是程序语言的其具体规范。
      

  24.   

    嗯,主要让人混淆的地方在于可以利用子类的类名,实例变量来调用
    父类的静态方法。这个嘛,可以说是继承得来,也可以说是不是继承,关键看
    继承的定义了。所以不用太关心是否是继承,要关心的在于,使用子类类名或者实例变量
    调用时会有什么影响。
    假设原先程序里用子类类名或者实例变量调用了父类的静态方法。
    后来子类里声明了一个同名静态方法,那么程序的行为就有可能变化。另外关于十年等待的那个银行的例子。如果声明成private,当然那个支票
    连分行都不能使用。但是,别忘了还有protected关键字,如果需要分行也能
    使用,当然应该将private改成protected。
    绝对私有也是有必要的。所以那个例子不好啦。
      

  25.   

    你就记住 static 变量 或 方法 是类的,他有一块单独的内存来指向它!
    不同于其他实例变量和方法,static 修饰,是不可以覆盖的,个用个的!
      

  26.   

    static method的继承和覆盖跟non-static method一样,对于sub class的引用sub class里面有的就调用sub class的,没有就去调super class的
    public class Hello extends test
    {
    public static void main(String augs[])
    {
       Hello a = new Hello();
       a.method();
    } //static void method()
    //{
    // System.out.println("sub's method!");
             // }
    }
    class test
    {
    static void method()
    {
    System.out.println("super's method!");
    }
    }
    编译通过,result:super's method!  去掉sub class里的注释,result:sub's method!
    结论:子类可以继承父类的static方法,覆盖亦可!
      

  27.   

    其实声明为static和private的方法都隐含了final的限定。。而一个final的方法则是不能再更改的
      

  28.   

    研究的人很多啊其实我早就编写了程序测试,实验的结果表明static修饰的方法是可以继承的但是我在很多书上却看到的是另一回事,所以提出疑问,想请基础扎实的高手讲解一下,也算是为JavaFans抛个砖了
      

  29.   

    什么是继承?
    class a extends b{....} 如果a中未定义的方法x()在b中定义了,并且可通过a的引用调用x(),那么就说明a继承了b的x()。
    如果这么说的话,static方法的确可被继承。
    那么static方法可被覆写吗?
    class UpClass
    {
    static void hello(String input)
    {
    System.out.println("UpClass: "+input);
    }
    }public class StaticExtends extends UpClass
    {
    static void hello(String input)
    {
    System.out.println("subClass: "+input);
    }
    public static void main(String[] args)
    {
    StaticExtends.hello("ni hao");
    UpClass.hello("ni hao");

    UpClass up=new StaticExtends();  //向上转型至父类接口
    up.hello("??"); //调用父类static void hello(); //向下转型为子类接口
    ((StaticExtends)up).hello("??");//调用子类static void hello();

    }
    }结果证明,static并没有后期绑定,只是单纯的根据类引用来判断执行哪个类中的方法。所以,static无法被覆写。
      

  30.   

    看看这个
    http://www.54bk.com/more.asp?name=yanguang&id=3064