https://www.cnblogs.com/schiller-hu/p/10662429.html
基础: 8个比特(bit) 等于 1字节(byte)
1个比特(bit) 就是电路中的0/1
java共提供了8种基本类型:
数字型:
byte: 1个字节, 范围 [-128(-27),127(27-1)] 默认值 0
short: 2个字节 范围[-2^15, 2^15-1] 默认值0
int: 4个字节 范围[-231,231-1] 默认值0
long: 8个字节 范围[-263,263-1]
double: 8个字节, 双精度浮点型
float: 4个字节, 单精度浮点型
char: 2个字节 运行时位unicode字符
boolean: 1个字节, 默认值false 只有两个取值:true 和 false
问题1: 为什么byte的范围是[-128,127]?
参考: https://zhuanlan.zhihu.com/p/54074731
更简单的就是
// 0b00000000 - 0b01111111 表示0到127
byte a = (byte) 0b00000000;
System.out.println(a); // 0
byte a1 = (byte) 0b01111111;
System.out.println(a1); //127
// 0b111111111 0b10000000 表示 -1到-128
byte b = (byte) 0b111111111;
System.out.println(b); // -1
byte b1 = (byte) 0b10000000;
System.out.println(b1); //-128
问题2: float/double精度问题
参考: https://www.runoob.com/w3cnote/java-the-different-float-double.html
例如: 78.375 转成 浮点计数
①整数部分: 78(十进制) = 1001110(二进制)
②小数部分: 0.375(十进制) = 3/8 = 1/4 + 1/8 = 2^(-2)+2^(-3) = 0.01(二进制)+0.001(二进制) = 0.011(二进制)
③78.375(十进制)=1001110.011(二进制)=1.001110011*2^6(二进制的科学计数法)
浮点型数据在计算机中的存储
第一部分用来存储符号位(sign),用来区分正负,这里是0,表示正数
第二部分用来存储指数(exponent),这里的指数是十进制的 6
第三部分用来存储小数(fraction),这里的小数部分是001110011
float 符号位: 1 bit 指数位: 8 bit 尾数位: 23 bit
double 符号位: 1bit 指数位: 11 bit 尾数位: 52 bit
float 的小数位只有 23 位,即二进制的 23 位,能表示的最大的十进制数为 2 的 23 次方,即 8388608,即十进制的 7 位,严格点,精度只能百分百保证十进制的 6 位运算。
double 的小数位有 52 位,对应十进制最大值为 4 503 599 627 370 496,这个数有 16 位,所以计算精度只能百分百保证十进制的 15 位运算。
final关键字:
① 用在变量的前面表示变量的值不可以改变,此时该变量可以被称为常量。
② 用在方法的前面表示方法不可以被重写。
③ 用在类的前面表示该类不能有子类,即该类不可以被继承(String类)。
重点: final 修饰变量
(1) final 修饰的局部变量必须使用之前被赋值才能使用。
(2) final 修饰的成员变量在声明时没有赋值的叫“空白final变量”。空白final变量必须在构造方法或静态代码块中初始化。
final 修饰基本类型变量和引用类型变量的区别:
当使用 final 修饰基本类型变量时,不能对基本类型变量重新赋值,因此基本类型变量不能被改变。
但对于引用类型变量而言,它保存的仅仅是一个引用,final 只保证这个引用类型变量所引用的地址不会改变,即一直引用同一个对象,但这个对象完全可以发生改变。
但是有特殊情况,String类型和包装类型(Integer,Double等)为引用类型,但是其值是被final修饰的,所以其对象被final修饰后,也是不能被重新赋值的;
static关键字:
参考: https://www.cnblogs.com/dolphin0520/p/3799052.html
修饰变量: 此变量为静态变量,静态变量属于类,而不是属于对象,可以直接使用类名.变量名称调用
修饰方法: 静态方法,使用类名直接访问,
修饰代码块: 静态代码块,在类被加载构造方法执行前执行,且只执行一次。
面向对象:
接口:
接口可以多继承
接口中的方法,必须是抽象方法
接口中的变量默认必须是 public static final修饰的
接口中的变量为什么必须是 public static final修饰的?
接口是 Java 语言中的一个抽象类型,用于定义对象的公共行为。
接口可以被不同的类实现,所以必须是公有的,所以用public实现。
接口是不可以被实例化的,私有变量属于对象,static修饰的变量属于类。
接口被多个类实现的时候,A类中被修改, 那么B类中的数据也会被修改,就相互影响了。
jdk8之后接口中就可以创建static 和 default 方法了.default修饰方法只能在接口中使用,修饰的方法为普通方法,在实现类中可以被重写。
如果一个类继承的多个接口,有相同名称的default方法,会要求重写该方法
抽象类:
有抽象方法的类,一定是抽象类
抽象方法必须重写
除了不能实例化,其他跟类一样了
多态:
实现的必要条件: (1)继承/实现 (2)方法重写 (3) 基类引用指向派生类对象,即父类引用指向子类对象