抽象类
在前面的定义animal类,shot()方法用于描述动物的叫声。但是不同的动物有不同的叫声,所以shot()无法准确描述。对此Java允许在定义方法名中可以不写方法体,不包含方法体的方法称为抽象方法,需要用abstract关键字修饰
abstract void shot();
在定义抽象类时需注意,包含抽象方法就必须定义抽象类,但是在抽象类中不一定要有抽象方法。另外抽象类不能被实例化,抽象类中可能有抽象方法,因为抽象方法没有方法体,不能被调用,如果想要调用需创建一个子类,在子类中将抽象类中抽象方法实现。
abstract class Animal{
abstract void shot();
}
class Dog extends Animal{
void shot() {
System.out.println("喵喵");
}
}
public class text4 {
public static void main(String[] args) {
Dog dog = new Dog();
dog.shot();
}
}
接口
当抽象类中的所有方法都是抽象方法时,则这个类可以用另一种方式表示即——接口。
interface Aniaml{
int ID=1;
void breathe();
void run();
}
从上面的代码看,Aniaml是一个接口,但是它的两个构造方法没有用abstract来修饰。这是因为接口中定义的方法和变量都包含一些默认的修饰符,接口中定义的方法默认用"public abstract"来修饰,即抽象方法。接口中的变量默认用"public static final"来修饰,即全局变量。
因为接口中的方法都是抽象的,所以需要一个类实现接口中的方法,这个类就是用implements关键字修饰的类
interface Animal{
int ID = 1;
void breathe();
void run();
}
class Dog implements Animal{
public void breathe() {
System.out.println("猫在叫");
}
public void run() {
System.out.println("猫在跑");
}
}
public class text4 {
public static void main(String[] args) {
Dog dog = new Dog();
dog.breathe();
dog.run();
}
}
在程序中还可以定义一个接口用extends关键字继承另一个接口
interface Animal{
int ID = 1;
void breathe();
void run();
}
interface LandAnimal extends Aniaml{
void LiveOnland();
}
class Dog implements Animal{
public void breathe() {
System.out.println("猫在叫");
}
public void run() {
System.out.println("猫在跑");
}
public void LiveOnland() {
System.out.println("在陆地上生活");
}
}
public class text4 {
public static void main(String[] args) {
Dog dog = new Dog();
dog.breathe();
dog.run();
dog.LiveOnland();
}
}
接口的特点
- 接口中的方法都是抽象的,不能实例化对象
- 当一个类实现接口时,如果这个类是抽象类(接口只能做方法申明,抽象类中可以做方法申明,也可以做方法实现),则实现接口分方法,否则需要实现接口中的全部方法
- 一个类通过implements关键字实现接口时,可以实现多个接口,被实现的接口用多个逗号隔开
-
interface A{ //程序代码 } interface B{ //程序代码 } class C implements A,B{ //程序代码 }
一个类继承另一个类的同时可以实现接口,但是extends关键字必须在implements关键字前面
class Dog extends Canidae implements Aniaml{ //先继承,再实现 }