文章目录
他们陪着我, 永远不寂寞
还有还有,一只大狼狗
一、抽象类
在之前写类的继承时,子类一般会从父类继承一些成员方法。倘若在不同的继承对象上,同一个方法会以不同的方式展现,我们会用多态来节省代码,但是依然要在父类中写一遍方法体。能否有办法可以只定义一个方法名在父类,子类中再挨个重写
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