zoukankan      html  css  js  c++  java
  • JAVA抽象类与接口的详细解读与示例

      

        接口存在的原因:

        JAVA是单继承的,不支持多继承,但是有了接口,JAVA可以实现多个接口;

        一个类要是实现某一个接口就必须实现接口内声明的所有方法(强迫执行,即便是空方法,也要实现);

        接口特点:

       1.接口内所有方法只有声明,没有方法体(隐式声明),例如:public abstract void func();

       2.接口内的所有变量都默认是public static final ,必须被显示初始化;

       3.接口没有构造方法,不能被实例化;

       4.实现接口的类要实现所有的抽象方法,否则该类就必须声明为抽象类,加上 abstract关键字;

       5.接口不可以实现接口(所有接口都是抽象方法嘛),但是接口支持多继承哟!

        那么有接口要抽象类做什么呢?

        首先我们认识一下抽象类

        1.抽象类内允许有一般变量和一般方法;

        2.抽象类必须有abstract关键字;

        3.抽象类里面可以没有抽象方法,但是即便如此,也不能实例化;(有抽象方法的一定是抽象类)

        4.抽象类虽然不能被实例化,但是有构造方法(派生类可以扩展)

        好了那么说一说抽象类,怎么用呢,什么时候用抽象类???

        当有多个类实现同一个接口的时候,那么每个类都把那一个接口的所有方法实现了(如上文:实现接口,必须实现接口的所有方法);

        那么如果有几个方法,在这几个子类中的实现完全一样,我们就可以用抽象类来把这些方法单独拿出来作为公共方法;

        由抽象类来实现接口内,这些子类的公共方法(就是实现方式完全一样的),然后这些子类只要继承这个抽象类就OK了。

       

        那么接口和抽象类应用逻辑就出来了

        第一步,先写一个接口,声明实现这个接口应该要做的所有方法;

        第二步,这个接口的实现有公用的部分,用抽象类来实现,这样抽象类里有所有方法的声明,以及公共方法的实现,所以简化了接口的实现

        第三步,派生类只要继承并实现抽象类就OK!

        

        以上文字如果觉得,有点绕,那么请看代码示例:

        先声明一个接口

      public interface InterExample{// 声明一个接口
    
             public abstract  void  function1();
    
             public abstract  void  function2();
      
             public abstract  void  function3();
    
             public abstract  void  pubFunct();  // 公用方法声明
    
      }
    
     
    

      声明抽象类,实现上面的接口

    public abstract class AbsExample  implements InterExample{
          //  实现公用方法
          public void pubFunction(){
              System.out.println("这是派生类的公用方法");
          }//
    }
    

     一般类(继承了抽象类的派生类)

    public class ExampleA extends AbsExample{
            public abstract  void  function1(){
                System.out.println("A派生类个性化使用的方法1");
            }
    
            public abstract  void  function2(){
                System.out.println("A派生类个性化使用的方法2");
            }
      
            public abstract  void  function3(){
                System.out.println("A派生类个性化使用的方法3");
            }
    }

      

    public class ExampleB extends AbsExample{
            public abstract  void  function1(){
                System.out.println("B派生类个性化使用的方法1");
            }
    
            public abstract  void  function2(){
                System.out.println("B派生类个性化使用的方法2");
            }
      
            public abstract  void  function3(){
                System.out.println("B派生类个性化使用的方法3");
            }
        
    }
    

    代码里面看到:公共方法即:pubFunction(),在抽象类内实现了,ExampleA,ExampleB公用,没有必要在ExampleA、ExampleB两个类内分别各写一遍相同的实现代码了;

    另外:如果增加子类ExampleC,pubFunction()的实现和ExampleA、ExampleB不同,那么只要在ExampleC内重写一遍该方法就好,依然保持灵活。

    重新整理的抽象类和接口,希望能为大家答疑解惑!

        

       

  • 相关阅读:
    wordPress屏蔽中国境内的IP
    中国IP地址大全
    WebGL之点精灵的旋转(Rotation Sprite)
    WebGL之点上添加图片(using texture on point)
    potree--加载二进制格式文件
    potree--如何控制八叉树子节点的显示?
    重启tomcat后,访问登陆接口响应慢--Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [27,572] milliseconds.
    Unirest
    配置规范
    函数编写建议
  • 原文地址:https://www.cnblogs.com/maxm/p/6151948.html
Copyright © 2011-2022 走看看