共计 2978 个字符,预计需要花费 8 分钟才能阅读完成。
一、八种根本类型
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 …….0
9 /2 = 4 ……….1
4 / 2 = 2……… 0
2 / 2 = 1 ………0
1 / 2 = 0……… 1
后果
10010
下面是整数之间的转换过程,上面看一下小数之间是如何转换的。
10.01 = 1 * 2^-2 + 0 * 2^-1 + 0 * 2^0 + 1 * 2^1 = 2.25
// 十进制转二进制
// 整数局部
2 / 2 = 1…….0
1 / 2 = 0…… 1
// 小数局部
0.25 * 2 = 0.5…..0
0.5 * 2 = 1 ……..1
后果
10.01
为什么有的浮点数会有精度不精确的问题,以 2.1 为例,看一下十进制转成二进制是什么样子的。
2 / 2 = 1……0
1 / 2 = 0……1
// 小数局部
0.1 * 2 = 0.2……0
0.2 * 2 = 0.4……0
0.4 * 2 = 0.8……0
0.8 * 2 = 1.6……1
0.6 * 2 = 1.2……1
0.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)新建实例
- 新建父类实例,为父类实例变量分配内存
- 新建子类实例,为子类实例变量分配内存
- 执行父类的实例变量赋值运算和构造方法
- 执行子类的实例变量赋值运算和构造方法
正文完