目录
- 1、包
- 2、抽象类
- 2.1 抽象类的定义
- 2.2 抽象类的注意事项
- 2.3 abstract关键字的冲突
- 3、接口
- 3.1 接口的介绍
- 3.2 接口中的成员特点
- 3.2.1 接口中的成员特点
- 3.2.2 类和接口之间的各种关系
- 3.3 抽象类和接口的对比
- 4、多态
- 4.1 多态的介绍
- 4.2 多态的前提
- 4.3 多态的成员访问特点
- 4.4 多态的好处和弊端
- 4.5 多态中的转型
- 5、练习
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);
}
}