java抽象类

本文指标:

1. 最基本的运用:掌握java类最简单,最核心的写法

2. 理论知识:语法角度,设计角度

3. 几种典型应用

 

 

最简单也是最核心的抽象类示例:

学习应该是一个循序渐进的过程,学java抽象类也好,学数据结构也好,或者其它,深入学习以后会发现知识点很多,如果学习的节奏加快,会感觉有一堆的东西在意念中,而这个时候最需要告诉自己起码最简单的一块已经毫无疑问的掌握着,而最简单的东西往往也最常用。以下的java抽象示例包括定义一个抽象类和抽象函数、普通类继承抽象类并实现抽象方法以及在主程序中如何使用抽象类。这三个步骤基本上就概括了java抽象类最基本的用法。

package com.wt010.abstractDEMO;
/**
 * @author konecms
 * @date 2018年1月5日 下午4:12:28
 * 
 */
public abstract class SimpleAbstract {
    public abstract void dosome();
}
package com.wt010.abstractDEMO;
/**
 * @author konecms
 * @date 2018年1月5日 下午4:13:33
 * 
 */
public class SimpleAbstractDo extends SimpleAbstract {
    public void dosome() {
        System.out.println("Hello Abstract .");
    }

}
package com.wt010.abstractDEMO;
/**
 * @author konecms
 * @date 2018年1月5日 下午4:14:40
 * 
 */
public class SimpleAbstractDEMO {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        SimpleAbstract a=new SimpleAbstractDo();
        a.dosome();

    }

}

 

语法角度看:

1. 抽象类不能直接实例化;因为:抽象类中包含抽象方法,抽象方法只有方法体,无法被对象调用)

2. 抽象类必然会有子类(非抽象子类),子类(非抽象子类)必须覆盖抽象类中的全部抽象方法。

3. 抽象方法的访问范围必须为public或者protected,而不能是private;因为:抽象方法需要被继承的子类重写。

4. 抽象类可继承抽象类,这种情况下不必须覆盖父类的抽象方法

 

 设计角度

百度百科上这一段话挺经典:

       在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类往往用来表征我们在对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。比如:如果我们进行一个图形编辑软件的开发,就会发现问题领域存在着圆、三角形这样一些具体概念,它们是不同的,但是它们又都属于形状这样一个概念,形状这个概念在问题领域是不存在的,它就是一个抽象概念。正是因为抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能够实例化的。
       在面向对象领域,抽象类主要用来进行类型隐藏。我们可以构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的;同时,通过从这个抽象体派生,也可扩展此模块的行为功能。熟悉OCP的读者一定知道,为了能够实现面向对象设计的一个最核心的原则OCP(Open-Closed Principle),抽象类是其中的关键所在。
       abstract class在Java语言中体现了一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在"is a"关系,即父类和派生类在概念本质上应该是相同的。
       设计抽象类的作用在我看来有以下几点:
       1. 通过看抽象类,就可以知道它的所有派生类都会有什么方法;
       2. 通过抽象类实现模板设计模式编程变得更加优美和好管理;
       3. 最本质的:现实中,对象都是有一个类去描述的,但是反过来却不是这样;比如动物这一概念,它可以是猫,是狗,或者其它,那么我们把动物作为一个类的时候应该把他设计成抽象类,我们可以在这个类里面定义一些动物该具有的方法,但是具体实现交给对应的派生类去实现。有了抽象类这种设计,编程描述动物与猫狗之间的关系时,就变得好理解。

抽象类的典型应用示例:

1.抽象类:内部抽象类

package com.wt010.abstractDEMO;
/**
 * @author konecms
 * @date 2018年1月5日 下午2:28:25
 * 
 */
abstract class StaticInnerAbstract {
    static abstract class InnerAbstract{
        public abstract void dosome();
    }
}
package com.wt010.abstractDEMO;
/**
 * @author konecms
 * @date 2018年1月5日 下午2:30:35
 * 
 */
public class StaticInnerAbstractDo extends StaticInnerAbstract.InnerAbstract {

    public void dosome() {
        System.out.println("Hell,Static Inner Abstract .");
    }
}
package com.wt010.abstractDEMO;
/**
 * @author konecms
 * @date 2018年1月5日 下午2:33:07
 * 
 */
public class StaticInnerAbstractDEMO {
    public static void main(String[] args) {
        StaticInnerAbstract.InnerAbstract si=new StaticInnerAbstractDo();
        si.dosome();
        
    }

}

2.抽象类:唯一子类

package com.wt010.abstractDEMO;
/**
 * @author konecms
 * @date 2018年1月5日 下午3:10:24
 * 
 */
public abstract class SingleSubClassAbstract {
    
     
    public abstract void dosome();
    
    private  static class SingleSubClass extends SingleSubClassAbstract{
        public void dosome() {
            System.out.println("hi,SingleSubClassAbstract .");
        }
    }
    
    public static SingleSubClassAbstract getInstance() {
        return new SingleSubClass();
    }

}
package com.wt010.abstractDEMO;
/**
 * @author konecms
 * @date 2018年1月5日 下午3:22:23
 * 
 */
public class SingleSubClassAbstractDEMO {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        SingleSubClassAbstract.getInstance().dosome();;

    }

}

3.抽象类:模板设计模式

package com.wt010.abstractDEMO;
/**
 * @author konecms
 * @date 2018年1月5日 上午11:24:53
 * 
 */
public abstract class Language {
    public static final int SORT=1;
    public static final int HOW=2;
    public abstract void sort();
    public abstract void how();
    public void explain(int num) {
        switch(num) {
        case 1:
            this.sort();
            break;
        case 2:
            this.how();
        }
    }

}
package com.wt010.abstractDEMO;
/**
 * @author konecms
 * @date 2018年1月5日 上午11:32:24
 * 
 */
public class JAVA extends Language{

    public void sort() {
        System.out.println("language:java");
    }
    public void how() {
        System.out.println("well done java");
    }
}
package com.wt010.abstractDEMO;
/**
 * @author konecms
 * @date 2018年1月5日 上午11:30:40
 * 
 */
public class PHP extends Language {
    public void sort() {
        System.out.println("language:php");
    }
    public void how() {
        System.out.println("do well in website");
    }

}
package com.wt010.abstractDEMO;
/**
 * @author konecms
 * @date 2018年1月5日 上午11:34:16
 * 
 */
public class AbstractDemo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        pick(new PHP());
        pick(new JAVA());
        
    }
    public static void pick(Language l) { 
        l.explain(l.SORT);
        l.explain(l.HOW);
    }

}

 

posted on 2018-01-05 15:58  细思极恐的大橙子  阅读(139)  评论(0编辑  收藏  举报

导航