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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 史卫平 黑马帝   /  2011-9-4 07:57  /  4303 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

昨天群里讨论的:SuperClass中的method(int x,double y)和SubClass2中的method(int x)是不是重载关系呢?
class SuperClass {
        public void method(int x, double y) {
                System.out.println("我是父类SuperClass");
        }

//        public void method(int x) {
//                System.out.println("我肯定是重载了");
//        }
}

class SubClass1 extends SuperClass {
        public void method(int x, double y) {
                System.out.println("我重定义了父类SuperClass,即覆盖了父类方法");
        }
}

class SubClass2 extends SuperClass {
        public static void main(String[] args) {
                new SubClass2().method(2, 3.2);
                new SubClass2().method(2);
        }

        public void method(int x) {
                System.out.println("如果我不是重载,我算什么东西?");
        }
}

SuperClass中的method(int x,double y)和SubClass2中的method(int x)是不是重载关系
如果把注释的部分去掉,那SubClass2中的method(int x)跟SuperClass中的两个method分别什么关系

昨天把我头搞得好乱:什么重载、覆盖、覆写,重写、Override、改写这么多名词能不能统一一下啊

评分

参与人数 1技术分 +2 收起 理由
老罗 + 2 能不能统一,就看你的啦。

查看全部评分

6 个回复

倒序浏览
黑马网友  发表于 2011-9-4 08:58:24
沙发
你可以这样来理解,在同一个类里面的叫重载,在不同类里面的叫覆盖
例:重载,//重载一般是同一种方法,但是他们的参数或则类型不一样,
   class Chi{
        public void method(int x, double y) {
                System.out.println("我是父类SuperClass");
        }

       public void method(int x) {
              System.out.println("我肯定是重载了");
       }
      }

