【进阶篇-Day2:JAVA包、抽象类、接口、多态】

1、包

在这里插入图片描述

2、抽象类

2.1 抽象类的定义

在这里插入图片描述

下面是抽象类及抽象方法的例子:
在这里插入图片描述

定义格式:
在这里插入图片描述

2.2 抽象类的注意事项

在这里插入图片描述

2.3 abstract关键字的冲突

在这里插入图片描述

3、接口

3.1 接口的介绍

在这里插入图片描述

在这里插入图片描述

注:(1)
在这里插入图片描述在这里插入图片描述
(2)其实接口类似于只有抽象方法的抽象类,但是通常我们把类和接口的关系:叫做实现接口,而把抽象类和类的关系:叫做继承关系。因此一个类既可以实现接口,同时也可以继承抽象类,如下所示:

public class AbstractA {
}

interface InterfaceB{
    
}

public class C extends AbstractA implements InterfaceB {

}

3.2 接口中的成员特点

3.2.1 接口中的成员特点

在这里插入图片描述

3.2.2 类和接口之间的各种关系

(1)
在这里插入图片描述

(2)
在这里插入图片描述

interface A{
    void show();
}

interface B{
    void show();
}

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

class Zi extends Fu implements A, B{

}

(3)在这里插入图片描述

interface InterA{
    void showA();
}

interface InterB{
    void showB();
}

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

class InterCImpl implements InterC{

    @Override
    public void showA() {
    }

    @Override
    public void showB() {
    }

    @Override
    public void showC() {
    }
}

3.3 抽象类和接口的对比

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4、多态

4.1 多态的介绍

在这里插入图片描述

从上面的例子可以看出,对于同一个引用数据类型(左边),可以new不同的对象(右边)。因此我就有下面的两个疑问:
在这里插入图片描述
针对上述两个问题,在4.2进行回答。

4.2 多态的前提

对于上述的两个问题,需要有下面的前提才可以实现左右类型不一致时,可以创建对象,并调用同一套方法:
在这里插入图片描述

有了上述的前提后,就可以实现多态了,多态会有两种表现形式:
在这里插入图片描述

4.3 多态的成员访问特点

在这里插入图片描述

注:
对于成员方法,在编译的时候,会检查父类中有没有这个方法:

  • 1、没有:编译报错
  • 2、有:编译通过,但是运行的时候,一定会执行子类的方法逻辑

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

  • 这里还有个问题,那如果多态创建对象,调用静态成员,会是什么样呢?

答:结论是会调用父类的中的静态成员。

原因:静态的成员,可以使用对象名调用,但这是一种假象,因为在生成字节码文件后,会自动将对象名调用,改成类名调用。因此会调用父类中的静态成员。

注:因此,静态的成员,推荐类名进行调用。

4.4 多态的好处和弊端

在这里插入图片描述
在这里插入图片描述

那面对这种弊端,java是怎么解决的呢,可以使用多态的转型,下面接着看。

4.5 多态中的转型

在这里插入图片描述

其实就是将父类型,强转为子类型。

在这里插入图片描述

解决方法是,使用instanceof关键字:
在这里插入图片描述

5、练习

在这里插入图片描述

import com.itheima.service.Pay;
import com.itheima.service.impl.BankPayImpl;
import com.itheima.service.impl.CreditCardPayImpl;
import com.itheima.service.impl.PlatformPayImpl;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        Pay pay = null;
        lo:
        while (true){
            System.out.println("请选择支付方式:1、支付平台支付;2、银行卡网银支付;3、信用卡快捷支付");
            String payMethod = sc.next();
            switch (payMethod){
                case "1":
                    pay = new PlatformPayImpl();
                    break lo;
                case "2":
                    pay = new BankPayImpl();
                    break lo;
                case "3":
                    pay = new CreditCardPayImpl();
                    break lo;
                default:
                    System.out.println("您的输入有误,请重新输入!");
                    break;
            }
        }

        System.out.println("请输入您的支付金额:");
        double payAmount = sc.nextDouble();
        pay.pay(payAmount);
    }
}
  • 19
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值