进阶篇day02 --- 包 / 抽象类 / 接口 / 多态

能够定义抽象方法和抽象类

清楚抽象类子类的特点

能够理解接口的思想和好处

清楚接口中的成员特点

能够理解多态的好处

掌握多态中的成员访问特点

抽象类

抽象类是一种特殊的父类 , 内部可以编写抽象方法

public class AbstractTest1 {
    /*
        抽象类: 特殊的父类

        问题: 特殊在哪里呢?
        回答: 内部允许编写抽象方法

        问题: 什么是抽象方法?
        回答: 当我们将共性的方法, 抽取到父类之后, 发现这个方法在父类中无法给出具体明确(描述不清了)
                而且这个方法, 还是子类必须要有的方法, 就可以设计为抽象方法.
     */
    public static void main(String[] args) {

    }
}

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

class Cat extends Animal {

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

class Dog extends Animal {

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

public class AbstractTest2 {
    /*
        抽象类的注意事项 :

            1. 抽象类不能实例化
                - 如果抽象类允许创建对象, 就可以调用内部没有方法体的, 抽象方法了
            2. 抽象类存在构造方法
                - 交给子类, 通过super进行访问
            3. 抽象类中可以存在普通方法
                - 可以让子类继承到继续使用
            4. 抽象类的子类
                    1). 要么重写抽象类中的所有抽象方法
                    2). 要么是抽象类
     */
    public static void main(String[] args) {
         Zi z = new Zi();
         z.method();

    }
}

abstract class A {
    public  abstract void showA();
}

abstract class B extends A {

    @Override
    public void showA() {

    }

    public abstract void showB();
}

class C extends B {

    @Override
    public void showB() {

    }
}


abstract class Fu {

    public Fu(){

    }

    public abstract void show();

    public void method(){
        System.out.println("method...");
    }

}

class Zi extends Fu {

    public Zi(){
        super();
    }

    @Override
    public void show() {

    }
}

接口

public class InterfaceTest1 {
    /*
        接口: 体现的思想就是声明 [规则]

        思路: 如果发现一个类, 所有的组成, 都是抽象方法
                    - 没有成员变量
                    - 没有普通方法

                    这种类, 我们通常会设计为Java中的接口, 因为现在这个类存在的唯一价值, 就只是声明规则了


        ---------------------------------

        接口的定义格式:

                interface 接口名 {}

        注意: 接口不允许实例化

        接口和类之间是实现关系, 通过implements关键字来完成

                class 类名 implements 接口名 {}

                实现类(接口的子类):

                        1. 重写所有抽象方法
                        2. 将实现类变成抽象类
     */
    public static void main(String[] args) {
        // 创建实现类对象
        InterImpl ii = new InterImpl();
        ii.method();
        ii.show();
    }
}

interface Inter {
    public abstract void show();
    public abstract void method();
}

class InterImpl implements Inter {

    @Override
    public void show() {
        System.out.println("show...");
    }

    @Override
    public void method() {
        System.out.println("method...");
    }
}

 

public class InterfaceTest2 {
    /*
        接口的成员特点 :

            1. 成员变量 : 只能定义常量, 因为系统会默认加入三个关键字
                                public static final
                                - 这三个关键字没有顺序关系

            2. 成员方法 : 只能是抽象方法, 因为系统会默认加入两个关键字
                                public abstract

            3. 构造方法 : 没有
     */
    public static void main(String[] args) {
        System.out.println(Inter.num);
    }
}

interface MyInter {
    public static final int NUM = 10;

    public abstract void show();

    void method();
}

 


interface InterA {
    void show();
}

interface InterB {
    void show();
}

interface InterC extends InterA, InterB {
    void show();
}

class InterCImpl implements InterC {

