黑马程序员技术交流社区

标题: 子父类中相同函数 [打印本页]

作者: 杜天伟    时间: 2013-7-26 19:06
标题: 子父类中相同函数
父类中有两个函数,getTime,runcode,getTime方法中调用了runcode方法,子类复写了runcode,建立子类对象,调用getTime方法,getTime会调用子类中的runcode方法,但是如果runcode方法是静态的,那么结果会调用父类中runcode.
这是为什么呢?
作者: 万琪    时间: 2013-7-26 19:13
静态方法不属于类了,,要访问,,必须先new
作者: 杜天伟    时间: 2013-7-26 19:16
万琪 发表于 2013-7-26 19:13  静态方法不属于类了,,要访问,,必须先new

汗!看不懂
作者: 万琪    时间: 2013-7-26 19:19
杜天伟 发表于 2013-7-26 19:16
汗!看不懂

,,,就是说,,子类要用这个static 的方法,,必须是,,子类 clazz = new 子类();,clazz.静态方法,,,,,,或者类名+静态名,,否则是,,不可触及的
作者: 薛淑凯    时间: 2013-7-26 19:28
其实重点在静态方法是不能被继承和重写的,你在子类中又写的runcode方法和父类中的完全是两个不同的方法。你new子类对象调用父类的静态方法就跟直接用父类名字调用效果是一样的
作者: Joesph    时间: 2013-7-26 19:36
class GetTime//父类
{
        public static void  getTime()
        {
                long start=System.currentTimeMillis();
                runCode();
                long end=System.currentTimeMillis();
                System.out.println("\n毫秒数:"+(end-start));
        }
        public  static void runCode()
        {
                for(int i=0; i<1000; i++)
                {
                        System.out.print(i);
                }
        }
}

class MyTime extends GetTime
{
        public static void runCode()
        {
                for(int i=0; i<4000; i++)
                {
                        System.out.print(i);
                }
        }
}
class  Demo
{
        public static void main(String[] args)
        {
                          
                GetTime M=new MyTime();
                M.getTime();
                  }
}

你的程序是不是这个?
这叫多态:GetTime M=new MyTime();其中的M是父类的引用 ,后面又是子类的对象。很明显是父类的引用指向子类的对象。
对于多态来说:静态方法和成员变量都是按照父类中进行运行的
(1)多态中成员函数的特点:成员函数在多态调用时,编译看左边,运行看右边。
(2)多态中成员变量的特点:无论编译和运行,都参考左边(引用型变量所属的类).
(3)多态中静态成员函数的特点 :无论编译和运行,也都参考左边。


作者: 杜天伟    时间: 2013-7-26 19:42
Joesph 发表于 2013-7-26 19:36  class GetTime//父类  {  public static void getTime()

前面差不多,但我建立的是子类对象
MetTime M=new MyTime();


作者: 杜天伟    时间: 2013-7-26 19:45
薛淑凯 发表于 2013-7-26 19:28  其实重点在静态方法是不能被继承和重写的,你在子类中又写的runcode方法和父类中的完全是两个不同的方法。 ...

静态不能被继承和复写吗?我怎么记得是静态只能覆盖静态,而且我是建立子类对象调用父类的非静态方法,这个方法又调用了静态方法
作者: 王峰230321    时间: 2013-7-26 19:47
不是.  是你这个 问题 本身 函数 就有错误啊.  
getTime,  runcode  
静态函数 只能访问静态函数啊.
如果用几个 静态 去调用非静态.   应该编译都过不去吧. ?   .  .  
作者: Mr_Free    时间: 2013-7-26 20:05
Joesph 发表于 2013-7-26 19:36
class GetTime//父类
{
        public static void  getTime()

这个跟多态没关系,你定义 子类 自对象= new 子类();结果也是调用父类的静态runCode()方法。
作者: 薛淑凯    时间: 2013-7-26 20:20
这个问题仔细一看还真有点深度。
查了查试验一下,静态方法是可以继承的,有些大神也说这个继承不算继承,就是整个继承树公用这一个静态方法,感觉像是继承。
然后是复写,结论是不可以复写,当子类中有了跟父类中的一样的静态方法时,父类的方法被隐藏了,注意是隐藏。
总结的不是很好,这个帖子讨论的很详细
http://bbs.csdn.net/topics/290050251
作者: Mr_Free    时间: 2013-7-26 20:36
本帖最后由 Mr_Free 于 2013-7-26 21:09 编辑

我查了一下,静态方法是不能被覆盖的。也就是说子类方法不能覆盖父类的静态方法。
因为静态方法是优先于对象的存在,所以他的调用只跟他的所属类有关,因为你调用的是父类的方法,方法中调用静态方法,由于静态方法不能覆盖,所以执行的是父类的方法。
我回去看了下毕老师的视频,有一句静态只能覆盖静态,我突然对这句话产生了疑惑,然后毕老师说,静态覆盖静态没有意义,只强调静态不能覆盖非静态。

我觉得静态是不能覆盖静态的,他只跟调用他的类有关系。

这个是楼主想表达的代码,我实验了下的出的结论。
  1. package cn.itcast.day3;

  2. public class jicheng {
  3.         public static void main(String[] args){
  4.                 Zi zi=new Zi();
  5.                 zi.getTime();
  6.         }
  7. }
  8. class Fu{
  9.         public void  getTime(){
  10.                 runCode();
  11.         }
  12.         public static void   runCode(){
  13.                 System.out.println("furun");
  14.         }
  15. }

  16. class Zi extends Fu{
  17.        
  18.         public static void  runCode(){
  19.         System.out.println("zirun");
  20.         }
  21. }

复制代码

作者: 杜天伟    时间: 2013-7-26 23:34
王峰230321 发表于 2013-7-26 19:47  不是. 是你这个 问题 本身 函数 就有错误啊.  getTime, runcode  静态函数 只能访问静态函数啊.

我是用非静态调用静态
作者: 杜天伟    时间: 2013-7-26 23:41
Mr_Free 发表于 2013-7-26 20:05  这个跟多态没关系,你定义 子类 自对象= new 子类();结果也是调用父类的静态runCode()方法。 ...

是啊,所以我想知道为什么




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