一、抽象类
抽象类和普通类的区别
抽象类不能实例化(抽象类中包含有抽象方法,而抽象方法不包含方法体,即没有具体实现),因此抽象类不能直接产生实例化对象;比普通类多了一些抽象方法
- 抽象类只是在普通类的基础上扩充了一些抽象方法,这些方法只声明而未实现,所有抽象方法要求使用abstract关键字来定义,并且抽象方法所在的类也一定要使用abstract关键字来定义。
- 允许(但不要求)抽象类包含抽象成员
- 因此在抽象类中也允许提供构造方法,并且子类也照样遵循对象实例化流程。实例化子类时一定先调用父类构造方法,如果父类没有无参构造,那么子类构造必须使用super明确指出使用父类哪个构造方法。
- 抽象类派生非抽象类时,非抽象类必须实现所继承的所有抽象成员,从而重写那些抽象成员
abstract class类名{ //声明类成员 }
关于抽象类的使用原则
(1)所有的抽象类必须有子类,如果一个类包含一个或多个抽象方法,则该类必须限定为抽象
(2)抽象类的子类必须覆写抽象类的所有抽象方法(子类不是抽象类)【方法覆写一定要考虑权限问题,权限尽量都用public】
(3)抽象类的对象可以通过对象多态性(覆写)利用子类为其实例化
(4)抽象类也分为内部抽象类和外部抽象类。内部抽象类中也可以使用static定义来描述外部抽象类
//使用static修饰内部抽象类是正确的
//如果加在static abstract class Person是错误的
abstract class Person {
public abstract void getPersonInfo();
static abstract class Person1{
public abstract void get();
}
}
class Student extends Person {
@Override
public void getPersonInfo() {}
class Student1 extends Person1{
@Override
public void get() { }
}
}
或者是
class Student extends Person.Person1 {
public void get() { }
}
重点:
抽象类一定不能使用final声明,因为使用final声明的类不允许有子类;而抽象类必须有子类,也不能用private定义,这属于密封类不能被访问;相应的,抽象方法也不能使用private定义,因为抽象方法必须要能被覆写 。
把类或者方法声明为抽象,表示该类或方法必须被重写或继承
以下是一般情况下的抽象类实现
abstract class Father {
private String name;
abstract void test();
public void method() {
System.out.println("抽象类的方法");
}
}
class Son extends Father {
@Override
void test() {
System.out.println("覆写抽象类的方法");
}
}
public class AbstractClass {
public static void main(String[] args) {
Father father = new Son();
father.test();
}
}
以下使用内部类的方法继承抽象类实现抽象类的方法,封装了Son,即子类
abstract class Father {
private String name;
abstract void test();
public void method() {
System.out.println("抽象类的方法");
}
public static Father getInstance(){
class Son extends Father{
@Override
void test() {
System.out.println("(内部类)覆写抽象类的方法");
}
}
return new Son();
}
}
public class AbstractClass {
public static void main(String[] args) {
Father father =Father.getInstance();
father.test();
}
}
二、抽象方法
public abstract void 方法名();
- 除构造方法、静态方法、私有方法不能声明为抽象方法外,其他方法都可以声明为抽象方法
- 一个派生类从基类继承了抽象方法,则必须重写以实现所有的抽象方法,要么使用abstract关键字声明派生类为抽象类
- 不能引用抽象方法
- 当抽象类从基类继承成员方法时, 抽象类可以使用抽象方法重写从基类继承的成员方法,继承抽象方法的类无法访问该方法的原始实现
- 所有抽象方法要求使用abstract关键字来定义,并且抽象方法所在的类也一定要使用abstract关键字来定义,表示抽象类
三、abstract的使用
abstract与其他修饰符的关系
- final与abstract不能共存:
final:它的作用是修饰类代表不可以继承,修饰方法不可重写;
abstract:修饰类就是用来被继承的,修饰方法就是用来重写的; - static与abstract不能共存:
- abstract修饰的方法没有具体的方法实现,所以不能直接调用
static修饰的方法可以用类名调用 - private与abstract不能共存:
- private修饰的只能在本类中使用
- abstract方法是用来被子类进行重写的,有矛盾