Java复习笔记(一)貌似与面向对象无关之数据类型

没别的意思,唠唠自己吃饭的家伙事儿,出来工作一年多,接触到的技术也杂了,回头捋一捋,别乱了。重在根基,先从比较low的基础开始。

Java是一门面向对象的语言,为了执行效率的需要,也会有特例的存在,基本数据类型就是和代数里的加减乘除差不多,日常编程用的比较多,语言设计的时候就没有被阉割掉,这点也受到了一些人的诟病,感兴趣的同学可辩证性深入研究,这里不做阐述。Java是强类型语言,变量都有指定的类型,基本数据类型讲白了和小学数学差不多,Java基本数据类型可以分类四类(八种),无非就是表示整数的整型,表示小数的浮点型,表示字符的char以及表示真假的布尔类型(这句划重点)。

整型

Java中的整数,正负数一概而论,没有无符号一说,根据表示范围分配相应字节数,细分成了byte、short、int和long四种。

  • byte:就是字节的意思,常用于网络或文件的数据流,用byte表示,占一个字节,一个字节八位,能表示28个数,范围就是-128~127,注意0的存在,把完整代码敲一下,详细点说吧。
public class TestDataType {
   public static void main(String args[]) {
      byte i = 12;
      // byte j =128;//此处会报错
      System.out.println(i);// 12
   }
}

就是新建了一个类,在main方法中声明一个byte类型的数,并输出,注意数字范围不能超过-128~127。(不能再详细了,改天要是写成教程性质的东西,我再补个hello world的入门呗,目前先欠着。)

  • short:比较少用,用short声明,占两个字节,表示范围计算方式同上,-216~216-1,没啥可说的,代码打个样,其余的自己敲一下。
short i2 = 2333;
short i3 = 100000;//编译报错
  • int:最常用的整数类型,使用关键字int声明,占4个字节,表示范围大约是21亿,常用的数据基本都包括了。Java中数值默认是int类型的,常常用于循环控制和数组的索引,需要说一下的就是,JDK 7之后,遇到比较大的数值,可以用下划线分隔一下,一目了然。
int i = 15;
int j = 10_0000_000;//JDK 7后,可以用下划线分隔数值,增加可读性,对数值无影响
System.out.println(j);
  • long:当数值超过21亿了,就要再度扩宽存储范围了,用8个字节表示,表示范围计算方式同上。需要特别注意的是,long类型的数值,加个后缀L或小写l标示一下,最好用大写L,小写的和数字1长得太像了,看着费劲。
int i = 15L;
int j = 10_0000_000000L;
System.out.println(j);

long类型基本上能把地球上常用的整数都表示出来了,再大的就成特例了,用BigInteger表示,用到再说。基本把整型的思路捋了一下,上面整数都是十进制的,敲黑板补充个小知识点,讲讲八进制,十六进制这些偶尔能用到的。

进制

最常用的就是十进制,八进制,十六进制,JDK7之后也允许二进制了,别给我说七进制、九进制,无非是一个表达形式,先明白常用的,再玩出花,别净整些没用的。

  • 八进制:以0开头,0~7之间的数字表示,使用的时候留点神,如下:
int i = 012;//八进制,数值为十进制的10
byte j = 0135;//注意是八进制,没有超出范围,数值为93
System.out.println(j);//输出的是十进制数 93
  • 十六进制:以0x开头,注意是数字0(手动加粗),别瞅成字母o了,用0 ~ 9,a ~ e表示,举个例子吧
int i = 0x36E;
System.out.println(i);//878
  • 二进制:以0b开头,表示方法类比上面了。
int i = 0b1010_0011;
System.out.println(i);//163

上面说过了,可以用下划线隔开的。

注意:二进制,八进制,十六进制都只能表示正整数,相互转换的时候,可以先转成十进制,然后转换,多的不说了,上学的时候有本书叫计算机组成原理,感兴趣的话翻翻,大概有用。

浮点数

聊完整数了,就扯一下小数,Java中按小数精确度,分成了单精度float和双精度double,小数默认是双精度的,有两种表示方法,一种是十进制形式,如3.14等,还有一种就是科学计数法,例3.14E-2表示0.0314,这个我记的小学数学里有。

  • float:精度稍微低一点,运算效率高,占4个字节,有效数字6~7位,这个表示范围不能再和整数一样计算了,稍微有点复杂,先不说,单精度要以f或F结尾。

  • double:精度比较高,占8个字节,以D或d结尾,省略的话,默认也是double,数学运算中常用到。与float特性相对应,运行效率略低,现在很多处理器对数学函数计算做了优化,效率影响就忽略掉吧,在以后的编码中,能用双精度的尽量双精度就可以了。

浮点类型里有个坑可以说一下,这个其实是不精确的,不能用来比较,如下代码,试着理解一下,理解不了就记住别拿浮点的乱比较。

float i =0.01f;
float j = 1/100;
System.out.println(i==j);//float  
char

整数小数都说了,还有两个字符类型的,用来表示个ABCD啥的,或者单个的汉字,符号。Java采用的是Unicode编码,这个码表几乎包含了世界上所有的字符,所以说要表示的多啊,至于能表示的多到什么程度呢,六万多!用两个字节表示,65536,别问这数咋算出来的,216
值得白活一下的就是,char可以看做是一种特殊的数值,给个字符,可以根据码表转换成相应的数字。

char ch = '中';
int ch2 = ch;
System.out.println(ch2);//20013  
布尔类型

boolean类型比较实诚,非真即假,真用true表示,假用flase表示,就两个值。通常用于逻辑判断来控制流程。

boolean flag = false;

有人的地方就有江湖,类型之间同样会相互产生关系,有关系必然有矛盾,那就需要解决类型转换的问题。

类型转换

数据类型肯定不是一成不变的,就会在不同类型间进行转换,转换主要有三种,比较让人省心的:自动类型转换,比较明显的强制类型转化,还有比较隐蔽的表达式中类型的提升。

  • 自动类型转化:就是小范围的转换成大范围的类型,自动转换,无损。
byte i = 8;
int j = i;

这样都是可以的,char也可以看做一种整型,转化成int,也不会有精度损失。自动类型转换有个特例,上面我们说过默认都是int类型啊,上面的byte i = 8,8是int类型啊,java里规定,只要不超过整型范围,int可以转换成byte,short的,就是从大范围转化成小范围,记住这个就好。

  • 强制类型转换:强制类型转换,就是本来不允许啊,在数值前面加小括号和目标数据类型,强迫它变成这样,有种逼良为娼的味道。
int i = (int)3.14;
System.out.println(i);//3

有时候会丢失精度,有人对类型转化画了个图,我抄过来,方便理解一下

Java复习笔记(一)貌似与面向对象无关之数据类型_第1张图片
image.png

实线箭头的,都是小范围到大范围,不会损耗,虚线的也可以转换,可能会损耗精度。

  • 表达式转换:表达式转换,那就有的聊了,先看一段代码:
byte i = 8,j=16;
byte b = i+j;

实际byte b = i +j;这行代码会报错,虽然没有超出表示范围,但是表达式中会有个类型自动提升的问题,整型数值计算的时候,自动转换成int类型。当然有long类型数值参与运算时,会自动转换成long类型,原则是转换成比较大范围的数据类型。

你可能感兴趣的:(Java复习笔记(一)貌似与面向对象无关之数据类型)