抽象类

从形式上看抽象类是由abstract修饰的java类
专门为继承体系顶端设计的类通常被设计为抽象类

抽象不能被实例化

不能通过new关键字直接创建抽象类类型的实例
但是可以创建其子类类型

抽象类中可以有字段、方法、构造方法、代码块、内部类

抽象方法

如果某个方法在声明的是无法确定其实现细节,则可以省略过程,直接以分号结束。
如果某个方法省略了实现过程({}都省略了),此时需要为该方法加上abstract修饰符,表示该方法为抽象方法。
含有抽象方法的一顶是抽象类,但是抽象类不一定有抽象方法

如果具体类继承了抽象类,那么必须实现所有的抽象方法,否则还是定义为抽象类

  • 1、抽象类 与 具体类 的区别是【抽象类不可以被实例化,而 具体类 可以被实例化】
    2、抽象类中不一定要有抽象方法,为了让某个类不能被实例化也可以将该类设计为 抽象类


    public abstract class Human extends Object { // 抽象类 可以继承 具体类 ( 非抽象类 )
    protected String name ;
    static {
    System.out.println( “Human : 类初始化块” );
    }
    {
    System.out.println( “Human : 实例初始化块” );
    }
    public Human(){
    super();
    System.out.println( “Human()” );
    }
    public Human( String name ){
    super();
    this.name = name ;
    System.out.println( “Human(String)” );
    }
    public void show() {
    System.out.println( this.name );
    }
    public static void main(String*
    [] args) {
    // Human h = new Human(); //【错误】Human是抽象的; 无法实例化
    }
    }

/
1、抽象类 可以继承 抽象类 、具体类(非抽象类) 可以继承抽象类、抽象类可以继承 具体类
2、抽象方法是 由 abstract 修饰的、没有方法体 的方法
3、有抽象方法的类必须是抽象类
/
public abstract class Sinaean extends Human {
public Sinaean(){
super(); // 调用父类构造 ( 不管父类是 抽象类 还是 具体类 )
System.out.println( “Sinaean()” );
}
// 声明一个抽象方法
public abstract void eat( String** foodName ) ; // 没有方法体、由 abstract 修饰符修饰
}

/
1、如果 具体类 继承了 抽象类,则必须实现抽象类中的所有抽象方法
2、当子类继承了 抽象类后,如果仍然不能确定抽象方法的实现过程,可以将子类继续定义为 抽象类
*/
public class Han extends Sinaean {
public Han(){
super(); // 调用父类构造 ( 不管父类是 抽象类 还是 具体类 )
System.out.println( “Han()” );
}
@Override
public void eat( String foodName ) { // 如果有方法体就一定不能有 abstract 修饰符
System.out.println( “在中国汉族人基本都使用筷子吃” + foodName + “,比如我” + this.name + “就是这样的”);
}
public static void main(String[] args) {
Han h = new Han**();
h.name = “罗文康” ;
h.eat( “火锅” );
}
}