1. 对象
对象提供服务,对方法的调用就是向对象发送消息 对象本身已知的事物被称为:实例变量。代表对象的状态(数据),且该类型的每一个对象都会独立的拥有一份该类型的值
对象可以执行的动作称为:方法
1.1 变量:就像是杯子,是一种容器,承载某些事物
- byte:小杯
- short:中杯
- int:大杯
- long:重量杯
1.2 引用
没有超巨型的杯子可以放大到能够装载所有的对象。对象只会存在于可回收垃圾的堆上
- 对象的引用也只是一个变量值
还是会有东西放进杯子中,只是引用所放进去的是遥控器
引用是遥控器 -》 对象(TV)
1.3 变量的比较
- 实例变量:有默认值
- 局部变量:没有默认值,使用前必须初始化
- 使用 == 判断基本类型,或者两个引用是否引用同一个对象
- 使用equals来判断两个对象是否在意义上相等
1.3 数组
数组犹如杯架,数组本身就是对象,Dog数组存的是Dog引用
2. 封装
-
不要让数据裸奔
-
Java是通过值传递的,也就是说通过拷贝传递
-
方法可以根据实例变量来展现不同的行为
3. 多态
3.1 抽象类
3.2 接口
5. 构造函数
- 如果你没有写构造器,编译器会为你安排一个
- 如果你写了构造函数,则编译器就不会调用默认的
- 最好有无参的构造器,让人可以选择使用默认值
- 如果用户自定义了构造器就是告诉编译器:“老兄,我自己的构造器不用你管”
5.1 在创建对象时所有继承下来的构造函数都会执行
- 抽象类也有构造函数,会在具体子类创建出实例时执行;因为子类继承的方法中用到了父类的实例变量(必须初始化,父类构造器必须调用)
- 构造函数在执行的时候,第一件事就是去执行它的父类构造函数,这会连锁反应到Object这个类为止
5.2 对super的调用必须是构造函数的第一条语句
- 父类的部分必须在子类创建完成之前就必须完整的成型,因为子类对象可能要用到从父类继承下来的东西,所以那些东西必须先完成
- 子类没有使用super显示调用父类构造器,编译器默认会加上父类的无参数构造器,如果父类没有无参数构造器,编译报错
- 父类只有参数的构造器,子类构造器必须使用super(参数) 见Head First Java - P255
- 场景:父类有一个private name,public getName;getName被子类继承,但是会存在name没有初始化,因此子类需要通过调用父类有参构造器初始化
- this()调用对象自身的构造函数,且必须是第一条语句;this()与super()不能兼得
堆和栈
- 实例变量保存在所属的对象中,位于堆上
- 如果实例变量是个对象的引用,则引用与对象都在堆上