1.抽象类
-
用abstract修饰的类叫做抽象类 , 用abstract修饰的方法叫做抽象方法 .
-
抽象方法只有方法标签 , 没有方法体
应用场景 :
-
当多个类中有相同的代码( 包括重复的方法标签 )时 , 就可以把他们提取到抽象类中
-
当不知道系统具体要实现的业务时 , 可以先定义抽象类
好处 :
方便系统扩展 , 可以更好地支持多态
常见应用场景 : 模块方法设计模式
写法 :
-
定义一个抽象类
-
在里面分别定义模板方法和抽象方法
模板方法里放重复代码
抽象方法则等待子类继承时重写
注意 : 建议用final关键字修饰模板方法 , 防止子类修改
2.接口
-
关键字interface表示接口 , 接口里的变量为常量 , 方法为抽象方法 .
-
接口里不能创建对象 , 它是被实现的
-
一个接口可以同时继承多个接口 , 一个类也可以同时实现多个接口
-
类实现接口时 , 必须重写接口里的所有抽象方法
jdk8之后 , 接口新增了三种形式的方法 :
-
默认方法
default void method1(){ // 默认为public, 是实例方法, 不强制要求重写, 可直接用实现类对象调用 }
-
私有方法
private void method2(){ // 只能在接口内部使用 }
-
静态方法
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(); // 调用设计类的画画方法 } }