一个尴尬的年纪,没有儿时的勇气,年少的冲动,成熟的物质,消融了那些不切实际的臆想,也接受了很多难以为继的事实,一直在路上 。

Java 数据类型、变量

Java 数据类型

  在 Java 中,对于每一种数据都定义了明确的具体的数据类型,在内存中分配了不同大小的内存空间。

整数类型 (byte、short、int、long)

1.Java 各整数类型有固定的表数范围和字段长度,不受具体 OS{操作系统:Operating System} 的影响,以保证 java 程序的可移植性。

2.Java 的整数类型数据默认为 int 类型,声明为 long 类型时须在变量值的末尾加上一个 'l' 或 'L' 。

//1.定义 long 型变量,值的末尾需加 'l' 或 'L'。
//2.整数类型的数据默认是 int 类型,声明为 long 类型时不添加 'l' 或 'L' 不会报错。
//3.不加 'L' 默认是 int 型,int 转为 long 是安全的,所以会自动转,能编译通过。
//4.当变量值超过了 int 的表数范围时,必须添加 'l' 或 'L' ,否则编译不通过,会报错!
long l1 = 231457l;
long l2 = 567323L;

3.声明 long 型变量变量值后不加 'l' 或 'L' 编译可以通过,原因是整型变量值默认是 int 类型,占用 4 字节,声明为 long 类型为 8 个字节,int 转为 long 是安全的(小转大为自动类型转换),不会损失精度,能编译通过,因此不会报错。

4.byte 字节、bit 位,一个位只能存储 0 或 1 ,1 个字节等于 8 个位(1byte=8bit),电脑存文件底层使用的是字节(byte)。

浮点类型 (float、double)

1.浮点类型是带小数点的数值,与整数类型类似,Java 浮点类型也有固定的表数范围和字段长度,不受具体 OS 的影响。

2.Java 的浮点类型数据默认为 double 类型,声明为 float 类型时须在变量值的末尾加上一个 'f' 或 'F' 。

//1.定义 float 型变量,值的末尾需加 'f' 或 'F'。
//2.浮点类型的数据默认是 double 类型,声明为 float 类型时不添加 'f' 或 'F' 会报错,编译不通过!
//3.浮点数不加 'F' 默认是 double 类型,double 转 float 可能损失精度,因为不会自动转,编译是通不过的。
float f1 = 12.3f;
float f2 = 12.3F;

3.声明 float 型变量变量值后不加 'f' 或 'F' 编译不能通过,原因是浮点型变量值默认是 double 类型,占用 8 字节,声明为 float 类型为 4 个字节,大转小为强制类型转换,会损失精度,因此会报错。

4.浮点型常量有两种表示形式:
  ①十进制数形式,如:5.12、512.0f、.512   (必须有小数点)
  ②科学计数法形式,如:5.12e2、512E2、100E-2

字符类型 (char)

1.char 类型用来表示通常意义上的 "字符" (2字节), char 只能表示一个字符(如中文字符、英文字符、标点符号、转义字符、Unicode 值等),要是多个字符需要使用 String 字符串来表示。

2.char 类型是可以进行运算的,因为它都对应有 Unicode 码。一个 char 占用 2 个字节。

4.字符型常量的三种表现形式:
  ①字符常量是用单引号 ('')括起来的单个字符,涵盖世界上所有书面语的字符。
  

char c1 = 'a';              // 使用 char 表示英文字符
char c2 = 'ab';      ✘     // char 只能表示一个字符,'ab' 应该声明为 String 类型
char c3 = '中';            // 使用 char 表示中文字符

  
        ②Java 中还允许使用转义字符 '\' 来将其后的字符转变为特殊字符型常量。

转义字符 说明 转义字符 说明
\n 换行符 \r 回车符
\t 制表符 \b 退格符
\' 单引号 \" 双引号
\|反斜线 |转义符
//1.使用 char 表示转义字符,每一个转义字符都是一个字符
char c1 = ‘\n’;   // '\n' 为换行符
char c2 = ‘\t’;   // '\t' 为制表符,相当于 tab 键

