java学习随笔---多态

概念:对象同时拥有多种形态;

1.多态的格式和使用

  • 代码当中体现多态性其实就是一句话:父类引用指向子类对象
  • 格式:父类名称 对象名称 = new 子类名称();
    -或者:接口名称 对象名 = new 实现类名称();

2.多态中成员变量和成员方法的访问特点

  • 对于成员变量来说,如果父类和子类同时有相同名称的成员变量,会优先使用父类中的成员变量
    如果父类和子类中都有特有的成员变量,那么多态可以调用父类中的成员变量而不能调用子类中的成员变量。
  • 对于成员方法来说,如果父类和子类中的成员方法名称一样,通过多态调用会优先使用子类中的成员方法
    如果父类和子类中都有特有的成员方法,那么多态可以调用父类中的成员方法而不能调用子类中的成员方法,即在编译看左边的时候已经错了,因为左边父类中没有Zi方法
  1. 上面这些规则总结了一个口诀:
    对于成员变量来说:编译看左边,运行看左边
    对于成员方法来说:编译看左边,运行看右边
  2. 左边右边就是多态等号的左边右边,编译的意思就是没有运行之前会不会报错,运行就是运行结束后会根据哪边显示
  3. 先拿子类和父类当中都有的相同的成员变量名和相同的成员方法名来举例。
    对于num这个成员变量,子类父类中都有,通过口诀,编译看左边,左边是父类,父类中有num,所以不会报错,运行也看左边,所以优先显示父类中的num;
    对于method这个成员方法,也是子类和父类中都有,编译看左边,父类中有method,所以不会报错,运行看右边,所以会优先显示右边子类中的成员方法。
//父类
public class Fu {
    int num = 10;
    public void method(){
        System.out.println("父类中的覆盖重写方法");
    }

    public void methodFu(){
        System.out.println("父类中的特有方法");
    }
}


//子类
public class Zi extends Fu{

    int num = 20;
    public void methodZi(){
        System.out.println("子类中的特有方法");
    }

    public void method(){
        System.out.println("子类中的覆盖重写方法");
    }
}

//主类
public class Demo {

    public static void main(String[] args) {
        Fu obj = new Zi();
        obj.method();
        obj.methodFu();
        //obj.methodZi();错误写法

        System.out.println(obj.num);//会输出父类中的成员变量
    }
}

3.对象的向上和向下转型

//animal类
public abstract class animal {
    public abstract void eat();//抽象方法
}


//cat类
public class cat extends animal{
    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }

    public void catchmouse(){
        System.out.println("猫捉老鼠");
    }
}

//主类
public class demo {

    public static void main(String[] args) {
        animal one = new cat();//向上转型,把猫转化为动物的吃
        one.eat();
        cat c = (cat) one;//向下转型,把对象动物转化成猫
     	//dog d =(dog) one;错误写法,不能将猫转化成狗
        c.catchmouse();
    }
}

4.如何才能知道一个父类引用的对象到底是什么子类?

用instanceof关键字进行类型判断。
格式:对象 instanceof 类名称
这将会得到一个布尔值

//animal类
public abstract class animal {
    public abstract void eat();//抽象方法
}


//cat类
public class cat extends animal{
    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }

    public void catchmouse(){
        System.out.println("猫捉老鼠");
    }
}

//dog类
public class dog extends animal{
    @Override
    public void eat() {
        System.out.println("狗吃shit");
    }

}

//主类
public class demo {

    public static void main(String[] args) {
        animal one = new cat();//向上转型,把猫转化为动物的吃
        if (one instanceof cat) {
            cat c = (cat) one;
            c.catchmouse();
        }
        if (one instanceof dog){
            dog d = (dog) one;
            d.eat();
        }
        //运行结果:猫捉老鼠
    }
}

笔记本案例(多态和接口的综合应用)

//接口
public interface USB {

    public abstract void open();//打开设备

    public abstract void close();//关闭设备
}

//电脑类
public class Compurter {

    public void powerOn() {
        System.out.println("笔记本开机");
    }

    public void powerOff() {
        System.out.println("笔记本关机");
    }

    //使用usb设备的方法,接口作为参数
    public void useDevice(USB usb) {
        usb.open();
        usb.close();
        //想要使用Mouse类和Keyboard类中特有的方法,必须进行向下转型
        if (usb instanceof Mouse) {
            Mouse mouse = (Mouse) usb;
            mouse.click();
        } else if (usb instanceof Keyboard) {
            Keyboard keyboard = (Keyboard) usb;
            keyboard.type();
        }
    }
}


//鼠标类
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("鼠标点击");
    }
}


//键盘类
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("键盘输入");
    }
}


//主类
public class DemoMain {

    public static void main(String[] args) {
        Compurter compurter = new Compurter();
        compurter.powerOn();

        //先给电脑提供一个鼠标
//        Mouse mouse = new Mouse();方法一
//        USB usbMouse = mouse;
        USB usbMouse = new Mouse();//方法二

        compurter.useDevice(usbMouse);//通过电脑的接口打开鼠标


        //给电脑提供一个键盘
        Keyboard keyboard = new Keyboard();
        //也可以不用向上转型,直接将键盘的实现类放进去,实现类和接口的关系就
        //相当于int 和 double 的关系
        compurter.useDevice(keyboard);


        compurter.powerOff();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值