java 接口 实现和继承关系

2 篇文章 0 订阅
2 篇文章 0 订阅
a、接口是常量值和方法定义的集合。接口是一种特殊的抽象类。

b、java类是单继承的。classB Extends classA

c、java接口可以多继承。Interface3 Extends Interface0, Interface1, interface……


       不允许类多重继承的主要原因是,如果A同时继承B和C,而b和c同时有一个D方法,A如何决定该继承那一个呢?

       但接口不存在这样的问题,接口全都是抽象方法继承谁都无所谓,所以接口可以继承多个接口。

一。抽象类

        有时候,我们需要构造一个很抽象的父类对象,它可能仅仅代表一个分类或抽象概念,它的实例没有任何意义,因此不希望它能被实例化。

        例如:一个父类“水果(Fruit)”,它有几个子类“苹果(Apple)”、“橘子(Orange)”、“香蕉(Banana)”等。水果在这里仅仅只是作为一个子类,显然水果的实例没有什   么意义(就好像一个人如果告诉你他买了一些水果但是却不告诉你是苹果还是橘子,你很难想象他到底买的是什么。)。而水果类又要能被子类化,这就要求我们使用抽象类 (abstract class)来解决这个问题。
     在java中,通过在class关键字前增加abstract修饰符,就可以将一个类定义成抽象类。抽象类不能被实例化。

     例如:
          定义抽象类水果(Fruit)
          public abstract class Fruit {
                  ……
          }
           如果我们试图用以下语句来获得一个实例,将无法编译成功。
           Fruit fruit = new Fruit();

    而我们仍然可以构造水果类的子类,如:
          子类“苹果(Apple)”
           public class Apple extends Fruit {
                   ……
           }
          子类“橘子(Orange)”
           public class Orange extends Fruit {
                   ……
           }
   这样就达到我们的目的了。

   我们可以:

    Fruit  f  = new Apple()

   Apple a = new Apple()

 抽象类除了能象普通类一样可以拥有一般的属性和方法,也可以拥有抽象方法(abstract method)。例如:
           抽象类“形状(Shape)”拥有抽象方法draw()。
           public abstract class Shape {
                  ……
                  public abstract void draw();
                  ……
           }
  抽象方法与抽象的行为相对应,通常是这个行为对父对象没有意义,而子对象有具体动作。例如:

   方法draw()对于类Shape没有意义,而类Shape的子类矩形(Rectangle)的方法draw()可以有实际的动作(根据矩形的四个顶点画出矩形的四个边),

   子类圆(Circle)的方法draw()也可以有实际的动作(根据圆心和半径画出圆周)。


 抽象类可以有抽象方法也可以没有抽象方法;但是如果一个类有抽象方法,那这个类只能定义为抽象类。
           如果按照以下代码类“形状(Shape)”仍然拥有抽象方法draw(),但没有定义为抽象类,将会编译失败。
           public class Shape {
                  ……
                  public abstract void draw();
                  ……
           }
  抽象方法还有一个特点是,它强迫子类要么仍然保持抽象性(即不具体实现该方法并仍然定义为抽象类),要么具体表现出这个方法的行为(实现具体的动作或者通过抛出UnsupportedOperationException异常来表明不支持该行为)。这样也可以强化多态性。


二 接口

  java语言使用关键字interface定义一个接口。接口也是抽象对象,它甚至比抽象类更抽象。接口中的方法都是抽象方法。
 一个接口可以继承其他接口;一个类通过关键字implements声明要实现一个接口,并具体实现接口的方法。
           例如:有一个接口A,
   public   interface A {   
          void  methodA();   
    }  
           类AA实现接口A。

public   class AA  implements A {   
          public   void  methodA() {   
               System.out.println( "methodA of ClassA implements InterfaceA" );   
         }   
}  
 
如果是抽象类实现一个接口,那么抽象类中可以不具体实现接口的方法(保持其抽象性),而由其子类去实现。
           抽象类B实现接口A,但是没有具体实现方法methodA(),

public   abstract   class  B  implements A{       

     public abstract void draw();

    }  
 
 抽象类B实现接口A,但是没有具体实现方法methodA(),(保持其抽象性)

public   class  BB extends B{   
         public   void  methodA() {   
              System.out.println( "methodA of ClassBSub the subclass of ClassB" );   
        }    

   void draw(){

             System.out.println( "run  B" );   

    }
}  

 子类BB继承B,实现A的方法methodA()和具体表现出draw()方法的行为

接口和抽象类显著的共同点是接口和抽象类都可以有抽象方法。
接口和抽象类的不同点有:
           (1)抽象类可以有实例变量,而接口不能拥有实例变量,接口中的变量都是静态(static)的常量(final)。
           (2)抽象类可以有非抽象方法,而接口只能有抽象方法。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值