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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 时光-未央 初级黑马   /  2014-3-22 11:23  /  1511 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

刚开始学习JAVA,好多问题都很模糊,求各位大神们多多指教啊!
最近看到重载和重写了,他俩的区别大概知道但还不是很清楚。
比如:重载的返回值到底是有要求,需要要不一样么?
重写的返回值不一样可以么?

另外:

public void a(){
}
public  void a(int a, int b){
}
public void a(long a, long b){
}
public int a(int a,int b){
}

这些都算是重写么?

很迷茫啊,求大神们指导啊   谢谢!

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

12 个回复

倒序浏览
重写,是指在子类中对父类的某方法进行重新定义,其子类的该方法名以及参数位置和个数均与父类相同,重载是指函数名相同,但是参数个数和种类不同,如果函数名和参数位置和个数种类相同,那么即使函数返回值不同,程序也会认为是同一个函数。所以public  void a(int a, int b)和public int a(int a,int b)不能算是重写

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
重写方法出现在子类中,只有在发生继承关系的前提下,在能出现重写方法,而且重写的是父类的方法。一般情况下返回值类型不变,但也有能改变的情况,如下:
class Test1 {
public Object workO() {
  return new Object();
}
}

class Test2 extends Test1 {
public String workO() {
  return new String();
}
}

其中String是Object的子类型。

而重载方法出现在同一个类中,和继承没有关系,重载的是类自己的方法。重载的两个条件:一、方法名相同;二、参数类型或个数不同,跟返回值类型没有关系


1,2,3重载,4不能2出现在同一个类中。

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
重载就是函数名相同返回值相同,只是参数不同(参数个数不同,参数类型不同)
复写就是子类继承父类,子类重写父类的方法(前提是该父类的方法可以继承),重写要求函数名与返回值必须相同(其实就是把父类的方法说明部分抄下来,主题部分可以按照你的要求改动)

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
一、首先明确这两个概念:
函数重载,在一个类定义中,可以编写几个同名的方法,但是只要它们的签名参数列表不同,Java就会将它们看做唯一的方法。简单的说,一个类中的方法与另一个方法同名,但是参数表不同,这种方法称之为重载方法。
函数覆盖,当子类声明了与基类相同名字的方法,而且使用了相同的签名时,就称子类的成员函数覆盖基类的成员函数。也就是说子类的函数声明和父类一样,函数体不一样视之为覆盖。
二、例子
class DemoA{
public void method(int a){}//暂时称为方法1
public void method(int b,int c){}//方法2
}
class DemoB extends DemoA(){
public void method(int a){System.out.println(a);}//方法3
}
对照概念:1、方法1和方法2在同一类中,方法名相同但是参数列表不同,所以重载。
2、方法1和方法3分别在父类和子类中,同时方法3和方法1的声明完全相同,方法3又建立自己的函数体。所以方法3和方法1视为覆盖。
无论重载和覆盖它都不是表示某一具体的事物,它表达的是事物之间的关系,即函数之间的关系。

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 郭黎明 于 2014-3-22 13:32 编辑

重载:在一个类中,允许存在一个以上的同名函数,只要它们的参数个数或者参数类型不同即可。
特点:与返回值类型无关,只看参数列表。
重写:子类继承了父类,子类有了父类的方法,但子类虽具备该功能,但是功能的内容和父类不一致,          这时覆盖父类的功能,在子类执行中会实现子类特有的内容。
特点:子父类方法名要一模一样。
          静态只能覆盖静态。
         子类覆盖父类,子权限必须大于等于父类权限,否则编译失败。
public void a(){}// a
public  void a(int a, int b){}//b
public void a(long a, long b){} //c
public int a(int a,int b){}//d
a与bcd构成重载  b与ac构成重载 b与d参数类型与个数相同不构成重载属同一函数
c与abd构成重载  d与ac构成重载
     

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
Sage 中级黑马 2014-3-22 13:31:32
7#
方法(函数)重载:
1.方法名相同
2.参数列表中,参数类型、参数个数、参数(类型)顺序不同
3.与返回值类型无关

方法(函数)覆盖(也叫重写、复写):
1.针对子类继承父类而言
2.(子类)方法覆盖与(父类)被覆盖的方法,具有相同的方法名称、参数列表和返回值类型(子类返回值类型也可以是父类返回值类型的子类)
3.super.方法名();可以在子类中调用被覆盖的父类方法
4.“方法覆盖中,子类只能比父类强,不能比父类弱”,①子类方法不能使用比父类被重写方法更严格的访问权限(换言之,子类的修饰符权限>=父类的修饰符权限),②子类方法不能比父类抛出的异常多

public void a(){ //①原方法
}
public  void a(int a, int b){ //②重写,参数列表不同,
}
public void a(long a, long b){ //③重写,参数列表不同
}
public int a(int a,int b){ //④和①相比,重写;和②相比,未重写,与返回值类型无关;与③比,重写
}

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

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

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报
追逐 高级黑马 2014-3-22 15:40:40
9#
2.子父类中的函数。

当子类出现和父类一模一样的函数是,
当子类对象调用该函数。会运行子类函数的美容。
如同父类的函数被覆盖一样。

这种情况是函数的另一个特性:重写(覆盖);

当子类继承父类。沿袭了父类的功能,到子类中。
但是子类虽具备该功能,但是功能的内容却和父类中的不一致
这时,没有必要定义新功能,而是使用覆盖特性,保留父类的功能定义,并重写功能内容。

覆盖的注意事项:
1,子类覆盖父类,必须保证子类权限大于等于父类权限。否则编译失败。
2,静态只能覆盖静态。

大家记住了:
重载:只看函数的参数列表。 只要参数列表不一样。可以是不同类型的。其中相同的参数列表,只要有一个是类型不一样,就可以构成重载如:
void show(int a, int b){}
void show(double a, int b){} 就可以说是重载

重写:子父类要一模一样

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
你的函数都是重载,重写是针对继承中子类中的成员函数而言的,重写的函数将覆盖原函数,且重写的函数中的参数与被重写的参数相同
回复 使用道具 举报
重载:在一个类中是函数名相同参数不同(不同类型或者不同数量)才是重载,如果两个函数的名字还有参数都一样
      返回值不一样的话不算重载也不能再一个类中存在。
          重载与返回值类型没有关系
注意:重载只看参数类型
重写:是子类与父类出现一样的函数时,当子类对象调用该函数的时候,会运行子类的函数的内容,
          如同父类的函数被覆盖了一样
          1,覆盖时子类的的权限大于等于父类的权限,才可以覆盖,否则编译失败
          2,静态只能覆盖静态
注意:重写要一摸一样包括返回值类型

public void a(){
}
public  void a(int a, int b){
}
public void a(long a, long b){
}
public int a(int a,int b){
}
不算重写

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
重载是说方法名相同,但方法的参数个数、参数顺序、参数类型等等不同。根据不同的参数会调用相应的方法
重写是子类方法覆盖父类的方法叫重写

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 歌癫 于 2014-3-23 21:10 编辑

【重载】——就是函数名相同,但参数列表中的参数个数不同或参数的类型不同,则视为函数的重载。

public  void a(int a, int b){
}

public int a(int a,int b){
}
在一个类中,不能出现这样的两个函数,你一编译运行,java虚拟机就懵了

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

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