//2.程序中使用 " \ " 来进行符号的转义。
System.out.println("魏鑫是个\"帅\"哥");    // 帅加个双引号

        ③直接使用 Unicode 值来表示字符型常量:‘\uXXXX’。其中,XXXX代表一个十六进制整数。

//使用 char 表示 Unicode 值
char c1 = "\u000a";   // '\u000a' 表示换行符 "\n"。
char c2 = '\u1234';   // '\u1234' 表示一个 "?" 号。

布尔类型 (boolean)

1.boolean 类型适于逻辑运算,一般用于程序流程控制。
   ● if 条件控制语句           ● for 循环控制语句
   ● while 循环控制语句     ● do-while 循环控制语句

2.boolean 类型变量只允许取值 true 和 false,不能取值为 null。
3.不可以使用 0 或非 0 的整数替代 false 和 true,这点和 C 语言不同。

//boolean 类型只允许取值 true 和 false
boolean b1 = true;
boolean b2 = false;

String 类型

► 字符串也是一种数据类型,即 String 类型,String 是一个不可变类,属于引用数据类型。

► String 类型用于表示由零或多个 16 位 Unicode 字符组成的字符序列,即字符串。字符串可由单引号或者双引号表示,字符串由零个或多个字符构成,字符包括字母、数字、标点符号和空格。字符串必须放在引号里,单引号和双引号都允许使用。

► String 类属于引用类型,可以使用 null 赋值。String 类是一个典型的不可变类,String 对象创建出来就不可能被改变,创建出的字符串将存放在数据区,保证每个字符串常量只有一个,不会产生多个副本。

String s0 = "hello";
String s1 = "hello";
String s2 = "he" + "llo";
String s3 = new String("hello");
System.out.println(s0==s1);  //true
System.out.println(s0==s2);  //true
System.out.println(s0==s3);  //false
		            
//如何理解 String s3 = new String(“hello”); ?

► 字符串的赋值可以为 "字符串" ,也可以是 数字 +"字符串" 的形式。字符串与基本数据类型不兼容,不能进行数据类型转换,否则编译报错。

► 字符串与基本数据类型之间的运算只能是连接运算 ,使用加号(+)表示连接,得到的结果仍为一个字符串。

► 值 null 可以赋值给任何引用类型的变量(类、接口、数组) ,用以表示这个引用类型变量中保存的地址为空。

//字符串也是一种数据类型 String 类型
String s = "abc";   
int i = 123;  
//字符串与基本数据类型之间的运算只能是连接运算(+),得到的结果仍为一个字符串。
String str = s+i;  // 加号 "+" 表示连接
System.out.println(str);   //结果为:abc123
		
//字符串与基本数据类型不兼容,不能进行数据类型转换,否则编译报错。
//String s1 = 12;  【✘】
String s2 = "12";    //字符串的赋值为 "字符串" 的形式
String s3 = 12 + "";  //字符串的赋值为 数字+"字符串" 的形式

自动类型转换

► 在 java 程序中,不同的基本数据类型的值经常需要进行相互类型转换,类型转换分为自动类型转换和强制类型转换。布尔类型 boolean 占有一个字节,由于其本身所代表的特殊含义,boolean 类型与其他基本数据类型不能进行类型的转换(既不能进行自动类型的提升,也不能强制类型转换),否则,将编译出错。

► java 的所有数值型变量可以进行相互转换,如果系统支持把某种基本类型的值直接赋值给另一种基本类型的变量,则这种方式成为自动类型转换。当把一个表数范围较小的数值或变量直接赋给另外一个表数范围比较大的变量时,系统将可以自动类型转换,否则需要强制转换。

► 自动类型转换:当容量小的数据类型与容量大的数据类型做运算时,容量小的类型会自动转换为容量大的数据类型。Ps:容量的大小是指表数范围的大小,即占内存的空间大小。

