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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 臧盼 中级黑马   /  2012-12-14 18:26  /  1932 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Overload和Override的区别是什么?Overloaded的方法是否可以改变返回值的类型?

评分

参与人数 1黑马币 +6 收起 理由
刘芮铭 + 6

查看全部评分

7 个回复

倒序浏览
      方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现, 重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被”屏蔽”了。如果在一个类中定义了多个同名的方 法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
重载
覆写
单词
Overloading
Overriding
定义
方法名称相同,参数的类型或个数不同
方法名称,参数类型,返回值类型全部相同
对权限没有要求
被覆写的方法不能拥有更严格的权限
范围
发生在一个类中
发生在继承类中

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
方法重载是为了不同参数的对应不同的方法
方法重写就是屏蔽父类的同方法,所以方法名,返回值什么的都要完全一样

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
重载Overload:表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同)。
覆盖Override:表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现。
回复 使用道具 举报
重载:
1 方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。重载Overloading是一个类中多态性的一种表现。
2 Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性。
3 重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准。
重写:
1 父类与子类之间的多态性,对父类的函数进行重新定义。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。在Java中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不 动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖。
2 若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。
3 子类函数的访问修饰权限不能少于父类的;
回复 使用道具 举报
高境 金牌黑马 2012-12-19 14:19:01
7#
重载:
构造函数的名字和它从属的类的名字相同。
对象和方法的名字有时候会面临重载的需要,例如类的构造函数的引入,因为有时候会需要使用几种不同的方法来创建对象,例如既能用标准的无参数方法来初始化,又可以使用带String类型的参数的方法来读取磁盘上的配置文件来初始化,这就需要建立两个构造函数,它们的名字是相同的,于是就牵出了方法重载的要求。
如:
class Plant{
int height=0;
Plant(){
    System.out.println("Plant a seed.");
    height=0;
}
Plant(int i){
    System.out.println("Plant a tree that's "+i+" feet tall.");
    height=i;
}
void detail(){
    System.out.println("The tree is "+height+" feet tall.");
}
void detail(String s){
    System.out.println(s+": The tree is "+height+" feet tall.");
}
}

class OverloadingTest{
public static void main(String[] args){
    new Plant();
    for(int i=0;i<3;i++){
     Plant tree=new Plant(i);
     tree.detail();
     tree.detail("Overloaded method");
    }
}
}
区分重载的方法:如果出现多个重载,那么Java将以不同的参数类型列表来区分不同的重载。
如:void Plant(String s , int i)与void Plant(int i , String s)就是不同的重载。
不能使用返回值判断重载
      可以想像如果根据不同的返回值来判断不同的重载也许可行,但是如果调用方法不是为了获得其返回值,而是为了得到其“副作用”,那么根据返回值类型来判断重载就会遇到麻烦。
      即如果你这样定义一个重载:
void f() {}
int f() {}
在关心返回值的情况下,使用int x = f()可以正确调用下面那个方法,但是如果不关心返回值,直接使用 f() 的话编译器就无法正确判断你究竟想调用哪个方法。



重写:
父类与子类之间的多态性,对父类的函数进行重新定义。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。在Java中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖。
重写注意点:
1、必须是子类继承父类,在子类中重写父类的方法
2、方法名、返回值类型、参数个数、参数类型都必须相同,抛出异常的允许情况也必须相同,一句话,只有方法里面的功能语句可以不同。
3.、子类重写父类的方法的访问修饰符不能低于父类。
回复 使用道具 举报
方法重载(overloading):权限修饰符无关、返回值类型无关、方法名相同、参数不同(类型不同或个数不同)
方法重写(overriding):权限修饰符相同或更大、返回值类型相同或子类、方法名相同、参数相同
如果几个Overloaded的方法的参数列表不一样,它们的返回者类型当然也可以不一样。但如果两个方法的参数列表完全一样,是否可以让它们的返回值不同来实现重载Overload呢?
这是不行的,我们可以用反证法来说明这个问题,因为我们有时候调用一个方法时也可以不定义返回结果变量,即不要关心其返回结果。

例如,我们调用map.remove(key)方法时,虽然remove方法有返回值,但是我们通常都不会定义接收返回结果的变量,这时候假设该类中有两个名称和参数列表完全相同的方法,仅仅是返回类型不同,java就无法确定编程者倒底是想调用哪个方法了,因为它无法通过返回结果类型来判断。

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马