目录
当编写一个类时,常常会为该类定义一些方法,用于描述该类的行为方式,这些方法都有具体的方法体。但在某些情况下,某个基类只是知道其子类应该包含那些方法,但不知道子类是如何实现这些方法的。
如何让一个基类只包含方法签名,又无需提供方法的具体实现?
使用抽象方法即可满足该要求:抽象方法是只有方法签名,没有方法实现的方法。
利用抽象类和抽象方法,可以更好的发挥多态的优势,使程序更加灵活。
1、抽象方法和抽象类
抽象方法:使用修饰符 abstract 来修饰的方法(抽象方法不能有方法体)。
public abstract void abstractMethod(); // 注意此时没有方法体 {},直接;结尾
public abstract void abstractMethod(){ } // 直接报错,因为有方法体 {}
抽象类:使用修饰符 abstract 来修饰的类(抽象类里可以没有抽象方法)。
public abstract class AbstractClass { } // 该抽象类里什么都没有
注:
1、含有抽象方法的类只能被定义成抽象类。
2、含有抽象方法的类的三种情况:
- 直接定义了一个抽象方法。
- 继承了一个抽象基类,但没有完全实现基类里的抽象方法。
- 实现了一个接口,但没有完全实现接口里的方法。
3、抽象类不能被实例化:无法使用 new 关键字来调用抽象类的构造器实例化抽象类;即使抽象类里不含抽象方法,这个抽象类也不能实例化。
4、抽象类只能被继承;抽象方法必须由子类提供实现(重写)。
5、final 和 abstract 永远不能同时使用:final 修饰的类不能被继承,final 修饰的方法不能被重写。
6、abstract 不能修饰变量、构造器:即没有抽象变量、抽象构造器。
7、static 和 abstract 不能同时修饰方法,但可以同时修饰内部类。
8、private 和 abstract 不能同时修饰方法,但可以同时修饰内部类:abstract 关键字修饰的方法必须被其子类重写才有意义,否则这个方法永远不会有方法体,因此 abstract 方法不能定义为 private 访问权限。
9、抽象类里可以包含的:
- 成员变量(实例变量、类变量)
- 方法(抽象方法、实例方法、类方法)
- 构造器:不能用于创建自己的实例,主要用于被其子类调用,初始化父类成员使用的
- 代码块(类代码块、实例代码块)
- 内部类(接口、枚举)
// 抽象类
public abstract class AbstractClass {
// 实例变量
private int age;
// 类变量
private static String name;
// 实例代码块
{}
// 类代码块
static {}
// 抽象方法
public abstract void abstractMethod();
// 实例方法
public void defaultMethod() {}
// 类方法
public static void a() {}
// 构造器
public AbstractClass() {}
// 接口
Comparable anInterface;
// 枚举
Enum anEnum;
// 内部类
class A{ }
// 静态内部类
static class B{}
}
抽象类的得与失:
得:可以包含抽象方法
失:无法创建实例
2、抽象类的作用
抽象类不能创建实例,只能当成父类来被继承。
从语义的角度来看,抽象类是从多个具体类中抽象出来的父类,它是更高层次的抽象。
从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为其子类的模板,从而避免了子类设计的随意性。
抽象类体现的就是一种模板模式的设计,抽象类作为多个子类的通用模板,子类在抽象类的基础上进行扩展、改造,但子类总体上会大致保留抽象类的行为方式。
抽象类里提供多个子类的通用方法,并把方法推迟留到子类中来实现,这就是一种模板模式。
标签:Java,子类,abstract,实例,抽象,抽象类,方法 From: https://www.cnblogs.com/sunzhongjie/p/17114375.html