Java的三大特性之多态__渣渣的Java学习之路

多态

指把类中具有相似功能的不同方法使用同一个方法名来实现,从而可以使用相同的方式来调用这些具有不同功能的同名方法

多态的几种表现形式:
  • 方法重载与多态
  • 继承、重写与父类指向子类对象实现多态
  • 接口指向实现类对象
1.方法重载与多态

下面是一个例子,child给animal喂食

public class test {
    public static void main(String[] args) {
        Child child = new Child();
        Dog dog = new Dog();
        Cat cat = new Cat();
        Pig pig = new Pig();
        child.feed(cat);
        child.feed(dog);
        child.feed(pig);
    }

}
Child类
public class Child {

    /**
     * 对于feed,必然要面对不同的animal,当传入的对象不同时必然不能用同一个方法,因此利用重载使得不同的对象都可以传入
     * 当然此处也可以去掉animal类,不使用继承与重写,直接使用dog,pig,cat三个类的对象
     */
     //对feed进行重载,可以传入不同动物的对象
    public void feed(Dog dog){
        dog.eat();
    }
    public void feed(Cat cat){
        cat.eat();
    }
    public void feed(Pig pig){
        pig.eat();
    }
}
Animal父类
public class Animal {
    public void eat(){
        System.out.println("Animal eat...");
    }

}
Dog,Pig,Cat类继承Animal类并重写eat方法
public class Dog extends  Animal{
    @Override//强制检索是否重写
    public void eat(){//对父类方法的重写
        System.out.println("Dog eat...");
    }

}
public class Pig extends Animal {
    @Override//强制检索是否重写
    public void eat(){//对父类方法的重写
        System.out.println("Pig eat...");
    }

}
public class Cat extends Animal{
    @Override//强制检索是否重写
    public void eat(){//对父类方法的重写
        System.out.println("Cat eat...");
    }

}

这个小例子中通过重载实现了多态。

2.继承、重写与父类指向子类对象实现多态


事实上在上面的小例子中Child可以通过父类指向子类对象的方式达到不用方法重载。只需把Child类做一点小修改。


public class Child {
    /**
     * 将父类的对象作为了方法的参数,因此animal的所有子类的对象全部都可以传入
     * 又因为子类都对feed方法进行了重写,所以调用的时候优先使用子类。
     * 这样没有过多的重载
     */
    public void feed(Animal animal){
        animal.feed();
    }

}

修改后
Test.java文件

    public class Test {
        public static void main(String[] args) {
            Child child = new Child();
            Dog dog = new Dog();
            Cat cat = new Cat();
            Pig pig = new Pig();
            child.feed(cat);
            child.feed(dog);
            child.feed(pig);
        }

    }

Child.java文件


Child.java文件
public class Child {
    public void feed(Animal animal){
        animal.feed();
    }
}
public class Animal {
    public void feed(){
        System.out.println("Animal eat...");
    }
}
public class Dog extends Animal{
    @Override
    public void feed(){
        System.out.println("Dog eat...");
    }

}
public class Cat extends Animal{
    @Override
    public void feed(){
        System.out.println("Cat eat...");
    }

}
public class Pig extends Animal{
    @Override
    public void feed(){
        System.out.println("Pig eat...");
    }

}


父类指向子类对象达到多态的小结

父类指向子类对象的,那么只能使用父类中定义好的方法而不能使用子类特有的方法
父类指向子类对象的,若果重写了父类的方法就调用子类重写的方法而不会调用父类的
当父类作为方法的参数时那么就能能传入所有子类对象(就象上面Child类的feed方法)
当一个方法的返回对象是父类时,那么久能返回所有子类对象

将上面的Test类和Child类修改,就达到上面的第四条:

    public class Test {
        public static void main(String[] args) {
            Child child = new Child();
            Dog dog = new Dog();
            Cat cat = new Cat();
            Pig pig = new Pig();
            child.feed(cat);
            child.feed(dog);
            child.feed(pig);
            child.feed2(cat).feed();
            child.feed2(dog).feed();
            child.feed2(pig).feed();
        }

    }
public class Child {
    /**
     * 将父类的对象作为了方法的参数,因此animal的所有子类的对象全部都可以传入
     * 又因为子类都对feed方法进行了重写,所以调用的时候优先使用子类。
     * 这样没有过多的重载,减少了代码量
     */
    public void feed(Animal animal){
        animal.feed();
    }

    public Animal feed2(Animal animal){//新加入的Animal返回类型方法

        return animal;
    }

}

3.接口指向实现类对象
public class Test {

    public static void main(String[] args) {
        Test test = new Test();
        USB U1 = new Car();
        USB U2 = new Mp3();
        USB U3 = new Game();
        U1.run();
        U2.end();
        U3.run();

    }

}

一个USB接口

public interface USB {
    public void run();
    public void end();
}

对接口进行实现的MP3,Car,Game类

ublic class Mp3 implements USB{
    public void run(){
        System.out.println("Play Music");
    }
    public void end(){
        System.out.println("Stop Music");
    }

}
public class Car implements USB{
    public void run(){
        System.out.println("car is starting!");
    }
    public void end(){
        System.out.println("Car is stop!");
    }

}
public class Game implements USB{
    public void run(){
        System.out.println("play game");
    }
    public void end(){
        System.out.println("stop game");
    }

}

在这个小例子中通过利用接口的一个特性(一个接口可以有多个实现),实现了多态


这些就是今天学长讲完多态后,我的一点小总结,有理解错误的地方烦请帮忙指正一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值