一、八种根本类型
1.取值范畴
2.字面值前缀
0b:二进制
0x:十六进制
0:八进制
u char 类型十六进制
3.运算规定
- 后果类型与运算中的最大类型统一
- byte、short、char三种比int小的整数,计算时会主动转成int(自增自减不会转换;有long型时,转long型)
- Integer.MAX_VALUE+1得正数的最小值
- 浮点数运算不精确
计算机所有数据的表现形式都是二进制,浮点数精度不精确的起因是十进制转换成二进制导致的。上面回顾一下十进制与二进制的互相转换过程。
10010 = 0 * 2^0 + 1 * 2^1 + 0 * 2^2 + 0 * 2^3 + 1 * 2^4 = 18// 十进制转二进制18 / 2 = 9 …….09 /2 = 4 ……….14 / 2 = 2……… 02 / 2 = 1 ………01 / 2 = 0……… 1后果10010
下面是整数之间的转换过程,上面看一下小数之间是如何转换的。
10.01 = 1 * 2^-2 + 0 * 2^-1 + 0 * 2^0 + 1 * 2^1 = 2.25//十进制转二进制//整数局部2 / 2 = 1…….01 / 2 = 0…… 1// 小数局部0.25 * 2 = 0.5…..00.5 * 2 = 1 ……..1后果10.01
为什么有的浮点数会有精度不精确的问题,以2.1为例,看一下十进制转成二进制是什么样子的。
2 / 2 = 1……01 / 2 = 0……1// 小数局部0.1 * 2 = 0.2……00.2 * 2 = 0.4……00.4 * 2 = 0.8……00.8 * 2 = 1.6……10.6 * 2 = 1.2……10.2 * 2 = 0.4……0……..
2.1转成二进制会陷入有限循环中,而计算机在存储小数时是有长度限度的,会截取局部小数进行存储,从而导致计算机存储的数值只能是个大略的值,而不是准确的值。计算机根本无法应用二进制来准确的示意2.1这个小数,计算必定也有问题。
精度失落的解决办法
应用BigDecimal计算,传入的参数肯定要转换成字符串,不然还是有坑。
4.运算符
&&:逻辑与(短路与),右边是假,左边疏忽不执行
&:不论右边什么后果都要执行左边
||:逻辑或(短路或),右边是真,左边疏忽不执行
二、根本类型的包装类
1.Integer
- Integer类中存在256个缓存对象,从-127~128;如果拜访这个范畴内的值,会拜访缓存对象,超出范围,会新建对象
三、流程管制
1.switch
- 反对的类型有byte、short、int、char及这四种类型对应的包装类,以及String和枚举类型。枚举类有一个ordinal办法,该办法实际上是一个intl类型的数值,String类型有一个hashCode算法,后果也是int类型。所以总的来说,能够认为switch中只反对int。
- switch的值不能是null,case子句中也不能是null
- case子句的值不能反复,会产生编译谬误
- 如果一个case条件成立,之后会无条件的执行前面所有的case和default直到完结,或者遇到break跳出循环;如果所有条件都不成立,则执行default
四、数组
1.Arrays数组工具类
其中封装了一些对数组的排序、查找、复制等操作
五、变量
1.局部变量
- 定义在办法或部分代码块中,必须初始化,第一次赋值时分配内存空间
2.成员变量
- 定义在类中,主动初始化默认值
3.为什么局部变量须要初始化,而成员变量不须要?
成员变量的赋值和取值的先后顺序具备不确定性,这是在运行时产生的,编译器确定不了,所以交给JVM来进行初始化;而局部变量的拜访程序是能够确定的,为了避免不可预期的状况产生,做的一种束缚。
六、Object类
1.概念
- 是所有类的父类
2.办法
- toString():取得一个对象的字符串示意,默认是“类名@地址”,可在子类中重写该办法
- equals():判断内存地址是否相等
七、String类
1.概念
- 是封装char[]数组的对象
- 第一次应用一个字符串常量时,会在字符串常量池中新分配内存,之后应用雷同的字符串时,间接拜访常量池中存在的对象,不会反复创立
2.equal和==
- ==比拟的是内存地址
- String重写了Object的equal办法,比拟的是值
3.StringBuilder
- 线程不平安,效率高
4.StringBuffer
- 线程平安
八、抽象类
- 能够有构造方法
- 能够有具体方法
- 蕴含形象办法的类肯定是抽象类,形象办法必须由abstract润饰,必须由子类实现
- 不能用new来创立实例
- 能够继承抽象类,也能够继承一般类
九、final
- 内存地址不可变,能够润饰常量、类、办法
- final常量:值不可变。不过对于援用类型来说,保留的是地址,所以内容可变
- final办法:不能被子类笼罩。private办法不能被子类笼罩,因而private默认是final类型的
- final类:不能被继承,没有子类
十、static
- 共享的数据
- 动态成员属于类,而不属于实例
- 静态方法不能间接调用非静态方法,只能由实例调用
- 动态块,只会在类被加载时,执行一次
- 动态变量保留在办法区中,被所有实例共享
十一、面向对象
1.基本概念
1)类:类中定义对象的成员变量、成员办法。类第一次应用时会加载到办法区。
2)对象:从类中创立的具体实例。新建实例时,在堆内存中会分配内存空间给这个实例。
3)援用变量:在栈中保留一个实例的内存地址(堆中实例的地址),援用变量保留在栈。null不保留任何实例的内存地址。
4)构造方法:新建实例对象时,立刻执行的一个非凡办法,可重载
5)this
- 当一个对象创立后,JVM会给对象调配一个援用本身的指针,这个指针就是this,示意以后对象的援用
- this只能在非动态的办法中应用
- 用于辨别同名变量
- 只能在构造方法中通过this来调用其余构造方法,一般办法中不能应用;不能通过this递归调用构造方法;调用其余构造方法时,必须放在第一行
- 因为super办法调用父类的构造函数也必须放在第一行,所以super和this不能同时呈现在构造方法中
- this拜访类的成员变量和成员函数时不受拜访权限的管制,包含private的变量和办法
- 在继承关系下,父类中的this关键字示意如下:
- this(paras…)拜访其余构造方法:拜访的始终是父类的构造方法;
- this.XXX拜访类中的成员变量:拜访的始终是父类中的成员变量;
- this.yyy(paras…)拜访类中的成员办法:如果子类重写了该办法,则拜访的是子类的办法;否则拜访的是父类的办法;
6)super和this的异同:
- super是子类中拜访父类成员的一个桥梁,而this是一个对象的援用
- 当子类笼罩了父类的成员变量,或重写了父类的成员办法时,通过super还可能拜访到
- 都不能在静态方法中应用
7)继承:只能继承一个父类;构造方法和公有成员不能被继承
8)办法重写:子类重写父类的办法,办法名、参数的个数和类型、返回值类型必须都雷同
9)多态
- 一个对象具备多种状态的体现,多态的前提是必须有继承
- 向上转型:子类的实例转换成父类型。只能调用父类定义的通用成员,子类特有成员被暗藏
- 向下转型:曾经转换成父类型的子类实例
2.对象加载的过程
1)加载类
- 加载父类,为父类动态变量分配内存
- 加载子类,为子类动态变量分配内存
- 执行父类动态变量的赋值运算和动态初始化块
- 执行子类动态变量的赋值运算和动态初始化块
2)新建实例
- 新建父类实例,为父类实例变量分配内存
- 新建子类实例,为子类实例变量分配内存
- 执行父类的实例变量赋值运算和构造方法
- 执行子类的实例变量赋值运算和构造方法