重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。
每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。
最常用的地方就是构造器的重载。
意义:
1、输入不同,输出相同的时候,一般可能会用到重载
2、输入不同又分很多种情况。。。略过
3、简单的说,就是给你不同的条件,需要你完成同一个任务的时候,可能会用到重载
4、给你飞机,你就坐飞机,给你汽车,你就开汽车,啥都没有,你就走着,最终你都能回家
5、有时候参数个数不一样,是参数少的有了默认值。
6、你坐飞机,不给你头等舱机票,你就默认坐经济舱
7、你说的if else是另一个问题,处理逻辑必不可少。
8、但是重载一般是在知道条件的时候,给你一个选择权利,可以去选择最优的方式方法。
9、你有头等舱机#票,你还是要做经济舱。。。当然啥票,都没有,你就走着吧。
10、重载的方法,本来就是另一个方法
总结:
句话是:“重载比if...else要优雅,减少了if...else部分的代码”
import java.io.*;
public class Main {
public static void main(String []args){
System.out.println(add(1,3)); //传两个参
System.out.println(add(1,2,3));//传三个参
System.out.println(add(1.2,3.4));//传两个double型参数
System.out.println(add(1,3)); //传两个double型参数,,顺序不同
}
public static int add(int x, inty){
return x+y;
}
public static int add(int x,inty,int z){
return x+y+z;
}
public static double add(doublex,double y){
return x+y;
}
public static double add(doubley,double x){
return y*x;
}
}
如上所述
方法重载 在同一个类中,方法名相同,参数类型或参数个数 或顺序不同
重写
重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!
重写的好处在于子类可以根据需要,定义特定于自己的行为。也就是说子类能够根据需要实现父类的方法。
重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。例如:父类的一个方法申明了一个检查异常 IOException,但是在重写这个方法的时候不能抛出 Exception 异常,因为 Exception 是 IOException 的父类,只能抛出 IOException 的子类异常。
· 重写规则
· 参数列表必须完全与被重写方法的相同;
· 返回类型必须完全与被重写方法的返回类型相同;
· 访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为public,那么在子类中重写该方法就不能声明为protected。
· 父类的成员方法只能被它的子类重写。
· 声明为final的方法不能被重写。
· 声明为static的方法不能被重写,但是能够被再次声明。
· 子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为private和final的方法。
· 子类和父类不在同一个包中,那么子类只能够重写父类的声明为public和protected的非final方法。
· 重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。
· 构造方法不能被重写。
· 如果不能继承一个方法,则不能重写这个方法。
总结:重写是子类对父类方法的重新定义,
当需要在子类中调用父类的被重写方法时,要使用super关键字。
This 用于调用当前类的方法,写在首行。
重写案例:
import java.util.*;
public class HelloWorld {
public static void main(String[] args) {
/*
Collection c = new HashSet();
c.add("hello");
c.add(newName("f1","l1"));
c.add(new Integer(100));
c.remove("hello");
c.remove(new Integer(100));
System.out.println(c.remove(newName("f1","l1")));
*/
Name n1 = new Name("01");
Name n2 = new Name("01");
Collection c = new HashSet();
c.add(n1);
System.out.println("------------");
c.add(n2);
System.out.println("------------");
System.out.println(n1.equals(n2));
System.out.println("------------");
System.out.println(n1.hashCode());
System.out.println(n2.hashCode());
System.out.println(c);
}
}
class Name {
private String id;
public Name(String id) {
this.id = id;
}
public String toString(){
return this.id;
}
public boolean equals(Object obj) {
if (obj instanceof Name) {
Name name = (Name) obj;
System.out.println("equal"+ name.id);
return (id.equals(name.id));
}
return super.equals(obj);
}
public int hashCode() {
Name name = (Name) this;
System.out.println("Hash" +name.id);
return id.hashCode();
}
}
全部内容总结
重写与重载的区别
举个栗子:举起一块巨大石头:重载的做法就是叫几个人和你一起搬,增加对象。
重写的做法就是注射药剂增强对象的力量,使其能够搬起巨石。