【java】方法覆盖、方法重载和多态

1、方法覆盖(override)

即方法重写,对父类的方法进行重写,要求子类和父类的方法名和入参个数和类型必须一致。

public class Parent{
	public void test(){
		System.out.println("这是父类方法")
	}
}
public class Children extends Parent{
	public void test(){
		System.out.println("这是子类方法")
	}
}

2、方法重载(overload)

一个类中可以存在多个重名的方法,但是要求方法的入参个数和类型都要不同。

public void test(String str);
public void test(int i);

有了方法覆盖和方法重载的概念之后,接下来就需要详细说明一下多态。

3、多态(动态绑定)

简单说来就是父类引用指向子类对象,调用方法时会调用子类的实现,而不是父类的实现,这叫多态。

多态与继承体系有关,与方法覆盖有关,与方法重载无关。

3.1、接下来我们通过实例来验证一下多态

class Animal {
    private String name;

    Animal(String name) {
        this.name = name;
    }

    public void enjoy() {
        System.out.println("动物的叫声……");
    }
}

class Cat extends Animal {
    private String eyesColor;

    Cat(String n, String c) {
        super(n);
        eyesColor = c;
    }

    public void enjoy() {
        System.out.println("我养的猫高兴地叫了一声……");
    }
}

class Dog extends Animal {
    private String furColor;

    Dog(String n, String c) {
        super(n);
        furColor = c;
    }

    public void enjoy() {
        System.out.println("我养的狗高兴地叫了一声……");
    }
}

class Bird extends Animal {
    Bird() {
        super("bird");
    }

    public void enjoy() {
        System.out.println("我养的鸟高兴地叫了一声……");
    }
}

/*定义一个类Lady(女士)*/
class Lady {
    private String name;
    private Animal pet;

    Lady(String name, Animal pet) {
        this.name = name;
        this.pet = pet;// 调用是父类Animal,执行时自动根据子类引用子类接口
    }

    public void myPetEnjoy() {
        pet.enjoy();// 这里就不单纯是调用Animal的enjoy,除非这个类没有改写,否则都会调用各个子类的enjoy方法
    }
}

public class TestPolymoph {
    public static void main(String args[]) {
        Cat c = new Cat("Catname", "blue");
        Dog d = new Dog("Dogname", "black");
        Bird b = new Bird();
        // 执行期间判断所引用对象的实际类型, 根据其实际的类型调用其相应的方法.
        Lady l1 = new Lady("l1", c);//猫
        Lady l2 = new Lady("l2", d);//狗
        Lady l3 = new Lady("l3", b);//鸟
        l1.myPetEnjoy();
        l2.myPetEnjoy();
        l3.myPetEnjoy();
        // 下面自己添加的,多态的好处,可以体会一下,扩展性变得更好。
        list.add(c);
        list.add(d);
        list.add(b);
    }
}

运行结果:

我养的猫高兴地叫了一声……

我养的狗高兴地叫了一声……

我养的鸟高兴地叫了一声……

3.2、多态的使用场景

多态的存在有三个必要的条件:

(1)要有继承(两个类之间存在继承关系,子类继承父类)

(2)要有重写(在子类里面重写从父类继承下来的方法)

(3)父类引用指向子类对象

3.3、多态的好处和弊端

弊端:

不能使用子类的特有功能。

我就想使用子类的特有功能?行不行?

行。怎么用呢?

A:创建子类对象调用方法即可。(可以,但是很多时候不合理。而且,太占内存了)

B:把父类的引用强制转换为子类的引用。(向下转型)

好处:

A:提高了代码的维护性(继承保证)

B:提高了代码的扩展性(由多态保证)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值