Java基础之多态


这里是一段防爬虫文本,请读者忽略。
本文原创首发于CSDN,作者IDYS
博客首页:https://blog.csdn.net/weixin_41633902/
本文链接:https://blog.csdn.net/weixin_41633902/article/details/115741531
未经授权,禁止转载!恶意转载,后果自负!尊重原创,远离剽窃!

多态

多态的格式与使用

  • 代码当中体现多态性,其实就一句话,父类引用子类对象

  • 格式

父类名称 对象名 = new 子类名称();

或者
    
接口名称 对象名 = new 实现类名称();

演示

  • 其他类
package com.idayuanshuai.www.Demo1;

public class FatherDemo {
    public void method(){
        System.out.println("这是父类方法");
    }
    public void methodFa(){
        System.out.println("这是父类特有的方法");
    }
}

package com.idayuanshuai.www.Demo1;

public class SonDemo extends FatherDemo{
    @Override
    public void method() {
        System.out.println("这是子类的方法");
    }
}

  • 主类
package com.idayuanshuai.www.Demo1;

public class TestDemo {
    public static void main(String[] args) {
        FatherDemo son = new SonDemo();
        son.method();
        son.methodFa();
    }
}

  • 结果输出
这是子类的方法
这是父类特有的方法

多态当中成员变量的使用特点

  • 访问成员变量的两种方式
  1. 直接通过对象名称访问成员变量,看等号左边是谁,就优先用谁,没有则向上查找
  2. 间接通过成员方法访问成员变量,看该方法属于谁,就优先用谁,没有则向上查找

演示

  • 其他类
package com.idayuanshuai.www.Demo2;

public class FatherDemo1 {
    int num = 10;
    int age = 100;
    public int showAge(){
        System.out.println(this.age);
        return this.age;
    }
    public int showNum(){
        System.out.println(this.num);
        return this.num;
    }
}


package com.idayuanshuai.www.Demo2;

public class SonDemo1 extends FatherDemo1{
    int num = 20;
    int age = 200;

    @Override
    public int showNum() {
        System.out.println(this.num);
        return this.num;
    }
}

  • 主类
package com.idayuanshuai.www.Demo2;

public class ClassMutiFileid {
    public static void main(String[] args) {
        FatherDemo1 f = new SonDemo1();
        System.out.println(f.num);
        f.showAge();
        f.showNum();
    }
}

  • 输出结果
10
100
20

成员方法使用特点

  • 在多态的代码当中,成员方法的访问规则是:

    • new的是谁,就优先用谁,没有则向下找
    • 口诀:编译看左边,运行看右边
  • 对比之下:成员变量的访问规则为

    • 编译看左边,运行看左边

演示

  • 其他类
package com.idayuanshuai.www.Demo3;

public class FatherDemo1 {
    public void methodFa(){
        System.out.println("这是父类的方法");
    }
    public void methodCommon(){
        System.out.println("这是相同的方法");
    }
}

package com.idayuanshuai.www.Demo3;

public class SonDemo extends FatherDemo1 {
    @Override
    public void methodCommon() {
        System.out.println("这是子类自己的相同方法");
    }
    public void methodSon(){
        System.out.println("这是子类特有的方法");
    }
}

  • 主类
package com.idayuanshuai.www.Demo3;

public class TestDemo {
    public static void main(String[] args) {
        FatherDemo1 fa = new SonDemo();
        // fa.methodSon() 这条语句如果编译的话,不会通过,因为父类没有methodSon()方法,只有子类采用这个方法。所以会报错
        fa.methodCommon();
        fa.methodFa();
    }
}
  • 输出结果
这是子类自己的相同方法
这是父类的方法

向上转型与向下转型

  1. 对象的向上转型,其实就是多态的写法
  • 格式:父类 对象名 = new 子类对象
  • 向上转型一定是安全的,正确的。

  1. 对象的向下转型,其实就是一个【还原】动作
  • 格式:子类对象 对象名 = (子类名称)父类对象

演示

  • 其他类
package com.idayuanshuai.www.Demo4;

public class Animal {
    public void eat(){
        System.out.println("动物吃东西");
    }
}

package com.idayuanshuai.www.Demo4;

public class Cat extends Animal{
    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }
    public void catchWoods(){
        System.out.println("爬树");
    }
}
  • 主类
package com.idayuanshuai.www.Demo4;

public class TestDemo {
    public static void main(String[] args) {
        Animal animal = new Cat();
        animal.eat();
        Cat cat = new Cat();
        cat.catchWoods();
        cat.eat();
    }
}
  • 输出结果
猫吃鱼
爬树
猫吃鱼

instanceof 关键字

  • instanceof关键字可以判断父类引用的对象,原来是什么子类

演示

  • 其他类
package com.idayuanshuai.www.Demo4;

public class Animal {
    public void eat(){
        System.out.println("动物吃东西");
    }
}

