[TOC]
这部分内容很多很杂,简单整理主线。
一 广义的对象
很难定义。将事物的属性抽象出来形成的一个概念。
比如鱼抽象出生活在水里,外形类似梭型的生物。一个事物可以称为一个对象,符合这个特征的对象可以称为鱼,或者说该对象的类型是鱼。又比如四边形的定义:
由不在同一直线上的不交叉的四条线段依次首尾相接围成的封闭的平面图形或立体图形叫四边形,由凸四边形和凹四边形组成.
符合上边特征的对象可以称为四边形。
类型,也可以称为类,描述了具有相同特性(数据元素)和行为(功能)的对象的集合
二 java中的对象
只关注两点:
- 代表什么
对象可以指代一个实例,其类型称为类。
类具有接口(广义上的接口),描述类具有的行为特征。
比如电灯Light具有开灯和关灯的功能,那么它就具有on和off两个接口。
- 怎么用
用户只关心使用方法,而不关心具体的实现。
对于灯的使用者而言,只需要了解灯的这两个功能就可以了,而不需要知道灯开关的原理。
三 设计对象的类
3.1 类的构成方式
- 由其他类组合
理解成简单的组合就行了。比如引擎、轮胎、座位以及其他组件组合成一辆汽车。 - 继承父类
子类同时也是父类。
子类可以继承父类的特性,包括成员和接口(更重要)。
子类可以扩展出新的特性,添加子类需要的接口(说明父类不能满足这方面的需求),改变基类现有的接口(覆盖,在子类中做与父类不同的事情)。
举例子的话,父类可以是广东地区的空调(大部分不具有制热功能),子类可以是那些同时具有制冷制热功能的空调。
3.2 在恰当的地方使用对象
- 你需要什么
假如你需要在某些地方使用一只猫。那么考虑需要一只猫(父类Cat
),还是需要一只英短(子类British Shorthairs
)。 - 怎么用它
当希望你的猫叫,你有call
方法,
在调用之前,编译器确保call
方法存在,并对它执行类型检查。 - 用它
真正运行call
方法时,
通过一小段字节码计算出方法体的地址,从而执行具体的代码,假如它是英短,会发出英短的叫声。
像这样忽略类型的具体细节的代码编写方式更为简单,也更易于理解,差不多就是面向对象的大部分意义。
概念:将子类看做基类的过程称为向上转型(upcasting)
四 创建对象
4.1 用引用操作对象
java中操作的标识符(比如String str;
里的str
)实际上是对象的一个“引用”。
引用相当于遥控器,拥有遥控器就可以保持与空调的联系。当希望降低温度时,实际操作的是遥控器(引用),遥控器调整空调(对象)温度。
在代码中分析:
String str;//这里创建的是引用而不是对象,它并未和任何事物关联,此时操作str会报空指针异常
str=new String("lsmm");//此时str与字符串对象关联
4.2 对象存储的位置
更详细的分析可以看《深入理解Java虚拟机》读书笔记。
1.寄存器
位于处理器内部,不可操作。
2.栈
存储基本类型、方法出口、对象引用等,分本地方法栈和虚拟机栈。
3.堆
存储对象实例,是GC(垃圾管理器)管理的主要区域,所有线程共享,JVM启动时创建。
4.常量
存储在方法区(可以理解为堆的一部分)中。
5.数据库、硬盘等
6.基本类型具有确定的大小,存储在栈中
数组
Java中创建数组对象实际上是创建引用数组,并且每个引用赋初始值null
。
在c
或c++
中使用的数组是内存块,应用访问自身之外的内存或者在数组初始化前使用内存会产生难以预料的后果,而在java中会抛出空指针错误。
4.3 对象的作用域
注意区分引用的作用域和对象的作用域。
-
引用的作用域很好理解。
-
当对象被创建后,它可以作用与作用域之外;引用消失后,对象继续占据内存空间。
java特有的垃圾收集器会回收不被需要的对象。
4.5 创建新的数据类型:类
字段。
方法(返回值、参数列表)。
作用域。
网友评论