Java 抽象类
抽象类定义:
普通类可以直接产生实例化对象,并且再普通类中可以包含有构造方法、普通方法、Static方法、常量变量等内容。而所谓的抽象类就是指再普通类的结构里面增加“抽象方法”的组成部分。
Java中,“{ }”表示的是一个结构(方法)体,有结构体的方法就一定可以被对象直接使用。而抽象方法指的是没有方法体的方法,同时抽象方法必须使用 abstract 关键字定义。
抽象方法属于抽象类,抽象类要使用 abstract 关键字声明。
abstract class A{ //定义一个抽象类 public void fun() { //普通方法 System.out.println("普通 方法") ; }
public abstract void print() ; // 一个抽象方法(abstract关键字) } |
Java中,是不可以对抽象类进行直接实例化的(如上),——之所以不可以实例化,因为抽象类中的抽象方法没有方法结构体,一旦实例化就表示类对象可以调用类中的方法和属性,但是在抽象类中,存在有抽象方法且没有方法体,故调用抽象类毫无意义。
抽象类定义原则:
抽象类必须有子类。即每一个抽象类要被子类所继承
抽象类的子类必须要覆写抽象类之中的全部抽象方法(强制子类覆写)
抽象子类可不用覆写抽象父类
抽象类的对象实例化需要依靠子类完成,采用向上转型的方式实例处理
abstract class A{ //定义一个抽象类 public void fun() { //普通方法 System.out.println("普通 方法") ; } public abstract void print() ; // 一个抽象方法(abstract关键字) }
class B extends A { //子类继承父类 public void print(){ //子类覆写抽象类的抽象方法 System.out.println("Hello,World!") ; } } public class Test { public static void main(String [] args) { A a = new B() ; //向上转型 a.print() ; //实际调用的是被子类覆写的print抽象方法 } } |
1、 抽象类继承子类里面会有明确的方法覆写要求(覆写抽象父类中的所有抽象方法)
2、 抽象类只比普通类多定义了抽象方法的,其它的两者完全一样
3、 抽象类不可以直接实例化,必须经过子类继承和向上转型之后才可以得到实例化对象
使用限制:(条件约束)
1、 抽象类中会存在一些属性,所以可以在抽象中定义构造方法;(先父类构造,在子类构造)
2、 抽象类不可以用final定义(final定义的类不可以有子类)因为抽象类必须有子类
3、 抽象类外部不可以使用static声明,但抽象类内部抽象类可以使用static声明(static声明后相当于内部类是一个外部类,可以被继承【方法:外部类.内部类】)
4、 对于任何类(抽象类),static定义的方法,都可以不用实例化对象,直接调用方法
隐藏子类的操作:
abstract class A { //抽象类 public abstract void print() ; private static class B extends A { // 内部继承子类 public void print() { // 覆写抽象类方法 System.out.println("**") ; } } // PS:这里的子类用到了static public static A getInstance() { //返回子类的对象 return new B() ; } } public class Test { public static void main(String [] args) { A.getInstance().print() ; //调用 } }
抽象类设计(模板功能实现)
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
abstract class Action { //行为类 public static final int EAT = 1 ; public static final int SLEEP = 5 ; public static final int WORK = 7 ; public void command(int flag) { switch ( flag ) { case EAT : this.eat() ; break ; case SLEEP : this.sleep() ; break ; case WORK : this.work() ; break ; case EAT + WORK : this.eat() ; this.work() ; break ; } } public abstract void eat() ; public abstract void sleep() ; public abstract void work() ; } class Robot extends Action { //机器人类 public void eat() { System.out.println("机器人补充能量") ; } public void sleep() {} public void work() { System.out.println("机器人正在努力工作") ; } } class Human extends Action { // 人——类 public void eat() { System.out.println("人类正在吃饭") ; } public void sleep() { System.out.println("人类正在睡觉") ; } public void work() { System.out.println("人类正在工作") ; } } class Pig extends Action { // 猪——类 public void eat() { System.out.println("pig正在啃食槽") ; } public void sleep() { System.out.println("pig正在睡觉") ; } public void work() {} } public class Test { public static void main(String [] args) { fun(new Robot()) ; } public static void fun(Action act) { act.command(Action.EAT) ; act.command(Action.SLEEP) ; act.command(Action.WORK) ; } }
上例中不同类型最终都在行为类撒谎给你成功的进行了抽象,即:如果想要进行行为操作,那么就要通过子类进行抽象类继承并实现设计功能。
总结:
1、 如果要使用类继承,就要运用抽象类(20%)
2、 抽象类强制规定了子类必须要做的事情,而且可以与抽象类的普通方法相配合