01-继承和抽象类
继承和抽象类
1、继承
1.1、概念
继承是将多个类的相同属性和行为抽取到一个单独的类中,只要继承单独这个类,即可使用这些属性和行为。
1.2、作用
- 子类继承父类可以自动拥有父类中的属性和行为
- 继承的出现减少了代码冗余,提高了代码的复用性
- 继承的出现,更有利于功能的拓展
1.3、格式
-
public class 子类名 extends 父类名 {
}
1.4、使用步骤
将子类的共性内容抽取到父类中,先写父类,后写子类
1.5、注意事项
- 父类的构造器不会继承到子类中
- 父类私有的内容子类不能使用
1.6、继承的特点
1. 类只能单继承(即一个类只能有一个父类)
2. 可以多层继承
3. 个类不写父类会自动继承Object
1.7、继承后成员变量访问的特点
就近原则
1.8、继承后成员方法访问的特点
就近原则
1.9 继承后构造器访问的特点
- 如果一个类不写构造器,那么Java编译器会自动添加一个无参构造器
- 继承中构造器的访问特点
- 子类中所有的构造器默认都会先访问父类中的无参构造器,再执行本类中的构造器
- 子类无参构造器会调用父类无参构造器
- 子类有参构造器调用父类的有参构造器
1.10 继承后的方法重写
父类方法不能满足子类的要求,子类重新写一遍这个方法
2、抽象类
2.1、抽象方法介绍
父类知道子类一定要完成某个功能,但是每个子类实现的情况都不一样,父类的该功能就可以定义成抽象方法。
2.2、抽象方法格式
- 普通方法格式
- 修饰符 返回值类型 方法名(参数列表)
- 抽象关键字
- abstract
- 抽象方法的格式
- public abstract 返回值类型 方法名(参数列表)
- eg: public abstract void pay(int money)
- 返回值类型前面添加 abstract
- 方法体{},改成;
- public abstract 返回值类型 方法名(参数列表)
- PS:抽象方法一定要放在抽象类中(即有抽象方法的类一定要声明称抽象类,抽象类可以没有抽象方法)
2.3、抽象类的格式
- abstract class 类名
2.4、抽象类的使用步骤
- 定义类继承抽象类
- 重写抽象方法
- 使用子类对象
2.5、抽象类的思想
抽象类是用来被继承的。抽象方法交给子类重写实现
- PS:父类中抽象方法有必要存在吗
- 父类不写抽象方法,子类也可以不写这个方法,不过会导致功能缺失
2.6、抽象类注意事项
-
- 抽象类不能创建对象
- 抽象类中有构造器,让构造器给成员变量赋值
- 抽象方法必须放在抽象类中,抽象类中可以没有抽象方法
- 子类必须重写抽象类中的所有抽象方法。如果子类只重写一部分抽象方法,子类必须声明为抽象类
2.7、模板模式步骤
- 将固定的流程放到父类中
- 将不同的细节由子类去实现
2.7 示例代码
卡片(父类)
// 卡片(父类)
public abstract class Card {
private String name; // 名称
private double balance; // 余额
// 支付功能
public void pay(int money) {
System.out.println("输入用户名和密码");
System.out.println("登录成功");
// 扣款
double newMoney = payment(money);
System.out.println("消费额:" + newMoney);
}
/**
* 抽象的扣款功能
* @param money 应付金额
* @return 实际支付金额
*/
public abstract double payment(int money);}
金卡(子类)
public class GoldCard extends Card {
public GoldCard() {
}
public GoldCard(String name, double balance) {
super(name, balance);
}
// 金卡打8折
@Override
public double payment(int money) {
return money * 0.8;
}
}
银卡(子类)
public class SilverCard extends Card {
public SilverCard() {
}
public SilverCard(String name, double balance) {
super(name, balance);
}
// 银卡打8.5折
@Override
public double payment(int money) {
return money * 0.85;
}
}
测试类
public class Demo03 {
public static void main(String[] args) {
GoldCard gc = new GoldCard();
gc.pay(400);
System.out.println("--------------------------------------");
SilverCard sc = new SilverCard();
sc.pay(400);
}
}