抽象类、接口、枚举
一、抽象类
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;
}
}


