到底接口是什么呢?它是一种100%纯抽象的类。什么是抽象类?它是无法初始化的类。
有些类不应该被初始化!
防止类被初始化,让这个类不能被“new”出来。通过标记类为抽象类的,编译器就知道不管在哪里,这个类就是不能创建任何类型的实例,但可以用这种抽象的类型作为引用类型。
abstract class Canine extends Animal {
public void roam() { }
抽象的方法
除了类之外,你也可以将方法标记为 abstract的。抽象的类代表此类必 须要被 extend过,抽象的方法代表此方法一定要被覆盖过。
抽象的方法没有实体!
ublic abstract void eat();
如果你声明出一个抽象的方法,就必须将类也标记为抽象 的。你不能在非抽象类中拥有抽象方法。
为什么要有抽象的方法?
为了多态!记住,你想达成的目标是要使用父型作为方法的参数、返回类型或数组的类型。通过这个机制,你可以加入新的子型到程序中,却又不必重写或修改处理这些类型的程序。因此多态的好处就在于所有子型都会有那些抽象的方法。
必须实现抽象方法
抽象的方法没有内容,它只是为了标记出多态而存在。这表示在继承树结构下的第一个具体类必须要实现出所有的抽象方法。
然而你还是可以通过抽象机制将实现的负担转给下层。例如说将Animal与Canine都标记为abstract,则Canine就无需实现出Animal的抽象方法。但具体的类,例如说D0g,就得实现出Anima和Canine的抽象方法。
记得抽象类可以带有抽象和非抽象的方法,因此Canine也可以实现Animal的抽象方法,让Dog不必实现这个部分。如果Canine没有对Animal的抽象类表示出任何意见,就表示Dog得自己实现出Anima的抽象方法。
当我们谈到“你必须实现所有抽象的方法”时,表示说你必须写出内容。你必须以相同的方法鉴名(名称与参数)和相容的返回类型创建出非抽象的方法。Java很注重你的具体子类有没有实现这些方法。
终极对象
从ArrayList< Object>取 出的 Object都会被当作是 Object这个类的实例。编 译器无法将此对象识别为 Object以外的事物。
当你把对象装进ArrayList<Object>时,不管它原来是什么,你只能把它当作是Object。
从ArrayList<Object>取出引用时,引用的类型只会是Object.
这代表你只会取得Object的遥控器。
接口
接口可以用来解决多重继承的问题却又不会产生致命方块这种问题.
//接口的定义,使用“interbace”来取代“class”
public interface Pet {……}
//接口的实现:
public class Dog extends Canine implements Pet {……}
要如何判断应该是设计类、子类、抽象类或接口呢?
1.如果新的类无法对其他的类通过IS-A测试时就设计不继承其他类的类。
2.只有在需要某类的特殊化版本时,以覆盖或增加新的方法来继承现有的类。
3.当你需要定义一群子类的模板,又不想让程序员初始化此模板时,设计出抽象的类给它们用。
4.如果想要定义出类可以扮演的角色,使用接口。
要点
- 如果不想让某个类被初始化,就以abstract这个关键词将它标记为抽象的。
- 抽象的类可以带有抽象和非抽象的方法。
- 如果类带有抽象的方法,则此类必定标识为抽象的,
- 抽象的方法没有内容,它的声明是以分号结束,
- 抽象的方法必须在具体的类中运行。
- Java所有的类都是Object(java.lang.Object)直接或间接的子类。
- 方法可以声明Object的参数或返回类型。
- 不管实际上所引用的对象是什么类型,只有在引用变量的类型就是带有某方法的类型时才能调用该方法。
- Obiect引用变量在没有类型转换的情况下不能赋值给其他的类型,若堆上的对象类型与所要转换的类型不兼容,则此转换会在执行期产生异常。
- 类型转换的例子:Dogd=(Dog)x.getobject(aDog);
- 从ArrayList<Obiect>取出的对象只能被Object引用,不然就要用类型转换来改变。
- Java不允许多重继承,因为那样会有致命方块的问题。
- 接口就好像是100%纯天然抽象类。
- 以interface这个关键词取代class来声明接口
- 实现接口时要使用implements这个关键词。
- 例如:Dog implements Pet
- class可以实现多个接口。
- 实现某接口的类必须实现它所有的方法,因为这些方法都是public与abstract的。
- 要从子类调用父类的方法可以用super这个关键词来引用。例如:super.RunReport();