抽象类
- 如果一个类中没有足够的信息来具体描述一个对象,那么这个类就是抽象类。
- 抽象类不能被实例化,但是其他功能依然存在。
- 抽象类必须被继承,才能被使用,所以在设计阶段决定要不要设计抽象类。
- 抽象类包含了子类集合常见的方法,由于这些方法是抽象的,所以我们不能直接使用这个方法。抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。
定义规则
- 在Java中使用abstract关键字来修饰抽象类
//抽象People类
public abstract class People {
private String name;
private Boolean gender;
private Integer age;
public void show(){
System.out.println("Hello!"+name+" "+gender+" "+age);
}
public People(String name, Boolean gender, Integer age){
this.name = name;
this.gender = gender;
this.age = age;
}
}
//抽象Student类
public class Student extends People{//抽象类必须被继承
public Student(String name, Boolean gender, Integer age){
super(name, gender, age);
}
}
//主函数
public class HelloWorld {
//main函数,程序入口
public static void main(String args[]){
Student xiaoming = new Student("Xiaoming", true, 21);
xiaoming.show();
}
}
抽象方法
- 如果想设计一个特殊的方法,这个方法由子类来决定功能,那么可以在父类中声明抽象方法。这个方法必须被子类重载,同样由Abstract修饰
- 声明抽象方法需要条件:
- 包含这个方法的类必须是抽象类
- 任何子类必须重写父类的方法,或者声明自身也是个抽象类,否则不能被实例化
- 抽象方法类似于C++中的声明,不能含有主体
public abstract void haha();
Java接口
- 接口是抽象方法的集合,通常用interface来进行声明
- 一个类通过继承接口的方式,从而来继承接口的抽象方法
- 接口不是类,编写方法和类很相似
- 类描述对象的属性和方法,而接口包含类要实现的方法
- 除非实现接口的类是抽象类,否则该类要定义接口中的所有方法
- 接口无法被实例化,但是接口可以被实现
- 此外接口还可以被声明一个变量,使他们成为一个空指针,或是被绑定在一个以此接口实现的对象
- 接口中的方法必须是抽象方法,Java8之后的的接口可以使用default关键字来修饰非抽象方法
- 除了static和final变量,接口不能含有其他变量
- 接口支持多继承
接口特性
- 每一个方法也是隐式抽象的,接口中方法会被隐式指定为public abstract
- 可以含有变量,但是只能是public static final
- 接口的方法通过类来实现
- 一个类可以实现多个接口
接口的定义
- 接口的定义和类的定义很类似
public interface inter {
public void eat();
}
接口的实现
- 类使用implements关键字来实现接口
- 类继承接口之后必须要重新定义以下接口中的方法
//inter.java
public interface inter {
public void eat();
}
//interim.java
public class interimplemnt implements inter {
public void eat(){
System.out.println("I am eat.");
}
}
- 当接口被类实现了以后,那么这个类被实例化的对象就可以直接赋值给这个接口
public class HelloWorld {
//main函数,程序入口
public static void main(String args[]){
inter ani = new interimplemnt();
//类的对象类型被赋值给了接口类型
ani.eat();
}
}
接口的继承
- 子接口继承父类的接口,接口之间的继承和类之间的继承比较类似,使用extends关键字
public interface Sports{
public void setHomeTeam(String name);
public void setVisitingTeam(String name);
}
public interface Football extends Sports{
public void homeTeamScored(int points);
}
//Football继承自Sports,共需要实现3个方法
接口的多继承
- Java中的接口允许被多继承
public interface Hotkey extends Sports, Event
标记接口
最常用的接口是没有包含任何方法的接口
标记接口是没有任何方法和属性的接口,它仅仅表明它的类属于一个特定的类型,供其他的代码来允许做一些事情
标记接口作用:简单形象的说就是给某个对象打个标签,使对象拥有某些特权
public interface EventListener{}
Java枚举
Java枚举是一个特殊的类,一般表示一组常量,比如4个季节等
Java枚举使用enum关键字来定义,各个常量使用逗号来分割
enum Color{
RED, GREEN, BLUE;
}
实例代码
public class HelloWorld {
//main函数,程序入口
public static void main(String args[]){
enum Color{
RED, GREEN, BLUE;
}
Color c1 = Color.BLUE;
System.out.println(c1);
}
}
- 每个枚举都是通过Class在内部实现的,且所有的枚举值都是public static final的。
- 枚举类常常应用于switch语句当中
values(), ordinal(), valueOf()方法
enum定义的枚举默认继承了java.lang.Enum类
- values() 返回了枚举中所有的值
- ordinal()方法可以找到每个枚举常量的索引,就像数组索引一样
- valueOf()方法返回指定字符串的枚举常量