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

  • 相关阅读:
    nginx反向代理前后端分离项目(后端多台)
    部署http访问SVN模式出现403问题
    The server quit without updating PID file
    guns开源项目数据库切换为oracle
    window环境下修改postgrep密码
    mybatis中怎样使用having?
    PostgreSQL时间段查询
    Java实现产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。
    Jenkins构建maven项目跳过测试用例的命令
    supervisord
  • 原文地址:https://www.cnblogs.com/wangyuyang1016/p/10779372.html
Copyright © 2011-2022 走看看