【Example2】多态的介绍,抽象介绍、instanceof 用法简介

package com.tingle.j2se.basic;

/**
 * Created on 2020/4/20 17:54
 *
 * 多态的介绍,抽象介绍、instanceof 用法简介
 * @author Tingle
 */
public class Example2 {

    public static void main(String[] args) {
        create(new Cat());  // 以 Cat 对象调用 show 方法
        create(new Dog());  // 以 Dog 对象调用 show 方法

        Animal a = new Cat();   // 向上转型
        a.eat();                // 调用的是 Cat 的 eat
        Cat c = (Cat)a;         // 向下转型
        c.speak();              // 调用的是 Cat 的 work
    }

    public static void create(Animal animal){

        animal.eat();
        //判断是否属于Cat/Dog类型
        if(animal instanceof Cat){
            Cat cat = (Cat) animal;
            cat.speak();
        }else if (animal instanceof Dog){
            Dog dog = (Dog) animal;
            dog.speak();
            dog.work();
        }
    }
}


/**
 * 抽象类
 * 1、用abstract关键字来表达的类----其表达形式为:(public)abstract class 类名{}
 * 2、抽象类不能被实例化----也就是说我们没法直接new 一个抽象类。抽象类本身就代表了一个类型,无法
 *      确定为一个具体的对象,所以不能实例化就合乎情理了,只能有它的继承类实例化。
 * 3、抽象类虽然不能被实例化,但有自己的构造方法
 * 4、抽象类与接口(interface)有很大的不同之处,接口中不能有实例方法去实现业务逻辑,而抽象类
 *      中可以有实例方法,并实现业务逻辑,比如我们可以在抽象类中创建和销毁一个线程池。
 * 5、抽象类不能使用final关键字修饰----因为final修饰的类是无法被继承,而对于抽象类来说就是
 *      需要通过继承去实现抽象方法,这又会产生矛盾。
 * 总结:抽象类可以理解未未具体定义功能的类,后续需要开发自定义的子类继承父类,并实现父类的抽象方法;优势:同一类对象可以定义一个抽象类,抽出公共方法为抽象方法
 */
abstract class Animal{

    /**
     * 抽象方法
     * 1、抽象方法跟普通方法是有区别的,它没有自己的主体(没有{}包起来的
     *      业务逻辑),跟接口中的方法有点类似。所以我们没法直接调用抽象方法
     * 2、抽象方法不能用private修饰,因为抽象方法必须被子类实现(覆写),而private权限对于子类来
     *      说是不能访问的,所以就会产生矛盾
     * 3、抽象方法也不能用static修饰,试想一下,如果用static修饰了,那么我们可以直接通过类名调
     *      用,而抽象方法压根就没有主体,没有任何业务逻辑,这样就毫无意义了
     */
    abstract void eat();
}

class Cat extends Animal{

    @Override
    void eat() {
        System.out.println("fish");
    }

    void speak(){
        System.out.println("miao~~");
    }
}

class Dog extends Animal{

    @Override
    void eat() {
        System.out.println("bone");
    }

    void speak(){
        System.out.println("Wang Wang 。。。");
    }

    void work(){
        System.out.println("watch door");
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值