抽象
抽象方法不能具体实现,(比如父类里面不知道怎么实现,但是子类知道怎么实现)没有方法体,
抽象类不能实例化(不能创建对象),均由abstract修饰
但是有构造方法(因为可以通过子类调用super)
访问权限 abstract 返回值类型 方法名(形参列表);
public abstract void cry();
public /*final*/ abstract class Account {
private int money;
public Account() {
}
public Account(int money) {
setMoney(money);
}
public int getMoney() {
return money;
}
public void setMoney(int money) {
if (money >= 0) {
this.money = money;
} else {
System.out.println("金额不合理哦!!!");
}
}
// 自定义抽象方法实现计算利息并返回的功能描述
public abstract double getLixi(); 父类中不知道如何计算利息,但是咱们目的是计算子类活期账户和定期账户的利息
// private 和 abstract 关键字不能共同修饰一个方法(私有的继承不了,更不能重写了)
//private abstract double getLixi();
// final 和 abstract 关键字不能共同修饰一个方法(final方法不能被重写)
//public final abstract double getLixi();
// static 和 abstract 关键字不能共同修饰一个方法(因为一个abstract方法没有方法体。静态方法需要对方法体执行内容分配空间,所以不能同static共存;(abstract是没有实现的,不能产生对象,而是static是属于类的,类本身是已经存在的对象)
//public static abstract double getLixi();
}
接口
所有方法都为抽象方法。最大的实际意义就是可以多实现
public interface InterfaceTest {
/*public static final */int CNT = 1; // 里面只能有常量
//private void show(){} // 从Java9开始允许接口中出现私有方法
/*public abstract */void show(); // 里面只能有抽象方法(新特性除外)注释中的关键字可以省略,但建议写上
}
接口没有构造方法
抽象类和接口的主要区别
• 定义抽象类的关键字是abstract class,而定义接口的关键字是interface。
• 继承抽象类的关键字是extends,而实现接口的关键字是implements。
• 继承抽象类支持单继承,而实现接口支持多实现。
• 抽象类中可以有构造方法,而接口中不可以有构造方法。
• 抽象类中可以有成员变量,而接口中只可以有常量
• 抽象类中可以有成员方法,而接口中只可以有抽象方法。
• 抽象类中增加方法时子类可以不用重写,而接口中增加方法时实现类需要重写( Java8以前的版本只有抽象方法,所以必须重写)。
• 从Java8开始增加新特性,接口中允许出现非抽象方法和静态方法,但非抽象方法需要使用default关键字修饰。
• 从Java9开始增加新特性,接口中允许出现私有方法。如下面show方法就是为了减少代码冗余
public interface Hunter extends Runner {
// 自定义成员方法描述捕猎的行为
public abstract void hunt();
// 将两个默认方法中重复的代码可以提取出来打包成一个方法在下面的两个方法中分别调用即可
private void show() {
System.out.println("在以后的开发中尽量减少重复的代码,也就是减少代码的冗余!");
}
// 增加一个抽象方法
//public abstract void show1();
// 增加非抽象方法
public default void show1() {
show();
//System.out.println("在以后的开发中尽量减少重复的代码,也就是减少代码的冗余!");
System.out.println("show1方法中:这里仅仅是接口中的默认功能,实现类可以自由选择是否重写!");
}
// 增加非抽象方法
public default void show2() {
show();
//System.out.println("在以后的开发中尽量减少重复的代码,也就是减少代码的冗余!");
System.out.println("show2方法中:这里仅仅是接口中的默认功能,实现类可以自由选择是否重写!");
}
// 增加静态方法 隶属于类层级,也就是接口层级
public static void test() {
System.out.println("这里是静态方法,可以直接通过接口名.的方式调用,省略对象的创建");
}