► 变量之间是可以进行运算的(除 boolean 类型变量外),运算的过程中会涉及到自动类型转换和强制类型转换。当有多种类型的数据混合运算时,系统首先自动将所有数据转换成容量最大的那种数据类型,然后再进行计算。注意点:①byte,short,char 之间不会相互转换,他们三者在计算时首先转换为 int 类型。 ②boolean 类型不可以转换为其它的数据类型。③char 字符类型的数据都对应着一个 Unicode 值,因此也可以用来运算。

► 基本类型转换为字符串:当把任何基本类型的值和字符串值进行连接运算时(使用 + 进行连接运算),基本类型的值将自动转换为字符串类型。因此,如果想将基本类型的值转换为对应的字符串,可以把基本类型的值和一个空字符串进行连接。

//自动类型转换
long l = 12L;  // 8字节
float f = l;   // 4字节
		
char c = 'a'; // 'a' 的 Unicode 值为 97,'A' 的 Unicode 值为 65
int i = c+1; 
System.out.println(i);  //结果为:98
		
byte b = 1;
short s = 12;
//1.当char 、byte、short类型的变量之间做运算时,默认的结果为 int 类型。
//2.当char 、byte、short类型的变量自身做运算时,默认的结果类型也为 int 类型。
//3.规定char 、byte、short运算默认转换为int类型的原因:char 、byte、short的表数范围很小,运算时很容易超出范围。
//short s1 = b+s;  【✘】
//char c1 = c+b;   【✘】

强制类型转换

► 强制类型转换:即强制显示的把一种数据类型转换为另外一种数据类型。强制类型转换是自动类型转换的逆过程,将容量大的数据类型转换为容量小的数据类型,使用时要加上强制转换符:(目标数据类型)。强制类型转换可能造成精度损失、降低或溢出,格外要注意。

//强制类型转换的运算符是圆括号:(目标数据类型)
目标数据类型 变量名 = (目标数据类型) Value;

► Java 中的类型转换就像倒水,如下图所示,小杯的水倒进大杯,水就不会流失。但是,如果大杯的水向小杯里倒,那么水就有可能会溢出来。类型转换也是一样,容量大的数据类型就像是大杯里的水,容量小的数据类型就像小杯里的水,如果把容量大的数据类型的变量的值赋给容量小的数据类型的变量,当数据大小超过容量小的数值类型的表数范围时,就会发生数据截断,数据将会丢失。说明:强制类型转换很容易造成精度损失、降低或溢出,使用时加倍小心。

► boolean 类型不可以转换为其它的数据类型。

► 通常,字符串不能直接转换为基本类型,但通过基本类型对应的包装类则可以实现把字符串转换成基本类型。

//案例
String a = "123";   
int i = Integer.parseInt(a);
//1.强制类型转换:容量大转换为容量小的,要使用强制类型转换符 () 。
long l = 12345L;
int i = (int)l;
		
//2.强制类型转换的问题:容易导致精度的损失
int i2 = 12345;
byte b = (byte)i2;
System.out.println(b);  // 结果为:57 ,造成了精度的损失
		
//原因:造成精度损失,int为8字节32位,byte为1字节为8位,将int的32位从高位往底位砍到8位为止【高位字节数据丢失】,最后的十进制结果为 57。
//小贴士:可使用电脑自带的计算机,选择程序员模式进行结果测试。

总结
1.java 中整数类型默认是 int 类型,小数类型默认是 double 类型。
2.char 类型可以当做一种特殊的整数类型,每一个字符对应着一个 Unicode 值。
3.boolean 类型不能转换为其它数据类型,其它类型也不能转换为 boolean 类型。
4.小数类型转为整数类型,小数可能被舍弃,出现精度损失,所以需要强制转换。

表达式类型的自动提升

▶ 当一个 java 算术表达式中包含多个基本类型的值时,整个算术表达式的数据类型将发生自动提升。

