多态(狭义,应即Override)
- 子类拥有父类的全部可继承方法(public, protected),并且可以重写(override)父类的方法。
注意:
- 参数必须一样
- 返回类型必须兼容,即子类返回类型必须与父类一样或是父类返回类型的子类
抽象类 (abstract class)
- 宽泛而不应该被实例化的类,要标记为抽象类
- 抽象类仍然可以作为引用类型,但是编译器不会让它实例化。
e.g.
Animal a //抽象类作为引用类型;
a = new tiger() // 赋值子类对象给父类引用;
a = new Animal() // WRONG! 不能初始化抽象类型;
- 抽象类必须要被继承(extends)
- 抽象类中可以有非抽象方法
抽象方法(abstract method)
- 方法也可以被标记为抽象,抽象方法必须要被重写(override)
- 抽象方法没有实体!
e.g.
public void eat();//eat()方法没有方法体,直接以分号结束
- 抽象方法只能存在于抽象类中,不能存在于具体类中
抽象类与抽象方法总结
- 抽象类规定了子类的变量与行为,子类必须要重写所有抽象方法。抽象类起的作用其实是协议。在OC中,接口被直接称之为Protocol
Object类
- Object类不是抽象类
- Object类中有些方法可以被覆盖,有些被标记为(final)不可以覆盖,强烈建议覆盖的方法:hashCode();toString();equals();
- Java是强类型语言
Object o = new cat();//o被引用到Object对象,只能调用Object的方法
o.eat();//非法!编译器通不过
编译器根据引用类型来判断有哪些method可以调用,而不是对象确实的类型。
- e.g.
Object o = new Dog(); //虽然指向的是Dog类型的对象, //但是引用类型是Object,所以只能调用Object的method Animal a = new Dog();//a只能调用Animal的方法
- 如果想要调用Dog的方法,可以把a**强制转换**为Dog
Animal a = new Dog(); //a.bark();//编译器通不过! Dog d = (Dog)a; d.bark(); //(前提是你要确定这是一个Dog)
接口(Interface)
- 接口可以理解为是一个100%纯抽象的类,里面只有抽象方法(abstract method)
- 接口可以理解为“模板”或“协议”,定义了某个类可以扮演的“角色”。而父类定义了某个类的身份。比如Dog**一定是Animal**,但是可以选择当宠物或者警犬。
- 接口的方法一定是public和abstract的,所以这两个修饰符可以省略
- 如果你用接口(Interface)来代替具体的子类或者是抽象的父类作为参数或者返回类型,则你就可以传入任何实现该接口的东西。
- 一个类只能有一个父类(Super Class),但是可以实现多个接口(Interface)。
其他
- 在子类中可以通过super来调用父类方法。
public abstract Dog{
public void bark(){...}
}
public BigDog extends Dog{
public void bark(){
super.bark();
...//operations in the sub_class
}
}
- 关于ArrayList
//ArrayList是一个类,new ArrayList<Dog>()是一个对象
//<Dog>标记其实是告诉编译器,只接受Dog类型的参数
ArrayList<Dog> arr = new ArrayList<Dog>();
//但是实际上ArrayList内部还是用Object当做形参,所以可以处理各种对象
arr.add(new Dog());
//因为编译器限制了只能传入Dog类型的对象,
//所以取出时编译器可以放心的将Object转换为Dog
Dog d = arr.getIndex(0);