多态 重写 重载

一.重载与重写

1.重载:指的是在同一个类里面,有几个方法,方法名是完全一样的,但是,参数类型或者参数个数不一样,这样会构成重载

  例子:

package com.hanqi.maya.model;

public class jisuanqi {
    public void add(String s ){
        System.out.println();
    }
    public void add(int a , int b){
        System.out.println(a + b);
    }
    public void add(double a , double b){
        System.out.println(a + b);
    }
    public void add(int a ,double b){
        System.out.println(a + b);
    }
}

2.重写:一般指的是在继承关系当中,一个类继承另一个类,子类中的成员方法跟父类中的成员方法方法名参数类型参数个数完全一样,我们就叫做子类的方法重写了父类的方法

将父类的方法重新定义
  --在子类中可以根据需要从父类中集成来的方法进行重写
  --重写方法必须和被重写的方法具有相同的方法名, 参数列表 参数类型和返回类型
  --重写方法不能使用比被重写方法更严格的访问权限

  例子a:

package com.hanqi.maya.model;

public class Animal {
    public void scream(){
        System.out.println("动物的叫声!");
    }
}
package com.hanqi.maya.model;

public class Tiger extends Animal {
    
}
package com.hanqi.maya.main;

import com.hanqi.maya.model.Tiger;

public class Text {
    public static void main(String[] args) {
        Tiger t = new Tiger();
        t.scream();
    }
}

例子b:

package com.hanqi.maya.model;

public class Animal {
    public void scream(){
        System.out.println("动物的叫声!");
    }
}
package com.hanqi.maya.model;

public class Tiger extends Animal {
    public void scream(){
        System.out.println("老虎哇哇的叫");
    }
}
package com.hanqi.maya.main;

import com.hanqi.maya.model.Tiger;

public class Text {
    public static void main(String[] args) {
        Tiger t = new Tiger();
        t.scream();
    }
}

例子3:toString方法的重写

package com.hanqi.maya.model;

public class Animal {
    public void scream(){
        System.out.println("动物的叫声!");
    }
}
package com.hanqi.maya.model;

public class Tiger extends Animal {
    
    private String name;
    private String sex;
    
    
    public Tiger(String name, String sex) {
        super();
        this.name = name;
        this.sex = sex;
    }

    public void scream(){
        System.out.println("老虎哇哇的叫");
    }

    
    //官方版的方法
    @Override
    public String toString() {
        return "Tiger [name=" + name + ", sex=" + sex + "]";
    }
    
    /*自己写的方法
     * public String toString(){
        String str = "name:" + name +",sex:" + sex;
        return str;
    }*/
    
    
}
package com.hanqi.maya.main;

import com.hanqi.maya.model.Tiger;

public class Text {
    public static void main(String[] args) {
        Tiger t = new Tiger("小小", "女");
        
        System.out.println(t.toString());
    }
    
}

例子4:equals方法的重写

public boolean equals(Object obj)

指示其他某个对象是否与此对象“相等”。

equals 方法在非空对象引用上实现相等关系:

  • 自反性:对于任何非空引用值 xx.equals(x) 都应返回 true
  • 对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true
  • 传递性:对于任何非空引用值 xy 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true
  • 一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。
  • 对于任何非空引用值 xx.equals(null) 都应返回 false

Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y当且仅当 x 和 y 引用同一个对象时,此方法才返回 truex == y 具有值 true)。

注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。

二.判断是否存在多态关系的三个条件:

  • 继承
  • 重写
  • 父类的引用指向子类的对象(父类只提供方法)

例子1:

package com.hanqi.maya.model;

public class Tools {
    public void chaidongxi(){
        System.out.println("没有功能");
    }
}
package com.hanqi.maya.model;

public class luosidao extends Tools {
    public void chaidongxi(){
        System.out.println("螺丝刀拧螺丝");
    }
}
package com.hanqi.maya.model;

public class Chanzi extends Tools {
    public void chaidongxi(){
        System.out.println("铲土...");
    }    
}
package com.hanqi.maya.text;

import com.hanqi.maya.model.Tools;

public class Main {
    public static void main(String[] args) {
        Tools t = new Tools();
        t.chaidongxi();
    }
}

package com.hanqi.maya.text;

import com.hanqi.maya.model.Tools;
import com.hanqi.maya.model.luosidao;

public class Main {
    public static void main(String[] args) {
        Tools t = new luosidao();
        t.chaidongxi();
    }
}

package com.hanqi.maya.text;

import com.hanqi.maya.model.Chanzi;
import com.hanqi.maya.model.Tools;

public class Main {
    public static void main(String[] args) {
        Tools t = new Chanzi();
        t.chaidongxi();
    }
}

例子2:

package com.hanqi.maya.model;

public class Ball {
    public double radius;
    public String pinpai;
    
    public Ball(){}
    
    public Ball(double radius, String pinpai){
        this.radius = radius;
        this.pinpai = pinpai;
    }
        
    public void fillAir(){
        System.out.println("用嘴吹");
    }
}
package com.hanqi.maya.model;

public class BasketBall extends Ball {
    
    public BasketBall(double radius, String Pinpai) {
        super(radius, Pinpai);
        
    }

    public void fillAir(){
        System.out.println("打气筒");
    }
}
package com.hanqi.maya.model;

public class FootBall extends Ball {
    
    public FootBall(double radius, String Pinpai) {
        super(radius, Pinpai);
        
    }

    @Override
    public void fillAir() {
        System.out.println("用气泵");
    }    
}
package com.hanqi.maya.model;

public class Main {
    public static void main(String[] args) {
        Ball ball = new Ball(30 , "阿迪达斯");
        Ball ball1 = new BasketBall(35 , "耐克");
        Ball ball2 = new FootBall(25 , "阿迪达斯");
        
        ball.fillAir();
        ball1.fillAir();
        ball2.fillAir();
    }
}

原文地址:https://www.cnblogs.com/sutao/p/7209759.html