《Head First Java》读书笔记day05

了解继承

在设计继承时,你会把共同的程序代码放在某个类中,然后告诉其他的类说此类是它们的父类。当某个类继承另一个类的时候,也就是子类继承自父类。以Java的方式说,这是“子类继承父类”。继承的关系意味着子类继承父类的方法。当我们提及“类的成员”时,成员的意思就是实例变量和方法。

  • 子类是extends父类来的
  • 子类会继承父类所有public类型的实例变量和方法,但不会继承父类所有private类型的变量和方法
  • 继承下来的方法可以被覆盖掉,但实例变量不能被覆盖掉
  • 当某个方法在子类中被覆盖过,调用这一方法时会调用到覆盖过的版本。

对象声明、创建与赋值的3个步骤:

//  1              3              2
Dog myDog          =           new Dog();
  1. 声明一个引用变量;要求Java虚拟机分配空间给引用变量,并将此变量命名为myDog。此引用变量将永远被固定为Dog类型。
  2. 创建对象;要求Java虚拟机分配空间给新建立的Dog对象。
  3. 链接对象和引用;将新的Dog赋值给myDog这个引用变量。

重点在于引用类型与对象的类型必须相符。在此例中,两者皆为Dog。

但在多态下,引用于对象可以是不同类型。

Animal myDog = new Dog();

 两者的类型不同。引用变量的类型被声明为Animal,但对象是Dog。

运用多态时,引用类型可以是实际对象类型的父类。举个栗子:

Animal[] animals = new Animal[5]; //声明Animal类型的数组。也就是说一个会保存Animal类型对象的数组
animals [0] = new Dog(); //可以放任何Animal的子类对象进去
animals [1] = new Cat(); //可以放任何Animal的子类对象进去
animals [2] = new Wolf(); //可以放任何Animal的子类对象进去
animals [3] = new Hippo(); //可以放任何Animal的子类对象进去
animals [4] = new Lion(); //可以放任何Animal的子类对象进去

for(int i = 0; i < animals.length; i++) {
    animals[i].eat(); //当i为0的时候,这会调用Dog的eat()
    animals[i].roam(); //当i为1的时候,这回调用Cat的roam()
}

8 深入多态

要使用多态,我们还需要接口。我们需要超越简单的继承并前进到只有通过设计与编写接口规格才能达成的适应性与扩展性。接口是一种100%纯抽象的类。

设计抽象类很简单-在类的声明前面加上抽象类的关键词abstract就好:

abstract class Canine extends Animal {
    public void roam() { }
}

抽象类不可此创建出该类的实例。但可以使用抽象类来声明为引用类型给多态使用,却不必担心哪个创建该类型的对象,编译器会确保这件事。

抽象的方法。除了类之外,也可以将方法标记为abstract。抽象的类代表此类必须被extend过,抽象的方法代表此方法一定要被覆盖过。

抽象的方法没有实体!

public abstract void eat(); //没有方法体!直接以分号结束

如果你声明出一个抽象的方法,就必须将类也标记为抽象的。你不能再非抽象类中拥有抽象方法。就算只有一个抽象的方法,此类也必须标记为抽象的。

在Java中的所有类都是从Object这个类继承出来的。可以把类想象成是这样声明的:

public class Dog extends Object { }

问:如果ArrayList方法是通用的,那么ArrayList <DotCom> 是什么意思?

答:限制它的类型。如果你写成 ArrayList <Dog> ,则此ArrayList受限只能保存Dog的对象。

9 对象的前世今生

在Java中,程序员会在乎内存中的两种区域:对象的生存空间堆(heap) 和方法调用及变量的生存空间栈(stack)。当Java虚拟机启动时,它会从底层的操作系统取得一块内存,并以此区段来执行Java程序。

栈:方法调用和局部变量

堆:所有的对象

实例变量:被声明在类而不是方法里面。它们代表每个独立对象的“字段”(每个实例都能有不同的值)。实例变量存在于所属的对象中。

局部变量:局部变量和方法的参数都是被声明在方法中。它们是暂时的,且生命周期只限于方法被放在栈上的这段期间(也就是方法调用至执行完毕为止)。

对象本身只会存在于堆上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值