接口:当抽象类的方法都是抽象的时候,这时可以把该类定义成接口的形式。你可以先期将接口理解为特殊的抽象类。 Eg.接口特点: 1,接口的方法都是抽象的。 2,接口不可以被实例化。 3,只有子类实现了接口中的所有抽象方法后,该子类才可以实例化,否则该类还是一个抽象类。 格式特点: 当定义接口时,接口中的常见的成员有两种: 1,全局常量。 2,抽象方法。 而且接口中的成员都有固定的修饰符: 全局常量:public static final 成员方法:public abstract 这修饰即使不写,系统也会自动加上。 建立一定书写,因为可以提高程序的阅读性。你会发现,接口中定义的成员都有一个共同的特点:都是public权限的。 继承和实现的一点小区别: 类与类之间称为继承:因为该类无论是抽象的还是非抽象的,它内部可以定义非抽象方法,这个方法可以直接被子类使用,所以子类继承就可以应用了。类与接口是实现关系:因为接口中的方法全都是抽象的,必须由子类实现完才可以实例化。所以就用了更确切的关键字:implements来表示
例子1.接口的引例实例演示。
类只能单继承,而接口可以被多实现。 java将多继承机制进行改良,通过多实现接口的形式来体现。 为什么不支持多继承呢? 因为当多个父类中定义了相同方法,而方法内容不同是,子类对象在调用该方法时,不明确要运行哪一个,有安全隐患,也就是不确定性。而接口进行多实现就没有这个问题了,因为接口中的方法都没有主体。接口的另一个好处:一个类在继承另一个类的同时可以实现多个接口.接口的出现就避免了单继承的局限性。父类中定义的该对象的基本功能,而接口中定义的是该对象的扩展功能。
例子2.接口的多实现的实例演示。
抽象类和接口的区别: 1.抽象类只能被单继承。 接口可以被多实现。 2.抽象类中可以定义非抽象方法,直接被子类使用。 接口中只有抽象方法,必须被子类实现后才可以被使用。 3.抽象类中定义体系中的基本共性功能。 接口中通常定义体系中对象的扩展功能。 4.接口的出现避免了单继承的局限性。 5.抽象类被继承,是 is a 关系: xx1是xx2中的一种。 接口可以被实现,是 like a关系:xx1像xx2 中的一种。
例子3:抽象类和接口的整合实例演示。
类与类之间是继承关系。类与接口之间是实现关系。 接口与接口之间继承关系,通过接口可以多继承。 Java支持多继承,在类上,Java的多继承是不允许的,因为存在着不确定性。但是,在接口上可以存在多继承的。例子4:接口的多实现的实例演示。
猫,狗:这些事物都称为动物。 动物这种类型:有多种体现的形态。 一个具体的动物,具备多种体现类型。(猫:称为猫或动物) 猫这个具体对象,它既可以称之为猫,也可以称之为动物。 class 动物{ } class 猫 extends 动物{ } 猫 x = new 猫(); 动物 y = new 猫(); class 狗 extends 动物{ } 狗 x = new 狗(); 动物 y = new 狗(); 多态: 1,在程序中的体现:父类引用或者接口引用指向了自己的子类对象。 2,好处:提高了代码的扩展性,后期的可维护性 3,前提: 1)类与类之间必须有继承关系或者实现关系。 2)通常都需要进行覆盖。 4,弊端: 进行多态应用时,前期并不知道后期会有多少个子类出现,但是可以使用父类的引用来调用父类的方法。而后期哪个子类对象出现就执行哪个子类的具体方法实现。这就是程序的扩展性。 但是,前期调用的时候,只能调用父类中的方法,而不能调用具体子类的特有方法。因为前期还不知道具体的子类是谁。 多态的思想: 以前:定义对象,并指挥对象做事情(调用对象方法)当对象多了以后,指挥动作就会变的很麻烦。这时重新思考这个问题。找到这些对象的共性类型。直接指挥这个共性类型做事情即可。这样凡是属于这个类型的个体都会执行。 比如:建立猫对象,调用猫的eat方法。建立狗对象调用eat方法。很麻烦。 找到猫和狗的共性类型:动物。只要指挥动物的eat方法。即可。这样猫和狗都会进行eat动作。
例子5:多态的演示程序。
在转型过程中,其实都是子类对象在做着变化。当你想使用子类的特有功能时,需要将父类型转成子类型才可以使用。注意:必须保证,这个父类型指向的是该子类型的对象. 例子6:多态中的对象的向上转型和向下转型的实例演示。
可以对传入的对象进行类型的判断。通过一个关键字来完成 instanceof : 对象instanceof 类型用于判断该对象是否所属于该类型。
例子7:判断对象类型是否属于指定的类型。
接口的基本思想: 举例说明:主板的例子。 接口的三个特性: 1.接口就是对外暴露的规则。 2.接口是功能的扩展。 3.接口的出现降低了耦合性(紧密联系程度降低),耦合性的降低就实现了模块化的开发,叫做开发前定义好规则,你在实现规则,我在使用规则,至于怎么实现的和我没关系。我只要知道这个规则即可。 面试回答:电脑的机箱 电源插孔的例子 笔记本的例子 主板的例子 例子8:主板运行和PCI结合的实例演示。
例子9:数据库使用接口的实例演示。
多态中的细节。 在多态中: 成员变量: 编译时期:看的引用型变量所属的类中是否有所调用的变量. 运行时期:也是看引用型变量所属的类是否有调用的变量。 简单一句话:成员变量,无论编译还是运行都看引用型变量所属的类。 更简单的话:成员变量,编译和运行都看等号 的左边。 成员函数: 编译时期:看的引用型变量所属的类中是否有调用的方法。 运行时期:看的对象所属的类中是否有调用的方法, 如果父子出现同名方法,会运行子类中的方法。因为方法有覆盖特性。 简单说:对于成员函数,编译看左边,运行看右边。 其实非静态函数,在内存有一个动态绑定机制。其实就是f指向了具体的子类对象。编译看到的f所属的Fu类中是否有这个方法。运行的时候f就绑定到了一个具体的子类对象上,子类对象运行时会覆盖父类中的相同方法,而运行子类的内容。 静态函数: 编译时期:看的是引用型变量所属的类中是否有调用的方法。 运行时期:也是看的是引用型变量所属的类中是否有调用的方法。 简单说: 对于静态函数,编译看左边,运行也看左边. 静态函数存放于每一个所属类的静态区中,它是被静态绑定,就是类一加载,就已经有固定所属的调用就是那个类名。 整体总结: 成员变量和静态成员:编译和运行都看左边。 只有非静态的成员函数:编译看左边,运行看右边。 当定义功能时,该功能中有一部分功能是确定,一部分功能是不确定的。 这时将不确定的部分通过一个函数暴露出去,延迟到子类去完成。这时我们发现解决这类功能部分明确部分不明确需求,用这个思想就可以很高效。这个思想就成了一个解决该类问题就有效的方案。起个名字就叫做:模版方法设计模式。例子10:模版方法设计模式的实例演示。