面向对象总结

231 阅读3分钟

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()不能兼得

堆和栈

  • 实例变量保存在所属的对象中,位于堆上
  • 如果实例变量是个对象的引用,则引用与对象都在堆上