package com.idayuanshuai.www.Demo4;

public class Cat extends Animal{
    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }
    public void catchWoods(){
        System.out.println("猫爬树");
    }
}

package com.idayuanshuai.www.Demo4;

public class Dog extends Animal{
    @Override
    public void eat() {
        System.out.println("狗吃骨头");
    }
    public void run(){
        System.out.println("狗跑跑跑");
    }
}

package com.idayuanshuai.www.Demo4;

public class UsePlay {
    public static void play(Animal animal){
        if(animal instanceof Dog){
            Dog dog = new Dog();
            dog.run();
        }
        if (animal instanceof Cat){
            Cat cat = new Cat();
            cat.catchWoods();
        }
    }
}

  • 主类
package com.idayuanshuai.www.Demo4;

public class TestDemo {
    public static void main(String[] args) {
        Animal animal = new Cat();
        UsePlay.play(animal);
        Animal animal1 = new Dog();
        UsePlay.play(animal1);
    }
}

  • 输出结果
猫爬树
狗跑跑跑

例题

  • 有两个USB类型的设备:鼠标和键盘
  • 电脑只有一个USB接口
  • 要求使用一个方法完成对多个设备的操作,要求完成USB的插拔,和操作

提示:用到单例模式、同时还有多态思想


  • 接口
package com.idayuanshuai.www.Demo5;

public interface Device {
    public abstract void click();
    public abstract void off();
    public abstract void on();
}
  • 接口实现类
package com.idayuanshuai.www.Demo5;

public class Mouse implements Device {
    @Override
    public void click(){
        System.out.println("鼠标点击");
    }
    @Override
    public void on(){
        System.out.println("插入鼠标");
    }
    @Override
    public void off(){
        System.out.println("拔掉鼠标");
    }
}


package com.idayuanshuai.www.Demo5;

public class Keyboard implements Device {
    @Override
    public void click(){
        System.out.println("键盘敲击");
    }

    @Override
    public void off() {
        System.out.println("键盘打开");
    }

    @Override
    public void on() {
        System.out.println("键盘关闭");
    }
}
  • 操作实现类
package com.idayuanshuai.www.Demo5;

public class PlayDevice {
    private static int num = 0;
    private static int typeNum = 0;
    public static void clik(Device device){
        if( num == 1){
        if(device instanceof Mouse && typeNum == 0){
            Mouse mouse = new Mouse();
            mouse.click();
        }
        else if(device instanceof Keyboard && typeNum == 1){
            Keyboard keyboard =new Keyboard();
            keyboard.click();
        }
        else{
            System.out.println("您所选择的操作设备不符合要求");
        }
        }else{
            System.out.println("您所选择的设备未插入,请把设备插入后,再操作");
        }
    }
    public static void on(Device device){
        if(num == 0){
        if (device instanceof Mouse){
            Mouse mouse = new Mouse();
            mouse.on();
            num++;
            typeNum = 0;
        }
        if(device instanceof Keyboard){
            Keyboard keyboard = new Keyboard();
            keyboard.on();
            num++;
            typeNum = 1;
        }}else{
                System.out.println("USB 接口不足");
        }
    }
    public static void off(Device device){
        if ( num == 1) {
            if (device instanceof Mouse) {
                Mouse mouse = new Mouse();
                mouse.off();
                num--;
            }
            if (device instanceof Keyboard) {
                Keyboard keyboard = new Keyboard();
                keyboard.off();
                num--;
            }
        }else{
            System.out.println("usb 接口已经为空");
        }
    }
}

  • 主类
package com.idayuanshuai.www.Demo5;

public class PlayClass {
    public static void main(String[] args) {
        Device mouse = new Mouse();
        Device keyboard = new Keyboard();
        PlayDevice.on(mouse);
        PlayDevice.clik(keyboard);
        PlayDevice.clik(mouse);
        PlayDevice.on(keyboard);
        PlayDevice.on(mouse);
        PlayDevice.off(mouse);
        PlayDevice.on(keyboard);
        PlayDevice.on(mouse);
        PlayDevice.clik(mouse);
        PlayDevice.clik(keyboard);
        PlayDevice.off(keyboard);
    }
}
  • 输出结果
插入鼠标
您所选择的操作设备不符合要求
鼠标点击
USB 接口不足
USB 接口不足
拔掉鼠标
键盘打开
USB 接口不足
您所选择的操作设备不符合要求
键盘敲击
键盘关闭

写在最后的话:

  • 无论每个知识点的难易程度如何,我都会尽力将它描绘得足够细致
  • 欢迎关注我的CSDN博客,IDYS’BLOG
  • 持续更新内容
    linux基础 | 数据通信(路由交换,WLAN) | Python全栈 | 云计算
  • 如果你有什么疑问,或者是难题。欢迎评论或者私信我。你若留言,我必回复!
  • 虽然我现在还很渺小,但我会做好每一篇内容。谢谢关注!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值