zoukankan      html  css  js  c++  java
  • JAVA之抽象类与抽象方法

    抽象方法:在类中没有方法体的方法,就是抽象方法。
    抽象类:含有抽象方法的类就叫抽象类。
    |||||||||抽象类不能被实例化(new)
    为什么要使用抽象方法?
    (以下是个人观点)
    因 为在面向对象的编程的思想中,任何事物都可以看做是一个类。例如:每个动物都需要休息,都要睡觉(sleep),而不同的动物有不同的睡觉方法,如,蝙蝠 是倒挂在树上睡,小狗是爬着睡,蛇是盘着睡……等等。由此可以看出,每种动物的睡觉的方式都不一样,但转过头来思考,他们又确实都是在做着同一件事情 (sleep)。因此,在JAVA中引入了抽象类这个概念。就是说,父类中的某些方法不包含任何逻辑(例如上面例子中的sleep方法),并且需要由子类 重写(例如蝙蝠是挂着睡……)。在这种情况下,我们就应该把这些具有共同特征的方法抽象出来,由子类负责这些抽象方法的实现细节。而父类仅提供此方法的名 称和声明、没有方法的主体。因此子类负责重写此方法。所以这就是为什么要使用抽象方法!(个人观点,不知道对不对?)
    ============================================
    如下代码:
    -----------------------------
    class boar
    {
    abstract void sleep();
    }
    -----------------------------
    这段代码中的类boar里面有个抽象(abstract)方法sleep(),可以看到这个方法后面没有方法体,而是用一个“;”号结束。那么这种方法就叫做抽象方法。
    如果编译这段代码的话,会提示如下错误:
    ----------------------------------------------------------------
    boar.java:1: boar 不是抽象的,并且未覆盖 boar 中的抽象方法 sleep()
    class boar
    ^
    1 错误
    ----------------------------------------------------------------
    意思是说:boar这个类不是抽象的。为什么呢?因为前面在给抽象类下定义的时候就说过,含有抽象方法的类就叫抽象类。因此,boar这个类必须也是抽象的!
    所以应改为如下代码:
    -----------------------------
    abstract class boar
    {
    abstract void sleep();
    }
    -----------------------------
    如果这次编译的话,就不会提示任何错误了。
    ============================================
    来看如下代码:
    -------------------------------------------------------------------
    abstract class allsleep
    {
    abstract void sleep();
    }
    class owl extends allsleep
    {
    void sleep()
    {
        System.out.println("我是猫头鹰,我是站在树上睡的");
    }
    }
    class bat extends allsleep
    {
    void sleep()
    {
        System.out.println("我是蝙蝠,我是倒挂在树上睡的");
    }
    }
    public class newsleep
    {
    public static void main(String[] sl)
    {
        owl objowl=new owl();
        bat objbat=new bat();
        objowl.sleep();
        objbat.sleep();
    }
    }
    -------------------------------------------------------------------
    编译不会出错,打印的结果为:
    ----------------------------
    我是猫头鹰,我是站在树上睡的
    我是蝙蝠,我是倒挂在树上睡的
    ----------------------------
    但如果把代码改为如下:
    -------------------------------------------------------------------
    abstract class allsleep
    {
    abstract void sleep();
    }
    class owl extends allsleep
    {
    /*void sleep()
    {
        System.out.println("我是猫头鹰,我是站在树上睡的");
    }*/
    }
    class bat extends allsleep
    {
    /*void sleep()
    {
        System.out.println("我是蝙蝠,我是倒挂在树上睡的");
    }*/
    }
    public class newsleep
    {
    public static void main(String[] sl)
    {
        /*owl objowl=new owl();
        bat objbat=new bat();
        objowl.sleep();
        objbat.sleep();*/
    }
    }
    -------------------------------------------------------------------
    编译的时候JVM会提示如下:
    --------------------------------------------------------------------------
    newsleep.java:5: owl 不是抽象的,并且未覆盖 allsleep 中的抽象方法 sleep()
    class owl extends allsleep
    ^
    newsleep.java:12: bat 不是抽象的,并且未覆盖 allsleep 中的抽象方法 sleep()
    class bat extends allsleep
    ^
    2 错误
    --------------------------------------------------------------------------
    意思是说:owl类和bat类都没有实现allsleep中的sleep()方法,而只是麻木的继承了过来
    因此得到结论:抽象类中的抽象方法必须被实现!
    那么为了证实这个结论,再写一段代码,如下:
    ---------------------------------------------
    abstract class allsleep
    {
    void eat()
    {
        System.out.println("我会吃");
    }
    }
    class owl extends allsleep
    {
    }
    class bat extends allsleep
    {
    }
    ---------------------------------------------
    从上面的代码我们可以看到抽象类allsleep中没有抽象方法,而我们在子类中也没有实现allsleep类中的eat()方法,因此,这便证实了我们上面的结论:抽象类中的抽象方法必须被实现!
    =====================================================
    话说回来,如果一个子类没有实现父类中的抽象方法呢?
    来做个实验吧:
    -------------------------------
    abstract class allsleep
    {
    abstract void sleep();
    }
    class owl extends allsleep
    {
    }
    class bat extends allsleep
    {
    }
    -------------------------------
    我们编译这段代码的结果会是怎样的呢?
    其实这个实验已经做过了,在上上一个例子里,把owl类和bat类中的内容都屏蔽了,跟这个是一个效果。也就是说:抽象类中的抽象方法必须被实现!
    那么如果我们不想实现的话该怎么办呢?很简单,只要把子类也声明为一个抽象类就OK了!
    因此我们得到结论:如果一个子类没有实现父类中的抽象方法,则子类也成为了一个抽象类!
    最后来总结下:
    ----------------------------------------------------------------
    抽象方法:在类中没有方法体的方法,就是抽象方法。
    抽象类:含有抽象方法的类就叫抽象类。
    抽象类中的抽象方法必须被实现!
    如果一个子类没有实现父类中的抽象方法,则子类也成为了一个抽象类!
    抽象类中的普通方法,可以不必实现。

  • 相关阅读:
    js 变量提升和函数提升原理
    解析PHP中intval()等int转换时的意外异常情况
    不要太相信自己的眼睛
    遇到乱码时的一些想法
    c++ --> 变量、常量与运算符
    [ActionScript3.0] 逻辑或"||=" ,等于"=="和全等于"==="
    [ActionScript3.0] 传递任意数量的参数
    [ActionScript3.0] 深表复制
    [ActionScript3.0] 为内建类添加方法
    Jmeter之内存溢出解决办法
  • 原文地址:https://www.cnblogs.com/milantgh/p/4036918.html
Copyright © 2011-2022 走看看