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); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!