覆盖://覆盖一般是子类覆盖父类的方法,
class SuperClass {
        public void method(int x, double y) {
                System.out.println("我是父类SuperClass");
        }

class SubClass1 extends SuperClass {
        public void method(int x, double y) {
                System.out.println("我重定义了父类SuperClass,即覆盖了父类方法");
        }
}

评分

参与人数 1技术分 +3 收起 理由
老罗 + 3

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-4 09:03:45
藤椅
首先回答你的提问:是重载关系,如果把注释去掉,那么跟两个method都为覆盖,也就是重写了。
第一:重载(Overloading),覆写、重写、覆盖其实在Java中是同一个概念,都为Overriding.
第二:重载Overloading是一个类中多态性的一种表现。Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。调用方法时通过传递给它们的不同参数个数和参数类型
来决定具体使用哪个方法, 这就是多态性。
第三:父类与子类之间的多态性,对父类的函数进行重新定义。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。
总结:
方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了,而且如果子类的方法名和参数类型和个数都和父类相同,那么子类的返回值类型必须和父类的相同;如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。也就是说,重载的返回值类型可以相同也可以不同。

评分

参与人数 1技术分 +3 收起 理由
老罗 + 3

查看全部评分

回复 使用道具 举报
呵呵,这个问题简化处理吧

虽然这些概念在翻译成中文的过程中,有很多不同的翻译方式
但本质上只有两种说法,就是Override和Overload
其中,Overload一般都被翻译成重载
而Override的翻译就乱七八糟了,所谓覆盖、覆写、重写、改写指的其实都是这个意思

那么为什么会有这么多名词,而不能统一一下呢?
打一个最简单的比喻吧,为什么老婆这个词有这么多叫法?而不能统一一下呢?
这个原因就不用我说了吧呵呵

所以,不管这个单词被翻译成多少种说法
在你学习的过程中,你只需要按照一种你喜欢的说法来使用就可以了
而对于其他的说法,你只需要在看到别人使用的时候
能够知道这跟你使用的某个说法的含义是一样的,就可以了

所以,在这里这个问题可以简化为
Overload和Override定义和区别是什么?
为了方便讲解,在这里我将使用“重载”和“覆盖”这两个名词
其中重载就是Overload,覆盖就是Override,你心里明白就可以了~

下面给出最基本的重载和覆盖的定义吧:
同一个类中,如果定义了多个方法名相同,但是可以通过参数进行区分的方法,那么这些方法就可以称之为重载
子类中,如果定义了方法名、参数和返回值都与父类完全相同的方法,那么子类中的这个方法就可以称之为覆盖了父类中的方法

所以,你只需要严格记住以上两个定义,就很容易区分重载和覆盖了
下面就结合上面的定义,再来看看你给出的代码吧:[code=java]class SuperClass {
  public void method(int x, double y) {
    System.out.println("我是父类SuperClass");
  }

  public void method(int x) {
    System.out.println("我肯定是重载了");
  }
}[/code]在这里可以看出,由于method(int x)和method(int x, double y)的方法名相同,但是参数可以区分
所以这两个method就是重载关系

再来看下面这段代码:[code=java]class SubClass1 extends SuperClass {
  public void method(int x, double y) {
    System.out.println("我重定义了父类SuperClass,即覆盖了父类方法");
  }
}[/code]在这里可以看出,由于SubClass1继承了SuperClass
并且SubClass1中定义的void method(int x, double y)这个方法
和SuperClass中定义的void method(int x, double y)方法的方法名、参数和返回值完全相同
所以子类中的这个method就是覆盖了父类中的这个method

好,如果对上面的两段代码的解释你能够看懂的话
那我也来给出一段代码吧,看你能不能看的懂~[code=java]class SubClass3 extends SuperClass {
  public void method(int x, double y) {
    System.out.println("我是子类Subclass3");
  }

  public void method(int x) {
    System.out.println("我是重载还是覆盖呢?");
  }
}[/code]在这段代码中,我们可以看到
由于在SubClass3中定义了两个方法名都为method的方法,所以它们的关系应该是重载
而由于在SuperClass中也定义了两个与它们完全相同的方法,所以它们和SuperClass中方法的关系又是覆盖
那么它们究竟是重载还是覆盖呢?其实在上面的这两句话中,我已经给出答案了
在SubClass3中,这两个方法的关系是重载
和SuperClass中,的这两个的方法的关系是覆盖
所以,你既可以把它们看成是重载,又可以看成是覆盖
区别只在于,你是从什么角度去看它们的

好了,关于重载和覆盖就解释这么多吧
对于为什么要有这两种概念,以及如何去应用它们,这个就只能靠你以后慢慢去体会了呵呵

Tips:
在这里再补充一点小小的细节吧:
什么叫可以通过参数进行区分呢?主要有以下三种区分方式:
1、参数的数量不同,例如method(int)和method(int, int)
2、参数的类型不同,例如method(int)和method(String)
3、参数的顺序不同,例如method(int, String)和method(String, int)
*注意,参数的顺序不同的前提必须是顺序不同的几个参数类型不能一样
例如如果是method(int, int)的话,那么不管怎么改变顺序都无法进行区分的

[ 本帖最后由 李叶 于 2011-09-04  09:31 编辑 ]

评分

参与人数 1技术分 +3 收起 理由
老罗 + 3 你们三剑客,都给3分。

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-4 13:56:04
报纸
其实我就是想看李叶的答案,昨天群里没他参与,不好
回复 使用道具 举报
黑马网友  发表于 2011-9-4 14:19:17
地板
虽然写得是很好,但我的部分问题好像并没有正面回答
回复 使用道具 举报
李叶 黑马帝 2011-9-4 15:36:12
7#
呵呵,明白你的意思了,那我就正面回答一下这个问题吧:

首先,SuperClass中的method(int x,double y)和SubClass2中的method(int x)是不是重载关系
答案是:是
因为,在一个子类中,是默认包含父类对象中的所有非private的属性和方法的
所以,只要子类中存在多个方法名相同但参数可以区分的方法,就都可以称之为重载
即使这些方法是子类从父类继承来的也没关系
注意:
在这里不要钻牛角尖,一定要弄明白“子类”中的方法和“父类”中的方法是不是重载关系
重载关系是Java的一种语言特性,体现的只是两个方法之间的关系,与子类父类无关


其次,如果把注释的部分去掉,那SubClass2中的method(int x)跟SuperClass中的两个method分别什么关系
答案是:
跟SuperClass中的method(int x)方法是覆盖关系
跟SuperClass中的method(int x, double y)方法是重载关系
[ 本帖最后由 李叶 于 2011-09-04  22:31 编辑 ]
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马