抽象类和接口
抽象类
- 抽象类语法:
/*
*在class之前加上abstract关键字
*/
public abstract class Aminal {
}
- 抽象方法:
/*
*没有方法体为抽象方法,且需要在返回值类型前加上abstract关键字
*/
public abstract class Aminal {
abstract void eat();
abstract void sleep();
//这是普通的方法
void info(){
};
}
- 抽象类的继承:
/*
*子类继承抽象类,必须重写父类的抽象方法
*/
public class Dog extends Aminal0 {
//重写时需加上注解标记
@Override
void eat(){
System.out.println("重写eat()");
}
@Override
void sleep(){
System.out.println("重写sleep()");
}
}
- 抽象类不能被实例化
public class Test1 {
public static void main(String[] args) {
//下面的语句是会报错的:'Aminal' is abstract; cannot be instantiated “动物”是抽象的;无法实例化
//Aminal aminal = new Aminal();
}
}
- 抽象方法的访问修饰符只能是public protected 默认
public abstract class Aminal {
public abstract void eat();
protected abstract void sleep();
abstract void fight();
//下面这条语句是会报错的:Illegal combination of modifiers: 'abstract' and 'private' 修饰语的非法组合:“抽象”和“私有”
//private abstract void fight();
}
接口
- 接口的语法:
/*
*使用interface关键字
*/
public interface Aminal {
}
- 接口内的抽象方法不能用protected private修饰
/*
*编译器会自动加上public static,可省略
*/
public interface Aminal {
//接口内只能是抽象方法
public abstract void eat();
void sleep();
//这里会报错:Modifier 'protected' not allowed here 此处不允许修饰符“受保护”
//protected void sleep();
//这里会报错:Modifier 'private' not allowed here 此处不允许使用修饰语“私人”
//private void fight();
}
- 接口内定义的变量必须初始化
public interface Aminal {
//接口内的变量必须初始化为常量,编译器会默认加上public final,可省略
double weight = 0;
public final int height = 5;
//加上default关键字,可定义defau方法;在实现该接口时不需要覆写default方法
default void fight(){
System.out.println(weight);
};
}
-
接口不能被实例化
-
接口继承接口
/*
*使用extends关键字,接口可继承多个接口,但不能继承类
*/
public interface Dog extends Aminal,intFacTest{
}
- 实现接口
/*
*使用implement关键字,可同时实现多个接口,用逗号分隔
*/
public class Dog extends Aminal03 implements Aminal01,Aminal02{
//实现接口必须重写接口内的抽象方法
@Override
public void eat() {
}
@Override
public void sleep() {
}
}