目录
- 类与对象
- 接口与实现
- 继承与封装
- 不可变对象
- 泛型
类与对象
一般概念和问题
- 类的成员变量 -->对象状态
类的成员函数 -->对象行为
- 类的静态变量、类的静态函数 -->没有this引用,全局唯一一份
- 普通函数引用静态变量、静态函数 ? 正确
- 对象上引用静态变量、静态函数 ?编译警告
- 静态函数引用普通成员变量、函数 ? 编译错误,因为拿不到this引用
对象的特殊函数
- 构造函数:没有返回值,返回本身
- equals:和(==)等价,一般要重写
- hashCode:a.equals(b) 可推出 a.hashCode( ) == b.hashCode( ),反之不行,因为有时不同对象的hashCode值会相等
- toString:重写
接口
与类相比
- 由编译器强制的一个模块间协作的合约(Contract)
- 无成员变量
- 成员函数只有申明不能实现
接口和抽象类的区别
- 抽象类可以有成员变量
- 抽象类可以有部分实现
- 抽象类不可以多重继承,接口可以
But why ?(为何有抽象类还要有接口)
- 从用户角度看问题
- 强调合约
- 强制协作双方无法犯错
- 抽象类实现了一些公有的实现,接口描述了类有哪些功能,虽然二者相似,但其实不是一个维度的概念
继承
- is - a 的关系
- 子类增加或修改(注意不能减少)基类
封装
类内部 | 包内部 | 派生类 | 外部 | |
private | Y | N | N | N |
默认 | Y | Y | N | N |
protected | Y | Y | Y | N |
public | Y | Y | Y | Y |
- 默认也称package private
- 尽量只使用private 和 public
- 基类private ->子类public ? 正确
- 基类public->子类private ?错误(常见面试题,子类不能使基类权限变小)
不可变性
final关键字
- 类声明 -> 类不可以被继承
- 函数申明函数 -> 不可以在派生类中重写
- 变量申明变量 -> 不可以指向其他对象,里面的内容可以改变
- static final 变量 -> 用于定义常量名称一般大写
泛型
- ArrayList<Integer> 是List<Integer>吗 ?是的
- List<Integer>是List<Object>吗 ?错误
把List<Integer>转换成List<Object>
- new ArrayList<Object>(intList);正确
- (List<Object>)(List)intList;危险