day12 Java 面向对象 抽象类 接口


他们陪着我, 永远不寂寞
还有还有,一只大狼狗




一、抽象类

在之前写类的继承时,子类一般会从父类继承一些成员方法。倘若在不同的继承对象上,同一个方法会以不同的方式展现,我们会用多态来节省代码,但是依然要在父类中写一遍方法体。能否有办法可以只定义一个方法名在父类,子类中再挨个重写

1、abstract 关键字

抽象方法
(没有方法体的方法)

//	定义格式
abstract void show();

抽象类

//	定义格式
abstract class Pokemon{
    
    }

2、抽象的特点

1、抽象方法不包含方法体,由一个派生类负责实现一个抽象类中的所有抽象方法
2、含有抽象方法的一定是抽象类,抽象类不一定含有抽象方法
3、抽象类不能实例化,需要利用一个派生类来实例化

3、抽象类与类

抽象类的子类,只能是一个普通类或者是抽象类
┕如果是普通类,需要实现父类的全部抽象方法
┕如果是抽象类,可以不重写或重写部分抽象方法

4、抽象类中的成员

成员变量:
可以是变量,也可以是常量

构造方法:
存在。虽然抽象类不能被实例化,但是需要借此初始化

成员方法:
可以是具体的实现方法,也可也是抽象的方法

5、没有抽象方法的抽象类

存在没有的抽象方法的抽象类,但是这样有意义吗
抽象类可以理解为在最终对象未知的前提下,提前为他们找的家,为他们即将用到的方法做铺垫,方便后期重写调用
倘若他们有着相同的本质,但是没有相同的方法,或者说这些方法在这里用不上,那么就是没有抽象方法的抽象类,我认为这是一种面向对象的体现

6、和 abstract 冲突的关键字

private 关键字
private 修饰的成员只能在本类中被访问
抽象类存在的目的及是被继承,使用 private 相当于自我否定

final 关键字
被 final 修饰的类无法被继承,修饰的方法无法被重写
抽象类同上,抽象放的存在也是为了被派生类重写,所以也是自我否定

static 关键字
被 static 修饰的方法与类同时存在,可以被类名直接调用
而抽象方法因为没有实现方法,是不能被直接调用的,为了避免冲突,不能使用

7、例子

/*
    假如我们在开发一个系统时需要对员工类进行设计,
    员工包含3个属性:姓名、工号以及工资。
    经理也是员工,除了含有员工的属性外,另为还有一个奖金属性。
    请使用继承的思想设计出员工类和经理类。
    要求类中提供必要的方法进行属性访问。

    分析:
        普通员工:
            姓名,工号,工资
            工作(敲代码)

        经理:
            姓名,工号,工资,奖金
            工作(做PPT)

    实现:
        抽象的员工类
        普通员工类
        经理类

 */

abstract class Staff{
    
    
    private String name;
    private String id;
    private int salary;

    public Staff() {
    
    
    }

    public Staff(String name, String id, int salary) {
    
    
        this.name = name;
        this.id = id;
        this.salary = salary;
    }

    public String getName() {
    
    
        return name;
    }

    public void setName(String name) {
    
    
        this.name = name;
    }

    public String getId() {
    
    
        return id;
    }

    public void setId(String id) {
    
    
        this.id = id;
    }

    public int getSalary() {
    
    
        return salary;
    }

    public void setSalary(int salary) {
    
    
        this.salary = salary;
    }

    public abstract void work();
}

class GeneralWorker extends Staff{
    
    

    public GeneralWorker() {
    
    
    }

    public GeneralWorker(String name, String id, int salary) {
    
    
        super(name, id, salary);
    }

    @Override
    public void work() {
    
    
        System.out.println("敲代码");
    }
}


class Manager extends Staff{
    
    

    private int bonus;

    public Manager() {
    
    
    }

    public Manager(String name, String id, int salary) {
    
    
        super(name, id, salary);
    }

    public int getBonus() {
    
    
        return bonus;
    }

    public void setBonus(int bonus) {
    
    
        this.bonus = bonus;
    }

    @Override
    public void work() {
    
    
        System.out.println("做PPT");
    }
}

public class AbstractTest {
    
    
    public static void main(String[] args) {
    
    
        Staff s1 = new GeneralWorker("a","0001",14000);
        System.out.println(s1.getName()+"---"+s1.getId()+"---"+s1.getSalary());
        s1.work();

        Staff s2 = new Manager("b","00080",30000);

        //向下转型使用子类特有的方法
//        s2.setBounts();
        ((Manager)s2).setBonus(4000000);
        System.out.println(s2.getName()+"---"+s2.getId()+"---"+s2.getSalary()+"---"+((Manager) s2).getBonus());
        s2.work();
    }
}



二、接口

在普通类和抽象类中,都只能支持单继承或者多级继承,某些情况下,我们不得不使用多继承来实现需求。此时可以用到接口

1、interface 关键字

1、定义接口使用 interface 关键字

//	定义格式
interface 接口名 {
    
    }

2、implements 关键字

2、类是一种特殊的抽象类,内部只能是抽象方法。可以看做是一个抽象方法声明的合集,继承动作是用实现来替代,关键字是 implements

//	定义格式
class 类名 implements 接口名 {
    
    }

3、接口的特点

1、接口内的方法只能是抽象方法,由一个派生类负责实现一个接口中的所有抽象方法
2、接口不能实例化,只能通过一个实现了所有抽象方法的派生类,创建对象
3、接口没有构造方法,但所有的类都继承一个超类:Object
4、接口允许多继承

4、接口与类

接口的子类,可以是普通类、抽象类或者接口
┕如果是普通类,实现关系。需要实现接口的全部抽象方法
┕如果是抽象类,实现关系。可以不重写或重写部分抽象方法
┕如果是接口,继承关系。只能写抽象方法或不写方法

可以一个类或者接口实现或继承多个接口,即接口的多继承

5、接口中的成员

成员变量:
默认修饰符:public static final
只能是静态常量

成员方法:
默认修饰符:public abstract void
只能是抽象方法



总结

abstract 关键字

抽象方法
没有方法体

抽象类
有抽象方法的一定是抽象类,抽象类不一定有抽象方法

接口
是一种特殊的抽象类,接口中只有
成员变量修饰锁死:public static final
成员方法修饰锁死:public abstract void

猜你喜欢

转载自blog.csdn.net/qq_41464008/article/details/120554027
今日推荐