面向过程:以函数为中心;
Object Oriented Programming
(宏观上)以对象为中心研究问题;更符合人类思维;
OOA:面向对象分析;
OOD:面向对象设计;
OOP:面向对象开发;
自顶向下,逐步求精;
复用:大的对象属性也可以是一个对象
为什么引入oo的概念?
框架做的事是为了解耦合:让耦合度降低
伸缩性:对于需求变化反应快;
类是对象的模板
对象是类的实例
封装性 :1.统一性 2.隐藏性
继承性
多态性:多态的实现以继承为基础。重新定义超类的行为(@Override方法重写、覆盖)(方法签名一样)
Employee emp=new Manager();父类的引用指向之类的空间
emp.work();编译时--声明;运行时--分配空间。运行时才看得出来他是哪个行为。
逻辑上的堆栈与物理上的栈堆。
迭代一般只读,相当于数据库的游标对多行进行扫描
foreach不能对集合本身进行结构性改变 如:不能list.remove("world");
多态性:特殊性到一般性的统一
构造函数主要用于创建对象时初始化属性,其他无关的不要放在里面
保证每个类有一个无参构造器,以便子类的调用
非静态的变量属于类特有的。
静态的变量属于全局的。
类加载时机先于对象实例
1:classLoad 为static方法打开入口
2:creat instance 为实列属性及方法打开入口
所以:
静态方法不能调用实例的成员变量以及方法
实例的成员变量以及方法可以引用静态属性
私有可以拿公有,公有不可拿私有。
静态方法通常作为工具方法来用。
静态块,先执行于对象创建的任何操作,但只执行一次
构造块:new 一次 在构造器之前执行一次;
两个数值的运算结果不能超过计算机中的该类型的数值范围,否则计算机中的算术运算是会发生越界情况的
解决:BigInteger 提供加减乘除的功能;
lang包里面的类,不用import;
方法的重载 是(静态)多态性的体现(编译时)--(业界看法不同);
方法的重写是(动态)多态性的体现(运行时)--父类的引用指向之类的实体;
运算符重载的地方 如:+ -----1:加号 2:并置符号;
:只有方法的参数才参与重载的判断
引用、匿名对象
abstract抽象类:一个抽象类里面可以有实现方法,不是非要有抽象方法,但是抽象方法必须在抽象类里面
继承抽象类的非抽象子类必须实现其抽象方法
抽象类不能实例,只能new 它的非抽象子类
抽象类常在设计中体现出多态性
引用类型 :数组,类,接口
接口:只能由 public |static| final 来修饰,
没有属性,只有常量,
里面的方法默认为抽象方法;
类与类之间是继承的关系(单继承)
伪多重继承:
类与接口之间是实现的关系(可以多实现)
接口与接口的关系是继承关系(可以多继承)
接口更好的体现了作为一个行为声明的集合,因为接口里面都是抽象方法,它比抽象类的抽象层次更高
与1.0版的Vector相比1.2的Arraylist牺牲了线程安全,但性能能好
LinkedList底层为循环双向链表
HashSet底层由HashMap实现
hashmap的容量达到75%就开始扩充了
linkedHashset 重写hashmap 的addEmtry()方法 利用双向链表实现逻辑上的有序
treeSet 须同类型插入,才能比较 排序为比较算法 如果是你自己的对象,必须实现comparable重写compareto方法 底层实现为二叉树
ClassCastException 类型转换异常
instanceof 。。是。。的实现 它是运算符 返回boolean值
接口也算一种类型,特殊类型
使用treeset时 判断重复时,如果实现了comparable接口 就判断comparaTo()方法,不进hashcode()和equals()方法
hashMap 无序的(多了才看得出来哈), key值可以重复但保留后面一个(坑)。entry<k,v>
Generic 泛型
增强for循环 也叫foreach循环
ConcurrentModificatoinException 并发修改异常
对于集合迭代过了才能删除 或者用迭代器自带的无参删除方法remove()
listIterator双向迭代器
对象克隆 重写Object的clone()方法 ——先判断当前对象能不能克隆,需要实现Cloneable接口,这种接口叫标记接口,没有任何方法,起个标记作用。
这里面有个浅度副本和深度副本的概念,深度副本需要一层一层的克隆,如当前克隆对象里面的属性是引用类型就需要深度副本了;