    @Override
    public void show() {

    }
}

public class InterfaceTest3 {
    /*
        接口和类之间的各种关系 :

            1. 类和类之间 : 继承关系, 只支持单继承, 不支持多继承, 但是可以多层继承

            2. 类和接口之间 : 实现关系, 可以单实现, 也可以多实现, 甚至可以在继承一个类的同时, 实现多个接口

            3. 接口和接口之间 : 继承关系, 可以单继承, 也可以多继承
     */
    public static void main(String[] args) {

    }
}

class Fu {
    public void show() {
        System.out.println("Fu..show");
    }
}

interface A {
    void show();
}

interface B {
    void show();
}

class Zi extends Fu implements A, B {

}

 

 

多态

 

 

 

public class Test {
    /*
        ClassCastException : 类型转换异常

                在引用数据类型的强转中, [实际类型]和[目标类型]不匹配, 就会出现此异常
     */
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入:  1. 国内订单   2. 国外订单");

        OrderService orderService = null;

        int choice = sc.nextInt();
        switch (choice) {
            case 1:
                // 创建国内订单的业务类
                orderService = new OrderServiceImpl();
                break;
            case 2:
                // 创建国外订单的业务类
                orderService = new OverseasServiceImpl();
                break;
        }

        // instanceof : 判断左边的引用, 是否是右边的数据类型
        if(orderService instanceof OverseasServiceImpl){
            OverseasServiceImpl osi = (OverseasServiceImpl) orderService;
            osi.check();
        }

        orderService.create();
        orderService.findOne();
        orderService.findList();
        orderService.cancel();
        orderService.finish();
        orderService.paid();
    }
}
public class PolymorphismTest1 {
    /*
        多态的前提 :
                    有继承 / 实现关系
                    有方法重写
                    有父类引用指向子类对象

        1. 对象多态
                    Animal a1 = new Dog();
                    Animal a2 = new Cat();

                    好处: 方法的形参定义为父类类型, 这个方法就可以接收到该父类的任意子类对象了

        2. 行为多态
                    好处: 同一个方法, 具有多种不同表现形式, 或形态的能力
     */
    public static void main(String[] args) {
        useAnimal(new Dog());
        useAnimal(new Cat());

    }

    public static void useAnimal(Animal a) {        // Animal a = new Dog();
          a.eat();                                  // Animal a = new Cat();
    }

}

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

class Dog extends Animal {

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

class Cat extends Animal {

    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }
}
public class PolymorphismTest2 {
    /*
        多态的成员访问特点:

              1. 成员变量 : 编译看左边(父类), 运行看左边(父类)

              2. 成员方法 : 编译看左边(父类), 运行看右边(子类)

                                在编译的时候, 会检查父类中有没有这个方法
                                        没有 : 编译出错
                                        有 : 编译通过, 但是运行的时候, 一定会执行子类的方法逻辑

                                原因: 担心你调用的方法, 在父类中是一个抽象方法

        --------------------------------------------------------------------------

            多态创建对象, 调用静态成员 :

                    静态的成员, 推荐类名进行调用
                    细节: 静态的成员, 可以使用对象名调用, 但这是一种假象
                                    - 生成字节码文件后, 会自动将对象名调用, 改成类名调用
     */
    public static void main(String[] args) {
        Fu f = new Zi();
        System.out.println(f.num); //10
        f.show();  //Zi...show
        f.print();          // Fu.print();     打印:Fu...print

        System.out.println("-----------------");

        Inter i = new InterImpl();
        i.method();
    }

}

interface Inter {
    void method();
}

class InterImpl implements Inter {

    @Override
    public void method() {
        System.out.println("method...");
    }
}

class Fu {
    int num = 10;

    public void show() {
        System.out.println("Fu...show");
    }

    public static void print(){
        System.out.println("Fu...print");
    }
}

class Zi extends Fu {
    int num = 20;

    @Override
    public void show() {
        System.out.println("Zi...show");
    }

    public static void print(){
        System.out.println("Zi...print");
    }
}

  

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值