▶ Java定义如下的自动提升规则:
  ①所有 byte 型、short 型和 char 型将被提升到 int 型。
  ②整个算术表达式的数据类型自动提升到与表达式中最高等级操作数同样的类型。操作数的等级排列如下图所示,位于箭头右边类型的等级高于位于箭头左边类型的等级。

1.下面程序示范了一个典型的错误:

//定义一个short类型变量
short sValue = 5;
//表达式中的sValue将自动提升到int类型,则右边的表达式类型为 int
//将一个int类型赋给short类型的变量将发生错误。
sValue = sValue - 2;

//上面的 sValue -2 表达式的类型将被提升到int类型,这样就是把右边的int型值赋给左边的short型变量,从而引起错误。

2.表达式类型自动提升的正确示例代码

byte b = 40;
char c = 'a';
int i = 23;
double d = .314;  //0.314
//右边表达式中在最高等级操作数为 d(double型)
//则右边表达式的类型为double型,故赋给一个double型变量
double result = b + c + i * d;
//将输出144.222
System.out.println(result);

//注意点:表达式的类型将严格保持和表达式中最高等级操作数相同的类型

3.两个 int 整数进行除法运算,即使无法除尽,也将得到一个 int 结果。

int val = 3;
//右边表达式中2个操作数都是int,故右边表达式的类型为int
//因此,虽然23/3不能除尽,依然得到一个int整数
int intResult = 23 / val;
//将输出7
System.out.println(intResult);

//当两个整数进行除法运算时,如果不能整数,得到结果将是把小数部分截断取整后的整数。

4.如果表达式中包含了字符串,则又是另一番情形:因为把加号(+)放在字符串和基本类型值之间时,这个加号是一个字符串连接运算符,而不是进行加法运算。

//输出字符串Hello!a7
System.out.println("Hello!" + 'a' + 7);
//输出字符串104Hello!
System.out.println('a' + 7 + "Hello!");

//1.第一个表达式"Hello!" + 'a' + 7,先进行"Hello!" + 'a'的运算,将把'a'转换成字符串,将拼接成字符串Hello!a,接着进行"Hello!a" + 7的运算,这也是一个字符串连接运算,得到结果是Hello!a7。
//2.第二个表达式,先进行'a' + 7加法运算,其中'a'自动提升到int型,变成a对应的ASCII值:97,从97 + 7将得到104,然后进行104 + "Hello!",104会自动转换成字符串,将变成两个字符串的连接运算,从而得到104Hello!。

Java 变量

变量的概念

1.变量的概念:变量是内存中的一个存储区域,该区域有自己的名称(变量名)和类型(数据类型),该区域的数据可以在同一类型范围内不断变化。
2.在 Java 中,对于每一种数据都定义了明确的具体数据类型,在内存中分配了不同大小的内存空间。
3.Java 中的每个变量都必须先声明,后使用。

4.变量的作用域:Java 中的变量是有作用范围(Scope)的,也称作用域。一旦超出变量的作用域,就无法再使用这个变量。在程序中,变量一定会被定义在某一对大括号中,该大括号所包含的代码区便是这个变量的作用域。即 Java 变量的作用域为一对 { } 之间有效。 Ps:是距离变量最近的 {} 内有效。

5.Java 中的每个变量都会有一个初始化值,默认初始化或显示初始化。
6.变量是通过使用变量名来访问这块区域的。
7.Java 中定义变量的格式:

//Java 变量的语法
数据类型 变量名 = 初始化值;

变量的分类

1.按数据类型:基本数据类型(8种)和引用数据类型(类、接口、数组)。

  • 在 Java 中,对于每一种数据都定义了明确的具体数据类型,在内存中分配了不同大小的内存空间。

2.按声明的位置的不同:
  ①在方法体外,类体内声明的变量称为成员变量。
  ②在方法体内部声明的变量称为局部变量。
  ③成员变量和局部变量在初始化值方面的异同:【同】都有生命周期 【异】局部变量除形参外,需显式初始化。

posted @ 2019-11-28 05:32  斯文败类i  阅读(582)  评论(0编辑  收藏  举报