对象的三个特征:
对象的行为:可以对对象施加哪些操作,或者可以对对象施加哪些方法?
对象的状态:当施加哪些方法时,对象如何响应?
对象的标识:如何辨别具有相同行为与状态的不同的对象?
对象的行为是用可调用的方法定义的
对象的状态每个对象保存着描述当前特征的信息
对象的状态可能会随着时间的改变而变化,但这种改变不是自发的.对象状态的改变必须通过调用方法实现(如果不进过方法调用也可以改变 说明封装性 遭到了破坏)
对象的标识对象的状态并不能完全描述一个对象,每个对象都有唯一的身份,就是对象的标识 例如一个订单系统中的订单号.
类之间的关系
依赖 聚合 继承
依赖 use-a关系 是一种明显的,最常见的关系 用软件工程的术语来说就是耦合
聚合 has-a关系 一个对象包含着一些其他对象就是聚合 聚合关系意味着类a的对象包含类b的对象
继承 is-a 关系
类设计技巧
一定保证数据私有(绝对不要破坏封装性)
一定要对数据进行初始化
java不会对局部变量进行初始化,但是会对对象的实例化进行初始化.最好不要依赖系统的初始化
不要再类中使用过多的基本类型,
用其他的类代替多个相关的基本类型的使用.
不是所有的域都要独立的域访问器或域更改器
将职责过多的类进行分解
类名和方法名要能够体现出他们的职责
继承设计的计较
将公共操作和域放在超类
不要使用受保护的域
使用继承实现is..a的关系
除非所有继承的方法都有意义,否则不要使用继承
在覆盖方法的时候不要改变预期的行为
使用多态
不要过多使用反射
方法的执行过程
编译器查看对象的声明类型和方法名
可能存在多个方法名相同的方法例如f,但参数类型不一样的方法,编译器会把这个类的 所有方法f和其他的父类中的访问属性为public且名为f的方法.
到现在编译器获得所有可能被调用的方法
编译器将查看调用方法时提供的参数类型.
如果在所有名为f的方法中找到了一个与提供的参数类型完全匹配,就调用哪个方法,这个过程又叫重载解析
到现在编译器已经获得需要调用的方法名和参数类型
方法的名字和参数列表称为方法的签名.如果子类中定义了一个与超类签名相同的方法, 那么子类中这个方法就将覆盖超类中的这个方法签名相同的
方法返回类型不是签名的一部分,所以在覆盖方法的时候一定要保证返回类型的兼容性允许子类将覆盖方法的返回类型定义为返回类型的子类
如果是private方法 static方法 final方法或者构造器,那么编译器将准确的知道自己该调用哪个方法我们将这种调用方式称为静态绑定.与之对应的
调用的方法依赖隐式参数的实际类型,并在运行时实现动态绑定.比如x.f();
当程序运行时,并且采用动态绑定调用方法时,虚拟机一定调用与x所引用对象的实际类型最适合的哪个类的方法,例如x实际是d类型的,d是c的子类,如果d定义了方法f就直接调用f,否则就去d父类中找
因为这样每次都要搜索半天,开销大,因此虚拟机就预先建立了方法表,其中列出了方法签名和实际方法,这样只需要找表就好了
//未完...好多都写在之前的学习总结里了