一、抽象类定义
抽象类指包含抽象方法的类叫抽象类,抽象类必须用关键字abstract修饰。
public abstract class A {
static {
System.out.println("静态代码块")
}
{
System.out.println("构造代码块")
}
A () {
System.out.println("构造方法")
}
public void action() {
System.out.println("普通方法")
}
//抽象方法
public abstract void fun();
}
二、抽象类的使用
1.抽象类不能直接实例化,需要子类继承父类向上转型实例化对象。
2.一个子类只能继承(extends)单一的父类。
3.子类必须强制覆写父类的抽象方法,普通方法可选择覆写。
范例:
abstract class A{//定义一个抽象类
public void fun(){//普通方法
System.out.println("存在方法体的方法");
}
public abstract void print();//抽象方法,没有方法体,有abstract关键字做修饰
}
//单继承
class B extends A{//B类是抽象类的子类,是一个普通类
@Override
public void print() {//强制要求覆写
System.out.println("Hello World !");
}
}
public class TestDemo {
public static void main(String[] args) {
A a = new B();//向上转型
a.fun();//被子类所覆写的过的方法
}
}
现在就可以清楚的发现:
(1)抽象类继承子类里面有明确的方法覆写要求,而普通类可以有选择性的来决定是否需要覆写;
(2)抽象类实际上就比普通类多了一些抽象方法而已,其他组成部分和普通类完全一样;
(3)普通类对象可以直接实例化,但抽象类的对象必须经过向上转型之后才可以得到。
三、抽象类的使用限制
(1)抽象类中有构造方法么?
由于抽象类里会存在一些属性,那么抽象类中一定存在构造方法,其存在目的是为了属性的初始化。
并且子类对象实例化的时候,依然满足先执行父类构造,再执行子类构造的顺序。
范例
abstract class A{//定义一个抽象类
public A(){
System.out.println("*****A类构造方法*****");
}
public abstract void print();//抽象方法,没有方法体,有abstract关键字做修饰
}
//单继承
class B extends A{//B类是抽象类的子类,是一个普通类
public B(){
System.out.println("*****B类构造方法*****");
}
@Override
public void print() {//强制要求覆写
System.out.println("Hello World !");
}
}
public class TestDemo {
public static void main(String[] args) {
A a = new B();//向上转型
}
}
(2)抽象类可以用final声明么?
不能,因为抽象类必须有子类,而final定义的类不能有子类;
(3)抽象类能否使用static声明?
外部抽象类不允许使用static声明,而内部的抽象类运行使用static声明。使用static声明的内部抽象类相当于一个外部抽象类,继承的时候使用“外部类.内部类”的形式表示类名称。
(4)可以直接调用抽象类中用static声明的方法么?
任何时候,如果要执行类中的static方法的时候,都可以在没有对象的情况下直接调用,对于抽象类也一样。
(5)有时候由于抽象类中只需要一个特定的系统子类操作,所以可以忽略掉外部子类。这样的设计在系统类库中会比较常见,目的是对用户隐藏不需要知道的子类。
package com.demo;
/**
* Created by Ranjx on 2018/7/22.
*/
public abstract class E {
public abstract void print();
public static class F extends E {
@Override
public void print() {
System.out.print("打印抽象类方法");
}
}
public static E getInstance() {
return new F();
}
public static void main() {
E e = getInstance();
e.print();
}
}