关于抽象类与接口的学习(java0基础)

1.抽象类

  • 用abstract修饰的类叫做抽象类 , 用abstract修饰的方法叫做抽象方法 .

  • 抽象方法只有方法标签 , 没有方法体

应用场景 :

  1. 当多个类中有相同的代码( 包括重复的方法标签 )时 , 就可以把他们提取到抽象类中

  2. 当不知道系统具体要实现的业务时 , 可以先定义抽象类

好处 :

方便系统扩展 , 可以更好地支持多态

常见应用场景 : 模块方法设计模式

写法 :

  1. 定义一个抽象类

  2. 在里面分别定义模板方法和抽象方法

    模板方法里放重复代码

    抽象方法则等待子类继承时重写

注意 : 建议用final关键字修饰模板方法 , 防止子类修改

2.接口

  • 关键字interface表示接口 , 接口里的变量为常量 , 方法为抽象方法 .

  • 接口里不能创建对象 , 它是被实现的

  • 一个接口可以同时继承多个接口 , 一个类也可以同时实现多个接口

  • 类实现接口时 , 必须重写接口里的所有抽象方法

jdk8之后 , 接口新增了三种形式的方法 :

  1. 默认方法

    default void method1(){
        // 默认为public, 是实例方法, 不强制要求重写, 可直接用实现类对象调用
    }

  2. 私有方法

    private void method2(){
        // 只能在接口内部使用
    }

  3. 静态方法

    static void method3(){
        // 默认为public, 只能用接口名来调用
    }

3.练习

要求 :

  • 定义一个员工类 , 它具有姓名 , 年龄 , 性别三个属性 , 具有工作这一行为 .

  • 定义一个 " 画画 " 接口 , 具有 " 画画 " 这一方法 .

  • 定义一个讲师类 , 它继承员工类 , 工作为讲解Java .

  • 定义一个设计类 , 它继承员工类 , 工作为讲解UI设计 , 并实现 " 画画 " 这一接口 .

请进行设计与测试 .

示例 :

public abstract class Employee { // 定义员工类
    private String name;
    private char sex;
    private int age;
​
    // 无参构造与有参构造
    public Employee() {
    }
​
    public Employee(String name, char sex, int age) {
        this.name = name;
        this.sex = sex;
        this.age = age;
    }
​
    public String getName() {
        return name;
    }
​
    public void setName(String name) {
        this.name = name;
    }
​
    public char getSex() {
        return sex;
    }
​
    public void setSex(char sex) {
        this.sex = sex;
    }
​
    public int getAge() {
        return age;
    }
​
    public void setAge(int age) {
        this.age = age;
    }
​
    // 定义抽象方法 工作
    public abstract void work();
}
​
​
public class Teacher extends Employee{ // 定义讲师类, 继承员工类
    public Teacher() {
    }
​
    public Teacher(String name, char sex, int age) {
        super(name, sex, age);
    }
​
    // 重写工作方法
    @Override
    public void work() {
        System.out.println(getAge() + "岁的" + getSex() + "老师" + getName() + "会教Java");
    }
​
}
​
​
public interface Paint { // 定义画画接口
    void paint(); // 默认public
}
​
​
// 定义设计类, 继承员工类, 并实现画画接口
public class UITeach extends Employee implements Paint{ 
    public UITeach() {
    }
​
    public UITeach(String name, char sex, int age) {
        super(name, sex, age);
    }
​
    // 重写工作方法
    @Override
    public void work() {
        System.out.println(getAge() + "岁的" + getSex() + "老师" + getName() + "会教UI设计");
    }
​
    // 重写画画方法
    @Override
    public void paint() {
        System.out.println(getAge() + "岁的" + getSex() + "老师" + getName() + "会画画");
    }
}
​
​
public class test04 { // 测试
    public static void main(String[] args) {
        Employee t1 = new Teacher("lisa", '女', 20); // 创建讲师类对象, 用父类接收
        Employee u1 = new UITeach("Jack", '男', 22); // 创建设计类对象, 用父类接收
​
        Teacher t = (Teacher) t1; // 强制转换为讲师类
        UITeach u = (UITeach) u1; // 强制转换为设计类
​
        t.work(); // 调用讲师类的工作方法
​
        u.work(); // 调用设计类的工作方法
        u.paint(); // 调用设计类的画画方法
    }
}
​
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值