Java 教程 在线

1386Java Override/Overload

重写和重载的区别,以红烧为例。

红烧是一种做菜方法,可用来被比作 java 的方法。食材可以被比作为参数。厨师师徒可被比作为父子类。

方法的继承可以看做红烧这个做菜方法厨师老师传给厨师徒弟。

同样的红烧鱼,厨师老师的红烧方法传给厨师徒弟后,厨师徒弟在红烧方法上做了改动,这是红烧方法的重写,就相当于 java 的方法重写。

重写代码类似如下:

class Ct{
    void hongshao(int a){
        System.out.println("这是厨师老师的红烧int的方法");
    }
}

class Cs extends Ct{
    void hongshao(int a) {
        System.out.println("这是厨师徒弟的红烧int的方法");
    }
}

我找厨师徒弟做菜,我说要红烧,我给他鱼他就做的是红烧鱼,我给他排骨他就做的是红烧排骨,我给他鱼和排骨他就做的是红烧鱼和排骨。食材的不同就相当于 java 方法的参数不同,这个是重载。

重载代码类似如下:

class Cs extends Ct{
    void hongshao(int a) {
        System.out.println("这是厨师徒弟的红烧int的方法");
    }
    void hongshao(float b) {
        System.out.println("这是厨师徒弟红烧float的方法");
    }
    void hongshao(int a,float b) {
        System.out.println("这是厨师徒弟红烧int和float的方法");
    }
}

1385Java Override/Overload

父类变量指向子类实例时可以使用强制类型转换访问父类没有的子类成员。

import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        People a=new People();
        People b=new Up(6);
        a.bark();
        b.bark();
        System.out.println(((Up)b).level); // 强制类型转换
    }
}

class People{
    public void bark(){
        System.out.println("Hello!");
    }
}

class Up extends People{
    public int level;
    public Up(int lv){
        level=lv;
    }

    public void bark(){
        System.out.println("鸽了鸽了,不播了");
    }
}

实例输出结果为:

Hello!
鸽了鸽了,不播了
6

1384Java Override/Overload

自定义的类重载比较函数的方法:

public class Match implements Comparable{
    public int compareTo(Object o) {
        Match tgt = (Match)o;  
        return ( this.len < tgt.len ? -1 : ( this.len == tgt.len ? 0 : 1));
    }
}

1383Java Override/Overload

关于重载函数参数列表变化的可能性:

/**
 * @author tangjia
 * @date 2017年10月29日 下午4:29:06
 * @version 1.0
 * @since jdk 1.8.0_65
 * 类说明:测试重载函数
 */
public class Main {

    public static void main(String[] args) {
        int age = 10;
        String name = "ii";
        handle(age);
        handle(name);
        handle(name,age);
                handle(age,name);
    }
    
    public static void handle(int age) {
        System.out.println(age);
    }
    
    public static void handle(String name) {
        System.out.println(name);
    }
    
    public static void handle(int age,String name) {
        System.out.println("the age of "+name+" is "+age);
    }
    
    public static void handle(String name, int age) {
        System.out.println("the age of "+name+" is "+age);
    }
}
  • 1.参数类型变化,如参数从int 转变为String 类型
  • 2.参数个数变化,如参数个数从一个转变为两个
  • 3.参数顺序变化,如从handle(int age, String name)转变为handle(String name,int age)
  • 4.函数返回值可变可不变

1382Java Override/Overload

重载与重写的简明理解:

  •  重载反映的是"随机应变". 同样一项功能, 根据数据类型的不同, 采用不同的处理方式. 比如, 同样是吃饭, 去高档餐厅吃西餐, 你会西装革履, 但是去吃火锅, 穿便装就比较合适.
  • 重写反映的是"父子差异". 你"继承"了父亲吃火锅的爱好, 但是吃同一份鸳鸯锅(注意, 数据类型相同) , 你喜欢涮红汤, 你父亲喜欢涮清汤.