第一章 语言基础
1.1 数据类型
文章目录
本人只是个Java超级新的新手,本文也只是为了记笔记,欢迎大佬吐槽并指出不足,万望轻喷
1.1.1 基本数据类型
Java定义了四类共八种基本类型
整型:byte,short,int,long
浮点型:float,double
布尔型:boolean
字符型:char
整数类型的范围
类型 数据位 范围 字节数 byte 8 -27~27-1 1 short 16 -215~215-1 2 int 32 -231~231-1 4 long 64 -263~263-1 8
Java的四种基本整型都是带符号位的,至于为什么数据位和范围是如上表,还是得补一下计算机组成原理的知识。。。给忘了。。我对不起老师(っ °Д °;)っ
浮点型的范围
类型 | 数据位 | 范围 | 字节数 |
---|---|---|---|
float | 32 | 负数:-3.4 028 235E+38 ~ -1.4E-45 | 4 |
正数:1.4E-45 ~ 3.4 028 235E+38 | |||
double | 64 | 负数:-1.797 693 134 862 315 7E+308 ~ -4.9E-324 | 8 |
正数:4.9E-324 ~ 1.797 693 134 862 315 7E+308 |
值得一说的是,一个浮点数隐含位double类型,如果在一个浮点数后面加 “f” 或 “F” 会将其强制转换为float,如果声明float变量时不使用 f 或 F ,系统就会认为这是一个double变量,那么就会报错。
double占了8个字节,有效数字最长15位,因为精度范围是float的两倍而被成为双精度类型。
布尔型
布尔型也叫做逻辑型,boolean,只有 true 和 false 两个逻辑值,所有关系运算如(a==b)等返回的都是布尔型的值
字符型
字符型,又叫做char,采用Unicode字符集,用来存储单个字符,在内存中占了两个字节,是16位无符号的整数,有65536个,取值范围自然是0 ~ 65535,表示在Unicode中的排序位置。
Unicode的字符表的前128个字符刚好是ASCII表,每个国家的字母表的字母都是Unicode中的一个字符,所以Java支持多语种
声明字符型数据的时候使用单引号
char c = 'c';
Java中所有可见的ASCII的字符都可以用单引号来转化内字符,要得到字符在Unicode字符集中的取值,需要强转为int,如 (int)‘a’;
而自然的,一个整数也可以用强转转化为字符型,只要这个整数的值在字符型的范围内
声明常量
通过其他语言很容易知道声明变量,在Java中声明常量需要final标识符,且规范常量是全大写
final int MAX = 10;
常用转义符
转义符 代表意义 转义符 代表意义 \f 换页 \n 换行 \r 回车 \t 跳格一个制表符 \\ \ \" 一个双引号 \’ 一个单引号 \b 退格
1.1.2 字符串类型转化
1)自动类型转换
即自动的会把(转换前后类型兼容)范围较小的数据转化为范围较大的数据
例如
float f = 0.1f; double d = 0.20; System.out.println(f+d);
最后会输出一个double的0.30,因为自动转换规则是小的往大的转换,当然转换前后的数据需要兼容,不能指望字符型能够自动转换为整数型吧。
2)字符串类型转化内数值型
数字的字符串可以调用 A.parseX(变量) , A代表数字字符串的内容的包装类,X代表需要转换成的数字类型的包装类。
String myNum = "12.3"; Double myDouble = Float.parseDouble(myNum);
3)强制转化
char c = 'c';
int a = (int)c;
强制转换在接口,对象那里也有用到。
1.1.3 数据类型内存
Java中将内存分为两块,栈内存和堆内存。
显然数据类型,如整型,浮点型等是基础的语法,本人理解Java的数据类型涉及到Jvm虚拟机,整型等基本类型是放在栈内存中,而数组等需要new出来的对象,即显式实例化的是实际放在堆内存中,而对象的名字是存放在栈内存,同时在栈内存中存放了一个地址,指向了堆内存中的对象。例如:
String a = new String("I am a String-object.")
在上述代码中,a是一个字符串实例化的对象的引用变量,这个字符串的内容实际上是存放在堆内存中,而a这个名字和这个字符串在堆内存中的地址是存放在栈内存中的。
而对于下面的代码,情况又有不同:
Object[] test = new Object[]{"a","b"};
定义了a,b两个字符串,同时将他们传入Object数组中,在这里c这个数组名字是保存在栈内存中,然后c[0]指向了字符串a在堆内存中的地址,c[1]指向了字符串b在堆内存中的地址。
这就是Java中的指针。
当没有一个对象在堆内存中没有任何对象引用时,最后会被GC(垃圾回收器)回收掉。
另外,在Java中一个引用变量只能指向唯一的一个对象,不过同一个对象可以被多个引用变量引用,就好比你只能有一个女神(男神),但你的女神(男神)显然可以有多个备胎。( ̄▽ ̄)" 稍微有点不准确,不过大概是这个意思,代码如下:
MyUser a = new MyUser(); Myuser b; b=a;
那么,在这种情况下,对a的任何操作,比如更改成员变量值之类,自然也会更改b的值,因为他们根本上引用了同一个东西
1.1.4 基本数据类型拆箱装箱
常用数据类型及其包装类
例如:
int i = 10; Integer j = 10
后者Integer时int的包装类,这就是装箱,这种使用装箱定义的变量在运算时需要拆箱为int,因此速度较慢。
Integer对象判等方式
Integer a1 = 11; Integer a2 = 11;
有变量a1和a2如上,那么a1==11当然是true,因为a1拆箱为int。
但是在Java中还有一个特性,就是只对比类对象的引用名而不对比值,结果会是false。但是在这里,当你测试a1和a2是否相等时,结果却会是true,这是为什么呢?
这是因为Java提供了缓存机制,当值范围在整数[-128,127]以内的数,会自动装箱为int类型(使用构造函数时除外),所以这里实际上是两个int在对比,当然想等。
如果你定义如下
Integer b1 = 128; Integer b2 = 128;
那么当你进行判等时,b1==b2 结果为false,因为这已经超出了自动装箱的范围。
所以类对象对比其值的话,应该使用.equal()方法。
1.1.5 自键盘数据输入输出
从键盘输入
显然有两种键盘输入方式,一种是调用java.io.*的一个方法,不过这种方式异常麻烦,所以只记下了第二种方式
引入java.util类库的Scanner类并实例化对象,通过类对象来输入
import java.util.Scanner public class test { public static void main(String[] args) { Scanner sc = new Scanner(System.in); //sc为对象名,创建Scanner对象用于读取System.in的输入 double num; num = sc.nextDouble(); //调用.nextDouble,读取double类型的输入并保存 sc.nextByte(); sc.nextFloat(); sc.nextInt(); sc.nextLong(); sc.nextDouble(); sc.nextShort(); sc.next(); sc.nextLine() //这里列举了一些常用方法 //.next和.nextLine是用于输入字符串,返回一个字符串类型的数据 //.next需要读取到有效字符才可以结束输入,空格,回车等不算有效字符 } }
上述的nextXX()方法被调用后,则需要用户输入数据后按回车(或者空格等)确认。通常是让sc对象先调用hasNextXXX()方法做判断,再调用.nextXXX()输入数据。
例如输入一个浮点型,用 sc.hasNextFloat() 和 sc.hasNextInt()做判断,则sc.hasNextFloat()为true,可以执行接下来的输入操作 sc.nextFloat()
上述的nextXX()方法被调用后,则需要用户输入数据后按回车(或者空格等)确认。通常是让sc对象先调用hasNextXXX()方法做判断,再调用.nextXXX()输入数据。
例如输入一个浮点型,用 sc.hasNextFloat() 和 sc.hasNextInt()做判断,则sc.hasNextFloat()为true,可以执行接下来的输入操作 sc.nextFloat()