14:多态

1;面向对象的三大特征

:封装性,继承性,多态性
extends继承或者implements 实现,是多态性的前提。
在这里插入图片描述
Fu类

public class Fu {
    public void method(){
        System.out.println("父类方法");
    }
    public void methodFU(){
        System.out.println("父类方法");
    }
}

ZI类

public class Zi  extends Fu{
    @Override
    public void method(){
        System.out.println("子类方法");
    }
}

主类:

/*
代码当中体现多态性,其实就是:父类引用指向子类对象。
格式:
父类名称 对象名 =new 子类名称();
或者:
接口名称 对象名 = new 实现类名称();
*/
public class Demo01Multi {
    public static void main(String[] args) {
        //使用多态的写法 父类引用指向子类对象
        Fu obj =new Zi();
        obj.method();
        obj.methodFU();
    }
}

在这里插入图片描述

2:多态中成员变量

Fu类

public class Fu {
  int num = 10;
  public void showNum(){
      System.out.println(num);
    }
}

Zi类

public class Zi  extends Fu{
    int num =20;
    int age =16;
}

主类:

/*
访问成员变量的两种方式:
1.直接通过对象名称访问成员变量:等号左边是谁,优先用谁,没有则向上找。
2:直接通过成员方法访问,看该方法属于谁,优先用谁,没有向上找。
*/
public class Demo01Multi {
    public static void main(String[] args) {
        //使用多态的写法 父类引用指向子类对象
        Fu obj =new Zi();
        System.out.println(obj.num);
        //System.out.println(obj.age);错误写法
        System.out.println("==================");
        obj.showNum();//子类没有覆盖重写,就是:10;
        //子类如果覆盖重写,就是子:20
    }
} 

3:多态中成员方法

Fu类

public class Fu {
  int num = 10;
  public void showNum(){
      System.out.println(num);
    }
    public void method(){
        System.out.println("父类方法");
    }
    public void methodFu(){
        System.out.println("父类特有方法");
    }
}

Zi类

public class Zi  extends Fu{
    int num =20;
    int age =16;
    @Override
    public void showNum(){
        System.out.println(num);
    }
    @Override
    public void method(){
        System.out.println("子类方法");
    }
    public void methodZ(){
        System.out.println("子类特有方法");
    }
}

主类:

/*
在多态的代码中,成员方法的访问规则是:
  看new的是谁,就优先用谁,没有向上找。
  口诀:编译看左边,运行看右边。
  
  对比一下:
  成员变量:编译看左边,运行看左边。
  成员方法:编译看左边,运行看右边。
*/
public class Demo02Multi {
    public static void main(String[] args) {
        Fu obj = new Zi();//多态
        obj.method();//父子都有,优先用子
        obj.methodFu();//子类没有,父类有,向上找父类
        //编译看左边,左边是Fu,Fu当中没有methodZi方法,所以编译报错。
        //obj.methodZi();
    }
}

4:多态的好处:

在这里插入图片描述

5:对象的向转型

在这里插入图片描述
Animal类

package cn.itcast;
public abstract class Animal {
    public abstract void  eat();
}

Cat类

package cn.itcast;
public class Cat extends  Animal{
    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }
}

主类:

package cn.itcast;
public class Dem01Main {
    public static void main(String[] args) {
        //对象的向上转型,就是,父类引用指向子类对象。
        Animal animal = new Cat();
        animal.eat();;
    }
}

6:对象的向下转型:

在这里插入图片描述

7:instanceof关键字

Animal类

package cn.itcast;

public abstract class Animal {
    public abstract void  eat();
}

Cat类

package cn.itcast;

public class Cat extends  Animal{

    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }

    public void eatMouse(){
        System.out.println("吃老鼠");
    }
}

主类

package cn.itcast;
/*
如何才能知道一个父类引用的对象,未来是什么子类?
格式:
对象 instanceof 类名称
这将会得到了一个boolean值结果,也就是判断前面的对象不能当作后面的实例
*/
public class Demo02Instanceof {
    public static void main(String[] args) {
        Animal animal = new Cat();//本来是2一只猫
        animal.eat();;//猫吃鱼

        //如果希望调用子类特用方法,需要向下转型
        //判断一下父类引用animal本身是不是Cat
        if (animal instanceof Cat){
            Cat cat = (Cat) animal;
            cat.eatMouse();
        }

    }
}

8:笔记本案例分析

进行描述笔记本类,实现笔记本使用USB鼠标,USB键盘
.USB接口 :包含打开设备功能,关闭设备gonn。
.笔记本:包含开机功能,关机功能,使用USB设备功能
.键盘类:要实现USB接口,并具备敲击的方法
.鼠标类:要实现USB接口,具备点击的方法

在这里插入图片描述
USB类

package cn.itcast.day10.Demo0;

public interface USB {
    public abstract void open();//打开设备
    public abstract void close();//关闭设备
}

Mouse类

package cn.itcast.day10.Demo0;
//鼠标就是一个USB设备
public class Mouse implements USB {

    @Override
    public void open() {
        System.out.println("打开鼠标");
    }

    @Override
    public void close() {
        System.out.println("关闭鼠标");
    }
    public void click(){
        System.out.println("鼠标点击");
    }
}

Keyboard类

package cn.itcast.day10.Demo0;

public class Keyboard implements  USB{

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

    @Override
    public void close() {
        System.out.println("关闭键盘");
    }
    public void type(){
        System.out.println("键盘输入");
    }
}

Computer类

package cn.itcast.day10.Demo0;

import javax.jws.soap.SOAPBinding;

public class Computer {
    public void powerOn(){
        System.out.println("笔记本电脑开机");
    }
    public void powerOff(){
        System.out.println("笔记本电脑关机");
    }
    //使用USB设备的方法,使用接口作为方法的参数
    public void useDevice(USB usb){
        usb.open();//打开设备
        if(usb instanceof Mouse){//一定要先判断
            Mouse mouse = (Mouse) usb;//向下转型
            mouse.click();
        }else if (usb instanceof Keyboard){
            Keyboard keyboard =(Keyboard)usb;
            keyboard.type();
        }
    }
}

主类

package cn.itcast.day10.Demo0;

import java.awt.event.KeyEvent;

public class DemoMain {
    public static void main(String[] args) {
        //首先创建一个笔记本电脑
        Computer computer = new Computer();
        computer.powerOn();
        //准备一个鼠标,供电脑使用
       // Mouse mouse = new Mouse();
        //首先向上转型
        USB usbMouse  = new Mouse();
        //参数是USB类型,我正好传递进去的是USB鼠标;
        computer.useDevice(usbMouse);
        //创建一个USB键盘
        Keyboard keyboard =new Keyboard();//没有使用多态写法
        //方法参数是USB类型,传递进去的是实现类dui'x
        computer.useDevice(keyboard);//正确方法,向上转型
        computer.powerOff();

    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值