Java 抽象类

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() ; //调用

         }

}

 

 

抽象类设计(模板功能实现)

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) ;

         }

}
View Code

 

 

 

上例中不同类型最终都在行为类撒谎给你成功的进行了抽象,即:如果想要进行行为操作,那么就要通过子类进行抽象类继承并实现设计功能。

 

 

 

总结:

1、  如果要使用类继承,就要运用抽象类(20%)

2、  抽象类强制规定了子类必须要做的事情,而且可以与抽象类的普通方法相配合

posted @ 2019-04-27 17:06  Mirror王宇阳  阅读(146)  评论(0编辑  收藏  举报