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

本文介绍了面向对象编程中的核心概念,包括多态、抽象类、抽象方法及接口等,并通过示例详细解释了如何使用这些特性进行面向对象的设计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多态(狭义,应即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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值