抽象类、接口、枚举
一、抽象类
1.1 简介
作为父类,里面的方法逻辑不能满足任何一个子类的需求,提供的逻辑根本就用不上,那么就不添加方法体了,此时这个方法需要 使用关键字abstract来修饰,表示为抽象方法,而抽象方法所在的类也必须使用抽象abstract来修饰,这个类就是抽象类。
1.2 抽象类的特点
1)由abstract修饰的方法为抽象方法,抽象方法没有方法体,需要使用分号结尾
2)若类中包含抽象方法,那么该类必须使用关键字abstract声明成抽象类,final不能修饰抽象类
3)抽象类里,可以没有抽象方法
4)抽象类里可以提供构造器,但是不能实例化,没有意义。
5)一个类继承了抽象类,那么必须重写里面的所有抽象方法,除非该子类也声明为抽象类。
public abstract class Student extends Person {//抽象类public static void main(String[] args) { Student s = new Student("小花", 18, 100) ;//抽象类不能实例化对象 s.setAge(20); s.setName("小红"); System.out.println(s.getAge()); System.out.println(s.getName()); }
1.3 抽象类的意义
1) 为其子类提供一个公共的父类型
2) 封装子类中重复的内容,如成员变量和方法
3) 定义抽象方法,子类虽然有不同的实现逻辑,但该方法的定义却是一致的。
//一个抽象的Person类 public abstract class Person { private String name;//私有的成员变量name private int age;//私有的成员变量age public abstract void sleep();//一个抽象方法 Person(){} Person(String name,int age){//实参构造器,用来初始化 this.name=name; this.age=age; } public void setName(String name){//公有的set方法 this.name=name; } public String getName(){//公有的get方法 return name; } public void setAge(int age){ this.age=age; } public int getAge(){ return age; } }//Student类继承了抽象的Person类 public class Student extends Person { private int score;//自己私有的成员变量score Student() {} Student(String name, int age, int score) {//在构造器中初始化 super(name, age); this.score = score; }@Override//重写了抽象父类中的方法 public void sleep() { System.out.println("学生睡觉"); } public static void main(String[] args) { Student s = new Student("小花", 18, 100) ;//创建了一个对象s,初始化name为小花,age为18,score为100 s.setAge(20);//调用了set方法,给age重新赋值 s.setName("小红");//调用了set方法,给name重新赋值 s.sleep(); System.out.println(s.getAge()); System.out.println(s.getName()); } }
二、接口
有的时候,我们需要从几个不相关的类中派生出一个子类,继承他们的所有成员变量和方法,但是java不支持多继承。此时,我们可以使用接口,来达到多继承的效果
2.1 接口特点
-
使用interface进行定义
-
可以提供成员变量,默认提供public static final进行修饰
-
可以提供成员方法,默认使用public abtract进行修饰
-
接口中不能存在构造器,接口不能实例化,没有任何意义
2.2 实现接口
1) 与继承不同,一个类可以实现多个接口。接口间使用逗号分开。
2) 使用关键字implements进行实现,必须实现接口中的所有抽象方法
3) 若一个类中没有全部实现接口中的抽象方法,那么该类需要使用abstract声明成抽象类
2.3 接口之间的继承
1)接口之间可以存在继承关系,即一个接口通过关键字extends可以继承另一个接口。
2)子接口继承了父接口中的所有抽象方法
练习:
1. USB接口: 充电功能 charge(); 获取信息 getInfo()
2. Computer类型: 属性:两个USB接口: usb1,usb2 ; 方法:两个属性的set方法
3. KeyBoard键盘类: 实现USB接口
4. Mouse鼠标类: 实现USB接口
5. Program测试类:
interface USB { void charge(); String getInfo(); } public class Computer { private USB usb1; private USB usb2; public void setUsb1(USB usb1) { this.usb1 = usb1; } public void setUsb2(USB usb2) { this.usb2 = usb2; } public String getUsb1() { return usb1.getInfo(); } public String getUsb2() { return usb2.getInfo(); } } class Keyboard implements USB{ @Override public void charge(){ System.out.println("键盘输入"); } @Override public String getInfo(){ return "键盘"; } } class Mouse implements USB{ @Override public void charge(){ System.out.println("鼠标点击"); } @Override public String getInfo(){ return "鼠标"; } } class Program{ public static void main(String[] args) { Computer computer = new Computer(); Keyboard keyboard = new Keyboard(); Mouse mouse = new Mouse(); computer.setUsb1(keyboard); computer.setUsb2(mouse); System.out.println(computer.getUsb1()); System.out.println(computer.getUsb2()); keyboard.charge(); mouse.charge(); } }
三、枚举
3.1 简介
在Java中,枚举是一种特殊的引用数据类型,是一个被命名的整型常数的集合,用于声明一组带标识符的常数,枚举在日常生活中很常见,例如表示星期的SUNDAY、MONDAY、TUESDAY、WEDNESDAY、THURSDAY、FRIDAY、SATURDAY就是一个枚举。
主要用途是:将一组常量,也可以说成是一组离散值组织起来。
3.2 定义
1. 如果不想做其他描述, 直接添加枚举的对象,即属性,也就是散列值。
2. 如果想要添加一些描述,提供私有构造器,构造器的形参根据需求而定
注意:一旦添加了形参,那么在提供对象时,必须在对象后添加(有参传参)来表示调用构造器
3. 调用枚举时,格式: 枚举类的名字.值。
4. 如果想要显示描述信息,可以提供描述属性的get方法 或者重写toString方法
public enum Week { 周一, 周二, 周三, 周四, 周五, 周六, 周日; public static void main(String[] args) { //获取季节这个枚举中的一个值 Season a = Season.AUTUMN; System.out.println(a); } } enum Season{ SPRING("春天"),SUMMER("夏天"),AUTUMN("秋天"),WINTER("冬天"); private String describe; private Season(String describe){ this.describe =describe; } }