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、 抽象类强制规定了子类必须要做的事情,而且可以与抽象类的普通方法相配合

优质内容筛选与推荐>>
1、001_公司网站首页遇到的问题
2、linux 之进程间通信-------------InterProcess Communication
3、freemarker 用法
4、iOS开发系列--触摸事件、手势识别、摇晃事件、耳机线控
5、快大三了,该确定专业方向了


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn