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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 你懂得 中级黑马   /  2013-9-22 23:24  /  994 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨增坤 于 2013-9-23 17:03 编辑

函数重写和重载的区别?

评分

参与人数 1技术分 +1 收起 理由
黄兴旺 + 1

查看全部评分

5 个回复

倒序浏览
函数重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。
调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法
函数重写,就是重写父类的方法,若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。

评分

参与人数 1技术分 +1 收起 理由
黄兴旺 + 1

查看全部评分

回复 使用道具 举报
重写和重载的区别?
                        重载:在同一类中。方法名相同,参数列表不同。重载可以改变返回类型。
                        重写:在不同类中(子父类中)。
                              方法声明相同(返回类型,方法名,参数列表均相同)。
                重写需要注意:
                        **子类方法的访问权限要大于等于父类方法的访问权限。
                        **静态只能重写静态。但是这种情况一般不会出现。

评分

参与人数 1技术分 +1 收起 理由
黄兴旺 + 1

查看全部评分

回复 使用道具 举报
重写只发生在继承关系中,描述的是子类实例方法与父类实例方法的关系,指子类对父类中已有的实例方法进行重新定义。
    重写方法必须和被重写方法具有相同的方法名称、参数列表和返回值类型。
       子类的方法返回值类型可以是父类方法返回值类型的子类。
    如果在子类中想调用父类中的那个被重写的方法,我们可以用super.方法的格式。
       如果直接调用方法,是在当前子类中先查找,如果子类有会调用子类的。使用super形式只在父类中查找,子类有没有都不调用。
    重写方法时,不能使用比父类中被重写的方法更严格的访问权限。
       因为有可能将子类对象当做父类对象来使用,那么能获取到的父类对象中的方法在子类中必须都能获取到。
    重写方法时,不能比父类抛出更多的异常。
       子类只能比父类强,不能比父类弱。
     重载(Overload)和重写(Override)的区别:
     重载是方法名相同,参数列表不同,和返回值类型无关。
     重写是方法名、参数列表、返回值类型全相同。

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

回复 使用道具 举报
重载:在同一类中,主要就是看函数的参数列表,连列表的顺序也可以比较。返回值类型可以不相同。
重写:在子父 类中,函数一模一样,包括函数列表。并且要保证子类的权限要大于父类的权限才可以重写。
回复 使用道具 举报
JAVA - 函数重载和重写

1. 函数重载(OverLoding)

概念:同名函数具有不同的参数列表。



作用:实现单个类内部的多态性,是静态多态。



注意点:

(1) 参数类型、个数、顺序至少有一个不相同。

(2) 不能通过访问权限、返回类型、抛出的异常进行重载。



2. 函数重写(OverRideing)

概念:在子类中定义某个方法与其父类有相同的名称和参数;子类对象引用或者子类对象的父类引用使用这个方法时,将调用子类中的定义。



作用:在继承中实现多态性,是父类与子类之间多态性的表现。



注意点:

(1) 方法名、参数、返回值必须相同。

(2) 子类方法不能缩小父类方法的访问权限。

(3) 子类方法不能抛出比父类更多的异常(子类可以不抛出异常)。

(4) 被定义为final的方法不能被重写。



3. 判断对象引用能否调用一个方法的原则

(1) 向上转型:子类转型成父类型。



(2) 子类对象引用:方法存在子类定义中则可以调用,否则不可以调用。



(3) 父类对象引用:方法存在父类定义中则可以调用,调用结果根据多态性原则;否则不可以调用。






// Animal类

public class Animal {

public void introduce(){

System.out.println("I am an animal!");

}

}  



// Cat类

public class Cat extends Animal {

//重写了父类的introduce,实现了overriding

public void introduce(){

System.out.println("I am a cat!");

}

//实现了Overloading

public void introduce(String name){

System.out.println("I am a cat, My name is : " + name);

}

}



// Dog类

public class Dog extends Animal {

//重写了父类的introduce,实现了overriding

public void introduce(){

System.out.println("I am a dog!");

}



//实现了Overloading

public void introduce(String name){

System.out.println("I am a dog, My name is : " + name);

}

}



// 测试类

public class Test {

    public static void main(String[] args) {

//Overriding是父类与子类之间多态性的一个表现

Animal animal1 = new Animal();

Animal animal2 = new Cat();

Animal animal3 = new Dog();

animal1.introduce();

animal2.introduce();

animal3.introduce();

// animal2.introduce("JACK");  是错误的用法

// animal3.introduce("JACK");  是错误的用法

//Overloading是在一个类中多态性的体现

Cat cat = new Cat();

cat.introduce();

cat.introduce("JACK");

}

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

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