《Head First Java》学习笔记 (八)接口与多态

多态(狭义,应即Override)

  • 子类拥有父类的全部可继承方法(public, protected),并且可以重写(override)父类的方法。
    注意:
    1. 参数必须一样
    2. 返回类型必须兼容,即子类返回类型必须与父类一样或是父类返回类型的子类

抽象类 (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,但是可以选择当宠物或者警犬
  • 接口的方法一定是publicabstract的,所以这两个修饰符可以省略
  • 如果你用接口(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);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 面向对象主要针对面向过程。 面向过程的基本单元是函数。 什么是对象:EVERYTHING IS OBJECT(万物...
    sinpi阅读 4,753评论 0 4
  • 1.import static是Java 5增加的功能,就是将Import类中的静态方法,可以作为本类的静态方法来...
    XLsn0w阅读 5,004评论 0 2
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,906评论 18 399
  • 一:java概述:1,JDK:Java Development Kit,java的开发和运行环境,java的开发工...
    ZaneInTheSun阅读 7,577评论 0 11
  • 为什么当时不放条鲨鱼而放条鲶鱼呢?因为鲶鱼只搅活了水而不咬沙丁鱼。所以这放鲶鱼的办法用团队管理上,就是打破...
    大梦张吉玲阅读 3,110评论 0 0