编程思想
2.一切都是对象
2.1用引用操做对象
在java中一切都被看作对象,但实际操做对象的是对象的引用,引用于对象的关系就像电视遥控与电视,声明一个引用而不指定对象,也是能够的,可是运行会报空指针,至关于买了有一个遥控器,却没有电视.java
2.2对象的存储地
- 寄存器 寄存器位于cpu内部速度最快但容量很小,因此java中根据需求分配寄存器.没法显式指定操做寄存器或向寄存器中存储对象,咱们甚至没法感觉到寄存器存在的痕迹
- 栈 栈位于RAM中,速度仅次于寄存器,但建立程序时,编译器必须知道存储在栈中的全部项的确切生命周期,这一为了效率而产生的约束限制了栈中不能存放对象,只能存放对象的引用,^[这里不太明白,须要阅读更深层jvm书籍]
- 堆 堆也位于RAM中,存放了java中的全部对象,好处是编译器不须要全部项的确切生命周期,坏处是由于不知道确切的生命周期,堆中的存储和垃圾回收须要比栈中更多的时间.有利就有弊.java将这两种结构与对象的数据结合,打造出合适的jvm内存管理.
- 常量池 存储不会改变的常量.
- 特例:基本类型 对于一些很小的,简单可是经常使用的变量,单独为他们在堆中建立一个对象,彷佛效率不高.对于这些类型,java采用与c,c++一样的办法:建立一个不是引用的变量,这些变量直接存储值,而且置于栈中,而不是使用new来建立对象,所以更加高效.这些变量被称做基本类型变量.
- 数组 建立一个数组对象时,实际上就是建立了一个引用数组,而且全部引用都被初始化为一个特定值:null
2.5方法
在java中,方法是二等公民,不能单独存在,每一个方法都必须依赖于类.要声明方法,必须先声明一个类来承载这个方法^[状况在jdk8中彷佛有所改变]. 普通方法依赖于对象,必须先建立对象才能使用方法. 静态方法依赖于类,使用类自己就能够调用方法,没必要须建立对象.c++
javadoc
3操做符
暂略编程
4控制执行流程
暂略设计模式
5初始化与垃圾回收
5.4 this关键字
一个类能够实例化多个对象,每一个对象均可以调用类中的方法,那方法如何知道调用本身的是类中的哪一个类呢,实际上,对象调用方法时,会将本身隐式传入方法中,想在方法中使用这个对象的话,this就能够出场了.也就是说,this就表明调用方法的对象. 数组
5.5 清理
^[暂时略过,但很重要]jvm
5.6变量初始化
java的原则是:全部的变量在使用前(对象实例化)都应该获得恰当的初始化,因此全部变量在声明的时候就有一个默认值,基础类型变量默认值是0,false等.别的变量类型为null. 静态变量只会在类装载时被初始化一次,他是属于类的,只存在一份.假设static变量时一个随机值,屡次建立类的对象不会得到不一样的static变量.this
5.7初始化顺序
成员变量将在方法以前被赋值完毕.(避免方法中使用变量时,变量未赋值完成,引发错误) 1.静态变量 2.静态代码块 2.普通成员变量 3.普通代码块 3.构造方法(隐式static) 4.普通方法 ??静态方法啥时候加载,为何用不了非静态成员变量 访问静态域或静态方法会致使类的加载,类的加载会加载全部static修饰的东西,包括域和方法. 初始化会引发上述顺序加载spa
5.8可变参数
5.9枚举
总结
在C++中,大量编程错误都源于不正确不完整的初始化,java中为了不重蹈覆辙,使用了构造器这种保障结构. 实例化一个对象前,构造器中及构造器以前(变量赋值)来保证初始化完整.设计
7复用类
7.1组合
7.2继承
子类继承父类后,不仅是将父类的属性和方法单纯复制到子类中.当建立一个子类对象时,该对象中包含了一个父类对象.这个父类对象和调用父类构造器得到的父类对象是同样的.区别仅仅是后者来自于外部,前者被包装在子类对象内部. 要达到上述效果,须要调用java提供给咱们的保证对象初始化成功的结构---构造器.也就是说,子类构造器中会隐式调用父类构造器.若是父类没有空参构造器,须要在子类构造器第一行调用父类构造器,不然编译不会经过. 子类能够在本身的类中对父类方法进行重载,或者直接重写覆盖.代理
7.3代理
7.6protected
容许来自其余包的继承包内父类的子类访问父类的protected域,起到保护包的做用.不继承,不能访问.
7.7向上转型
子类在方法层面是父类的超集,子类中一定含有父类的全部方法,因此java容许隐式的向上转型.由于父类能调用的方法,子类确定能够调用. 对于域来讲,父类的private域或者friendly域,显式访问会报错,但子类向上转型后访问会编译经过并被初始化为null.
7.8final
static final修饰变量能够保证变量在类中只有一份且不变. p147有加载顺序,很重要
- final基本类型变量 变量值不准改变
- final引用类型变量 引用不容许被从新指向其余对象,但对象自己能够改变,包括数组,数组也是对象
- 空白final变量 声明变量时不赋值,在构造方法中才对final变量赋值,经过对构造方法传参,这样更灵活. 也就是说,final变量的肯定是在对象初始化时才肯定.这种方式局限性也在这里,不能用于static final修饰的变量.
- final参数 参数引用不容许被从新赋值
- final方法 全部private方法都隐式添加了final,由于他只对本身可见,也就不存在被子类重写的状况. 在子类中声明一个方法声明和父类private方法声明同样的方法,不属于方法重写,只是声明了一个普通的子类方法.
- final类 不容许被继承,全部方法被隐式添加final
8多态
子类能够重写父类的方法,而且子类引用能够自动向上转型为父类引用的这一特征,叫作继承. 在运行期间,父类的引用能够自动绑定为子类引用,以自动的调用具体子类的方法的这一过程,叫作动态.注意,多态只是针对普通方法的,对象的域以及静态方法,都不具备多态性.
9接口
需结合设计模式
- 策略模式
- 适配器模式
12异常
12.2java中的异常
- 异常也是类 java中的异常也是一个类对象,他也有一个默认的构造器,而且标准异常类都有一个参数为String类型的带参构造器,用于存储异常信息.
- 抛出异常与方法返回的类似之处 方法抛出异常与方法正常返回返回值有不少类似之处,好比: 1.他们均可以中断方法继续执行 2.正常返回会返回一个引用,抛出异常一样也会抛出一个异常的对象引用
- 不一样之处: 处理返回对象的"目的地",方法返回值交给栈中的上一层调用方法,异常则交给适当的异常处理程序,具体要看谁有能力处理这个异常,一个异常可能会跨越许多方法调用栈才能找到他的处理程序.
12.3捕获异常
异常会被第一个能够处理他的catch语句捕获,而且捕获后就结束,也就是说,多个并列的catch语句并不会像swtich语句那样被捕获屡次.可是一个异常被捕获后处理完也能够继续抛出
12.5声明你的异常
在方法声明上使用throws关键字来向上一层方法声明你的异常,若是上一层方法有能力处理,就会处理这些异常,没有的话,他们应该继续向上声明异常.
12.6栈轨迹
经过调用e.printStackTrace来打印异常信息,信息能够经过getStackTrace来直接访问,该方法将返回一个数组. 数组中元素是栈轨迹,每一个元素表示栈中的一帧,索引为0的元素是栈顶元素,也就是最后一个方法调用(抛出异常之处),最后一个元素也就是栈底元素是调用的第一个方法.