Java之接口,抽象类,内部类

1.接口(interface),接口被用来建立类与类之间关联的标准。

Java code
public interface ITest{
       public void test();
}
public class TestImpl implements ITest{
       public void test(){
              System.out.println( " test " );
       }
 }


2.抽象类(abstract class),只要类中有一个抽象方法,此类就被标记为抽象类。实际上抽象类除了被继承之外没有任何意义。

区别
1.
接口是公开(public)的,里面不能有私有的方法或变量,是用于让别人使用的,实现接口的一定要实现接口里定义的所有方法。
而抽象类是可以有私有方法或私有变量的,实现抽象类可以有选择地重写需要用到的方法,但是必须实现里面所有的抽象方法。
2.
抽象类在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。
但是,一个类却可以实现多个interface(java中实现多重继承的方法之一)。
3.
抽象类中可以有自己的数据成员,也可以有非abstarct的成员方法。
而在接口中,只能够有静态的不能被修改的数据成员(也就是必须是 static final的,不过在 interface中一般不定义数据成员),而且所有的成员方法都是抽象的。
4.
抽象类和接口所反映出的设计理念不同。
其实abstract class表示的是"is-a"关系,interface表示的是"like-a"关系。(组合是"has a"关系)
5.
接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。
抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。

一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现。不是很建议具体类直接实现接口的。还有一种设计模式是面向接口编程,而非面向实现编程。

其实接口是抽象类的延伸,可以将它看做是纯粹的抽象类,就是说接口比抽象类还抽象,还有设计接口的目的就是为了实现C++中的多重继承,不过java团队设计的一样更有趣的东西来实现这个功能,那就是内部类(inner class)。

内部类(inner class)

Java code
public class OuterClass{ // 外部类 private class InnerClass{} // 内部类 }



一.定义
放在一个类的内部的类我们就叫内部类。
二.作用
1.内部类可以很好的实现隐藏,也就是封装性。一般的非内部类,是不允许有 private 与protected权限的,但内部类可以
2.内部类拥有外围类的所有元素的访问权限
3.可以实现多重继承(这个特点非常重要,个人认为它是内部类存在的最大理由之一)
4.可以避免修改接口而实现同一个类中两种同名方法的调用
三.多重继承的实现

类一  

Java code
public class Example1 {
        public String getName() {
              return " luffyke " ;
       }
}

 

类二  

Java code
public class Example2 {
        public int getAge() {
               return 25 ;
       }
}



类三



 

Java code
public class MainExample {
        public class Test1 extends Example1 {
              public String getName() {
                     return super .getName();
              }
        }
        public class Test2 extends Example2 {
               public int getAge() {
                       return super .getAge();
               }
        }
         public String showName() {
                return new Test1().getName();
        }
         public int showAge() {
               return new Test2().getAge();
        }
         public static void main(String args[]) {
               MainExample example = new MainExample();
               System.out.println( " 姓名: " + example.showName());
               System.out.println( " 年龄: " + example.showAge());
        }
}



大家注意看类三,里面分别实现了两个内部类 Test1,和Test2 ,Test1类又继承了Example1,Test2继承了Example2,这样我们的类三MainExample就拥有了Example1和 Example2的方法和属性,也就间接地实现了多继承。

 

**********************************************************************************************

在Java语言中,abstract class 和interface 是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于abstract class和interface的选择显得比较随意。其实,两者之间还是有很大的区别的,对于它们的选择甚至反映出对于问题领域本质的理解、对于设计意图的理解是否正确、合理。本文通过对灯(Light)这个事物的分析来说明我对抽象类和接口的理解。

在我们的问题的领域中有一个关于Light的抽象概念,该Light具有执行两个动作open和close,此时我们可以通过abstract class来定义一个表示该抽象概念的类型,定义如下:

abstract class Light {
    abstract void open();  // 开灯
    abstract void close();  // 关灯
}

红绿灯、霓虹灯等属于灯这个范畴的一种,它们必须有转换颜色这一功能,但我们不能把这一功能方法加入到我们的抽象类中,因为并不是所有的灯的都有转换颜色这一功能,在不违背接口隔离原则(ISP)这一前提下,我们需要颜色转换器的功能接口,定义如下:

interface ColorConverter {
    public void convert();
}

那么我们的红绿灯可以定义为:

class TrafficLight extends Light implements ColorConverter {
    void open() {...}
    void close() {...}
    void convert() {...}
}

我对设计的理解是:TrafficLight在概念本质上是Light,同时它又具备转换颜色的功能。abstract class 在Java语言中表示一种继承关系,而继承关系在本质上是“is-a”的关系,所以对于Light这个概念,我们应该使用abstract class方式来定义。另外,TrafficLight又具有转换功能,说明它又能够完成颜色转换器概念中定义的行为,所以颜色转换器可以通过interface来定义。

这种实现方式基本上能够明确的反映出我们对于问题领域的理解,正确的揭示我们的设计意图。其实abstract class表示的是"is-a"关系,interface表示的是"like-a"关系,大家在选择时可以作为一个依据,当然这是建立在对问题领域的理解上的,比如:如果我们认为TrafficLight在概念本质上是颜色转换器,同时又具有Light的功能,那么上述的定义方式就要反过来了。

小结
1.abstract class 在Java 语言中表示的是一种继承关系,一个类只能有一次继承关系。但是一个类却可以实现多个interface。
2.在abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是static final的,不过在 interface中一般不定义数据成员),所有的成员方法都是abstract的。
3.abstract class和interface所反映出的设计理念不同。其实abstract class表示的是"is-a"关系,interface表示的是"like-a"关系。
4.实现抽象类和接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法。接口中则不能有实现方法。
5.接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。
6.抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。
7.接口中的方法默认都是 public,abstract 类型的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值