对象集合
- 避免人机交互和业务逻辑进行融合,也就是注意解耦
2.注意程序的细节,每个函数的执行可能的结果
3.对象数组中的每个元素都是对象的管理者而非对象本身
4. for循环返回对于对象返回的是引用,对于基本类型是副本
5.能够直接讲对象放到打印中去,因为实现了toString
6 .Map的put时,key相等时,相当于直接修改key相对应的值
Java中有两大种数据类型:基本类型和 引用(非基本类型)。 基本类型中表示数据本身,Java 中共8个基本类型, 如下:
* bool
* char
* byte
* int
* long
* float
* double
* void
其他的类型都为非基本类型,非基本类型的变量保存的是引用,而非对象本省,可以理解为一个指针。
继承
7.子类构造器会自动调用父类的构造器,即使你没有显示的调用父类的构造器
继承体系中变量的初始化的过程:
先初始化父类,然后初始化子类。
8.如果子类和父类中有相同的变量,那么变量共存,在子类中的访问的变量是子类的,在父类中访问的是父类的变量
- java 的对象变量是多态的,他们能够保存不止一种类型的对象
- 他们可以保存的是声明类型的对象,或者声明类型的子类的对象
- 当把子类的对象赋值给父类的变量的时候,就发生了向上造型。
Java具有静态类型和动态类型,静态类型是编译时期确定的类型,动态类型为运行时确定的类型,其为真实的对象的类型
9 . 关于向上造型:
- 子类的对象可以赋值给父类的对象
** java中不存在对象对对象的赋值, 仅仅是一个引用的改变,也就是浅拷贝**
** 父类的对象不能赋值给子类的对象(其是由编译器所决定的,编译器会根据静态类型进行报错)
** 但是可以使用强制的cast造型的方式绕过编译器的限制。 但是其正确性必须有程序员自己决定,如果左右真实的类型不匹配,运行时将会报
classCaseException 错误。
对于基本类型的强制转化和引用类型的强制转换
基本类型的强制转换,存储的值直接发生变化,但是相对于引用类型强制转换的时候,仅仅是引用改变了,引用指向的对象不变。
float b=1.5f
int x=(int)b; //
Vechicle v;
Car c= new Car();
v=c; //可以
c=v; //编译错误
c=(Car)v //编译通过,但是运行时会发生classCaseException
编译器不允许父类复制给子类,但是可以通过强制类型转换,绕过编译器。
绑定:
静态绑定和动态绑定:
静态绑定是指在程序编译过程中,把函数(方法或者过程)调用与响应调用所需的代码结合的过程称之为静态绑定。
动态绑定是指在执行期间(非编译期)判断所引用对象的实际类型,根据其实际的类型调用其相应的方法
Java中的方法只有final,static,private和构造方法是前期绑定
覆盖
覆盖指之类覆盖父类中的方法,这要求函数签名相同,最好使用@overide标志。
单根结构Object
即所有的类默认继承至object。
object的类
Object类的toString的默认输出是:对象加地址
注意equals的签名中,函数的参数是Object,所以使用时一般需要cast. 前面加上override的时候更加安全
设计原则
消除代码复制,
可复用,可维护,可扩展。
用封装来降低耦合
尽量私有化成员变量
-
框架+数据提高可扩展性(尽可能的改造)
其主要的方法是,减少程序的硬编码的数量,尽量使用对象加上框架的方式增加程序的可扩展。其主要的还是先需要查看程序中会有改动的部门。
抽象和接口
抽象函数:表达概念而无法实现代码的函数
抽象类: 表达概念而无法构造出实体的类
修饰符:abstract. 有抽象函数的类一定是抽象类。
抽象类不一定必须含有抽象方法。只要使用abstract修饰符修饰即可。
设计模式
控制反转.
内部类可以认为是外部类的一个成员,作为成员其具有访问其他的成员的权限。当然还有函数的内部类。
匿名类: 在new对象的时候,直接给出类的定义
MVC三层设计模式
异常
异常的处理流程: 当前的环境是否是try环境,否则返回上一个函数
异常最大的好处就是分割了业务逻辑和错误处理代码
异常类的体系
catch匹配的时候 是一种IS-A的关系,也就是父类可以捕捉子类
当异常遇到继承关系时:
当覆盖一个函数的时候,子类不能声明比父类的版本更多的异常,在子类的构造函数中,必须声明父类可能抛出的全部异常,
但是构造函数 可以增加额外的异常,
IO
当将对象通过序列化的方式写入到文件中时,写入到文件中的对象远远不止基本信息,还有其他的一些信息,包括对象的类的信息,这样才可以读出时,重构出相关的对象。