抽象类与接口

    添加时间:2013-8-6 点击量:

    抽象类就是不克不及应用new办法进行实例化的类,即没有具体实例对象的类。抽象类有点类似“模板”的感化,目标是按照其格局来创建和批改新的类。对象不克不及由抽象类直接创建,只可以经由过程抽象类派生出新的子类,再由其子类来创建对象。当一个类被声明为抽象类时,要在这个类前面加上润饰符abstract。 
    在抽象类中的成员办法可以包含一般办法和抽象办法。抽象办法就是以abstract润饰的办法,这种办法只声明返回的数据类型、办法名称和所需的参数,没有办法体,也就是说抽象办法只须要声明而不须要实现。当一个办法为抽象办法时,意味着这个办法必须被子类的办法所重写,不然其子类的该办法仍然是abstract的,而这个子类也必须是抽象的,即声明为abstract。 
    抽象类中不必然包含抽象办法,然则包含抽象办法的类必然要被声明为抽象类。抽象类本身不具备实际的功能,只能用于派生其子类。抽象类中可以包含机关办法,然则机关办法不克不及被声明为抽象。 
    调用抽象类中的办法抽象办法和非抽象办法,若是办法是static的,直接 抽象类.办法  就可以了;若是长短static的则必须须要一个持续的非抽象类,然后用这个非抽象类的实例来调用办法。 
    抽象类可以实现接口,接口中的办法 在抽象类中可以不实现,当有子类持续 抽象类时,并且子类不是抽象类时,子类须要将抽象类中的 抽象办法和接口中的办法都要实现 
    抽象类不克不及用final来润饰,即一个类不克不及既是终极类又是抽象类。 
    总结: abstract不克不及与privatestaticfinalnative并列润饰同类与办法。 



     1 package xiao.li.one;
    
    2 /
    3 接口类
    4 /
    5 interface AA
    6 {
    7 public void aa();
    8 }
    9
    10 /
    11 abstract不克不及与private、static、final、native并列润饰同类与办法。
    12 抽象类可以实现接口,接口中的办法 在抽象类中可以不实现,当有子类持续抽象类时,
    13 并且子类不是抽象类时,子类须要将抽象类中的 抽象办法和接口中的办法都实现
    14 /
    15 public abstract class 抽象类 implements AA //实现AA接口
    16 {
    17 /
    18 通俗办法
    19 /
    20 public void test()
    21 {
    22 System.out.println(可以);
    23 }
    24 /
    25 抽象办法
    26 没有办法体实现的,也就是 {}。
    27 那么这个办法是抽象办法,那子类就必须覆写它
    28 /
    29 public abstract void abstractTest();
    30 }
    31 class AbstractClass extends 抽象类
    32 {
    33 /
    34 覆写抽象类的abstractTest办法
    35 并且要有办法体
    36 /
    37 @Override
    38 public void abstractTest() {
    39 // TODO Auto-generated method stub
    40 System.out.println(覆写抽象办法);
    41 }
    42
    43 /
    44 实现AA接口的aa办法
    45 /
    46 @Override
    47 public void aa() {
    48 // TODO Auto-generated method stub
    49 System.out.println(我是AA接口的aa办法);
    50 }
    51 }


     接口


    接口也是抽象类的一种是一种特别的抽象类,它比抽象类更抽象。比如我们日常平凡听到的那些电脑上的USB接口并不是我们所见到的插槽,而是那个插槽遵守的一种规范罢了,而我们看到的插槽只是按照USB规范设计出来的对象罢了,也就是说插槽是USB的实例,若是想要应用这个插槽那么这些电脑设备就必必要遵守这个USB规范来设计这个插槽。


    接口只定义了类该当遵守的规范,却不关怀类的内部实现。接口只是规定了这个类必须供给的办法,从而实现了规范与实现的分别,加强了体系的可拓展性与保护性


    接口特点:


    1Java接口中的成员变量默认都是public,static,final类型的都可省略),必须被显示初始化即接口中的成员变量为常量大写单词之间用_分隔


    2Java接口中的办法默认都是public,abstract类型的都可省略),没有办法体不克不及被实例化


    3Java接口中只能包含public,static,final类型的成员变量和public,abstract类型的成员办法


    4、接口中没有机关办法不克不及被实例化


    5、一个接口不克不及实现(implements)另一个接口但它可以持续多个其它的接口


    6Java接口必须经由过程类来实现它的抽象办法


    7、当类实现了某个Java接口时它必须实现接口中的所有抽象办法不然这个类必须声明为抽象类


    8、不容许创建接口的实例实例化),但容许定义接口类型的引用变量该引用变量引用实现了这个接口的类的实例


    9、一个类只能持续一个直接的父类但可以实现多个接口间接的实现了多持续.


     



     1 package xiao.li;
    
    2 public class 接口 {
    3 public static void main(String[] args)
    4 {
    5 //实例化接口A,这是错的...接口不克不及实例化,
    6 //A a = new A();
    7 //若是想要实例接口必须经由过程一个类来持续这个接口,随后实例这个类就可以了,如下
    8 A a = new D();
    9 a.a();//输出成果:实现接口A的抽象办法
    10 }
    11 }
    12 /
    13 接口A,这里的接口A不写接见润饰符,默认为public
    14 /
    15 interface A
    16 {
    17 //Integer number;//这个不赋初始值是错误的
    18 Integer number=15;//接口里的成员变量默认为public,static,final润饰(可省略),也就是常量,不成改变的
    19 StringBuffer sb =new StringBuffer(ad);//夸大的是,引用类型的话常量,值是可以改变的,然则地址簿可改变
    20 void a();//void a();==public abstract void a();
    21 //public void test(){}//是错的,接口内不成以有通俗办法
    22 }
    23 interface B
    24 {
    25 // public B(){} 机关办法, 这是错误的,接口内没有机关办法
    26 void b();//接口里的抽象办法默认是public,abstract润饰的,也只能用public接见润饰符.实现这个接口的类必须实现它
    27 }
    28 /
    29 接口C持续了A,B接口,接口支撑多持续,然则不克不及持续类,同样类也不克不及持续接口
    30 /
    31 interface C extends A,B
    32 {
    33 void c();
    34 }
    35 //那么D类实现了ABC接口,那么就必须覆写这3个接口的抽象办法,若是它不想覆写这些办法的话那就必须是抽象类
    36 class D implements A,B,C
    37 {
    38
    39 @Override
    40 public void c() {
    41 // TODO Auto-generated method stub
    42 System.out.println(覆写接口C的抽象办法);
    43 }
    44
    45 @Override
    46 public void b() {
    47 // TODO Auto-generated method stub
    48 System.out.println(覆写接口B的抽象办法);
    49 }
    50
    51 @Override
    52 public void a() {
    53 // TODO Auto-generated method stub
    54 System.out.println(覆写接口A的抽象办法);
    55 }
    56 }


     


    小结

      1.抽象类 在 Java 说话中默示的是一种持续关系,一个类只能应用一次持续关系。然则,一个类却可以实现多个接口。

      2.抽象中可以有本身的数据成员,也可以有非抽象的成员办法,而在interface中,只可以或许有静态的不克不及被批改的数据成员(也就是必须是static final的,不过在 interface中一般不定义数据成员),所有的成员办法都是abstract的。

      3.abstract classinterface所反应出的设计理念不合。其实abstract class默示的是is-a关系,interface默示的是like-a关系。 

      4.实现抽象类和接口的类必须实现此中的所有办法。抽象类中可以有非抽象办法。接口中则不克不及有实现办法。

      5.接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不克不及从头定义,也不克不及改变其值。

      6.抽象类中的变量默认是 friendly 型,其值可以在子类中从头定义,也可以从头赋值。 

      7.接口中的办法默认都是 public,abstract 类型的。


      结论
      abstract class 和 interface 是 Java说话中的两种定义抽象类的体式格式,它们之间有很大的类似性。然则对于它们的选择却又往往反应出对于题目范畴中的概 念本质的懂得、对于设计意图的反应是否正确、公道,因为它们发挥解析了概念间的不合的关系(固然都可以或许实现需求的功能)。这其实也是说话的一种的惯用法,读者伴侣可以或许细细领会。


    容易发怒的意思就是: 别人做了蠢事, 然后我们代替他们, 表现出笨蛋的样子。—— 蔡康永
    分享到: