Java数据类型(修改)

Java数据类型(修改)

定义变量就是申请内存来存储值。也就是说,当创建变量的时候,需要在内存中申请空间。

内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来储存该类型数据。

Java 的两大数据类型:

基本(Primitive)数据类型

引用(Reference)数据类型

基本数据类型 / 基本类型

Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。

Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。

byte:byte数据类型是8位、有符号的,以二进制补码表示的整数;

short:short 数据类型是 16 位、有符号的以二进制补码表示的整数;

int:int 数据类型是32位、有符号的以二进制补码表示的整数;

long:long 数据类型是 64 位、有符号的以二进制补码表示的整数;

float:float 数据类型是单精度、32位、符合IEEE 754标准的浮点数;

double:double 数据类型是双精度、64 位、符合IEEE 754标准的浮点数;

boolean:boolean数据类型表示一位的信息,只有两个取值:true 和 false;

char:char类型是一个单一的 16 位 Unicode 字符。

对于数值类型的基本类型的取值范围,我们无需强制去记忆,可以通过下面的例子了解:

public class PrimitiveTypeTest { 

    public static void main(String[] args) { 

        // byte 

        System.out.println("基本类型:byte 二进制位数:" + Byte.SIZE); 

        System.out.println("包装类:java.lang.Byte"); 

        System.out.println("最小值:Byte.MIN_VALUE=" + Byte.MIN_VALUE); 

        System.out.println("最大值:Byte.MAX_VALUE=" + Byte.MAX_VALUE); 

        System.out.println(); 

        // short 

        System.out.println("基本类型:short 二进制位数:" + Short.SIZE); 

        System.out.println("包装类:java.lang.Short"); 

        System.out.println("最小值:Short.MIN_VALUE=" + Short.MIN_VALUE); 

        System.out.println("最大值:Short.MAX_VALUE=" + Short.MAX_VALUE); 

        System.out.println(); 

        // int 

        System.out.println("基本类型:int 二进制位数:" + Integer.SIZE); 

        System.out.println("包装类:java.lang.Integer"); 

        System.out.println("最小值:Integer.MIN_VALUE=" + Integer.MIN_VALUE); 

        System.out.println("最大值:Integer.MAX_VALUE=" + Integer.MAX_VALUE); 

        System.out.println(); 

        // long 

        System.out.println("基本类型:long 二进制位数:" + Long.SIZE); 

        System.out.println("包装类:java.lang.Long"); 

        System.out.println("最小值:Long.MIN_VALUE=" + Long.MIN_VALUE); 

        System.out.println("最大值:Long.MAX_VALUE=" + Long.MAX_VALUE); 

        System.out.println(); 

        // float 

        System.out.println("基本类型:float 二进制位数:" + Float.SIZE); 

        System.out.println("包装类:java.lang.Float"); 

        System.out.println("最小值:Float.MIN_VALUE=" + Float.MIN_VALUE); 

        System.out.println("最大值:Float.MAX_VALUE=" + Float.MAX_VALUE); 

        System.out.println(); 

        // double 

        System.out.println("基本类型:double 二进制位数:" + Double.SIZE); 

        System.out.println("包装类:java.lang.Double"); 

        System.out.println("最小值:Double.MIN_VALUE=" + Double.MIN_VALUE); 

        System.out.println("最大值:Double.MAX_VALUE=" + Double.MAX_VALUE); 

        System.out.println(); 

        // char 

        System.out.println("基本类型:char 二进制位数:" + Character.SIZE); 

        System.out.println("包装类:java.lang.Character"); 

        // 以数值形式而不是字符形式将Character.MIN_VALUE输出到控制台 

        System.out.println("最小值:Character.MIN_VALUE=" 

                + (int) Character.MIN_VALUE); 

        // 以数值形式而不是字符形式将Character.MAX_VALUE输出到控制台 

        System.out.println("最大值:Character.MAX_VALUE=" 

                + (int) Character.MAX_VALUE); 

    } 

}

运行结果如下:

Java 可运行于多个平台,Windows, Mac OS 及其他多种 UNIX 版本的系统。

基本类型:byte 二进制位数:8

包装类:java.lang.Byte

最小值:Byte.MIN_VALUE=-128

最大值:Byte.MAX_VALUE=127

基本类型:short 二进制位数:16

包装类:java.lang.Short

最小值:Short.MIN_VALUE=-32768

最大值:Short.MAX_VALUE=32767

基本类型:int 二进制位数:32

包装类:java.lang.Integer

最小值:Integer.MIN_VALUE=-2147483648

最大值:Integer.MAX_VALUE=2147483647

基本类型:long 二进制位数:64

包装类:java.lang.Long

最小值:Long.MIN_VALUE=-9223372036854775808

最大值:Long.MAX_VALUE=9223372036854775807

基本类型:float 二进制位数:32

包装类:java.lang.Float

最小值:Float.MIN_VALUE=1.4E-45

最大值:Float.MAX_VALUE=3.4028235E38

基本类型:double 二进制位数:64

包装类:java.lang.Double

最小值:Double.MIN_VALUE=4.9E-324

最大值:Double.MAX_VALUE=1.7976931348623157E308

基本类型:char 二进制位数:16

包装类:java.lang.Character

最小值:Character.MIN_VALUE=0

最大值:Character.MAX_VALUE=65535

基本类型:byte 二进制位数:8

包装类:java.lang.Byte

最小值:Byte.MIN_VALUE=-128

最大值:Byte.MAX_VALUE=127

基本类型:short 二进制位数:16

包装类:java.lang.Short

最小值:Short.MIN_VALUE=-32768

最大值:Short.MAX_VALUE=32767

基本类型:int 二进制位数:32

包装类:java.lang.Integer

最小值:Integer.MIN_VALUE=-2147483648

最大值:Integer.MAX_VALUE=2147483647

基本类型:long 二进制位数:64

包装类:java.lang.Long

最小值:Long.MIN_VALUE=-9223372036854775808

最大值:Long.MAX_VALUE=9223372036854775807

基本类型:float 二进制位数:32

包装类:java.lang.Float

最小值:Float.MIN_VALUE=1.4E-45

最大值:Float.MAX_VALUE=3.4028235E38

基本类型:double 二进制位数:64

包装类:java.lang.Double

最小值:Double.MIN_VALUE=4.9E-324

最大值:Double.MAX_VALUE=1.7976931348623157E308

基本类型:char 二进制位数:16

包装类:java.lang.Character

最小值:Character.MIN_VALUE=0

最大值:Character.MAX_VALUE=65535

说明:FloatDouble的最小值和最大值都是以科学记数法的形式输出的,结尾的"E+数字"表示E之前的数字要乘以10的多少次方。比如3.14E3就是3.14 × 103 =31403.14E-3 就是 3.14 x 10-3 =0.00314

类型默认值

下表列出了 Java 各个类型的默认值:

数据类型

默认值

byte

0

short

0

int

0

long

0L

float

0.0f

double

0.0d

char

'u0000'

String (or any object)

null

boolean

false

选择数据类型原则:

如果要表示整数就使用int,表示小数就使用double;

如果要描述日期时间数字或者表示文件(或内存)大小用long;

如果要实现内容传递或者编码转换使用byte;

如果要实现逻辑的控制,可以使用booleam;

如果要使用中文,使用char避免中文乱码;

如果按照保存范围:byte < int < long < double;

字面量和常量

字面量

字面量又称为字面常量(literal value:字面量、直接量),它是通过数据直接表示的,因此有很多种数据类型,像整型和字符串型等。

1)整型字面量

Java 的整型字面量主要有如下 3 种形式。

☆十进制数形式:如 54、-6、0。

☆八进制数形式:Java 中的八进制常数的表示以 0 开头,如 0125 表示十进制数 85,-013 表示十进制数 -11。

☆十六进制数形式:Java 中的十六进制常数的表示以 0x 或 0X 开头,如 0x100 表示十进制数 256,-0x16 表示十进制数 -22。

整型(int)常量默认在内存中占 32 位,是具有整数类型的值,当运算过程中所需值超过 32 位长度时,可以把它表示为长整型(long)数值。长整型类型则要在数字后面加 L 或 1, 如 697L,表示一个长整型数,它在内存中占 64 位。

2)实型字面量

Java 的实型字面量主要有如下两种形式。

☆十进制数形式:由数字和小数点组成,且必须有小数点,如 12.34、-98.0。

☆科学记数法形式:如 1.75e5 或 32&E3,其中 e 或 E 之前必须有数字,且 e 或 E 之后的数字必须为整数。

Java 实型常量默认在内存中占 64 位,是具有双精度型(double)的值。如果考虑到需要节省运行时的系统资源,而运算时的数据值取值范围并不大且运算精度要求不太高的情况,可以把它表示为单精度型(float)的数值。

单精度型数值一般要在该常数后面加 F 或 f,如 69.7f,表示一个 float 型实数,它在内存中占 32 位(取决于系统的版本高低)。

3)布尔型字面量

Java 的布尔型常量只有两个值,即 false(假)和 true(真)。

4)字符型和字符串字面量

char 类型的直接量有三种形式,分别是用单引号括起来的字符、转义字符和 Unicode 值表示的字符。例如‘a’,‘\n’和‘\u0061’。

需要注意的是,Java中的单引号和双引号不可混用。双引号用来表示字符串,像 "11"、"d" 等都是表示单个字符的字符串。在 Java 中,字符串实际上是对象类型。

5)null

它只有一个值:null。而且这个直接量可以赋给任何引用类型的变量,用以表示这个引用类型变量中保存的地址为空,即还未指向任何有效对象。

常量

常量就是一个固定值。它们不需要计算,直接代表相应的值。

常量不同于字面量,它可以在程序中用符号来代替字面量使用,因此在使用前必须先定义。常量与变量类似也需要初始化,即在声明常量的同时要赋予一个初始值。常量一旦初始化就不可以被修改。

Java 语言使用 final 关键字来定义一个常量,声明方式和变量类似,其语法如下所示:

final dataType variableName = value

其中,final 是定义常量的关键字,dataType 指明常量的数据类型,variableName 是变量的名称,value 是初始值。

常量有三种类型:静态常量、成员常量和局部常量。例如:

public class HelloWorld {

    // 静态常量

    public static final double PI = 3.14159;

    // 声明成员常量

    final int y = 10;

    public static void main(String[] args) {

        // 声明局部常量

        final double x = 5.3;

    }

}

在定义常量时,需要注意如下内容:

在定义常量时就需要对该常量进行初始化。

final 关键字不仅可以用来修饰基本数据类型的常量,还可以用来修饰对象的引用或者方法。

虽然常量名也可以用小写,但为了便于识别,通常使用大写字母表示常量。

当常量被设定后,不允许再进行更改,如果更改其值将提示错误。

数学运算符

数学运算,结果为一个数值。见下表:

运算符

说明

举例

+

加法

1 + 2 等于 3

-

减法

4 - 3.4 等于0.6000000000000001

*

乘法

7 * 1.5等于 10.5

/

除法

3.5 / 7等于 0.5

%

取余

7 % 2等于 1

++

自增

i = 2 则 ++i等于3

--

自减

J = 2则 --j等于1

Java的整数运算遵循四则运算规则,可以使用任意嵌套的小括号。四则运算规则和初等数学一致。

注意,Java语言中两个整数相除只能得到结果的整数部分:int x = 101 / 2; // 50

这一点和C、C++语言一样:整数除法就是整数结果,如果有浮点数才会出现浮点结果(有小数部分)。例如

public class Test {

  public static void main(String[] args) {

     int b = 101;

     System.out.println("b / 2 = " + (b / 2) );

  }

}

整数除法就是整数结果,如果有浮点数才会出现浮点结果(有小数部分)。将其中一个数改成浮点型,如上例中的  (b / 2)改为 (b/2.0) 或(b/(double)2) 得到准确结果。

自增、自减运算符的说明

操作数只能是变量,不能是常量或表达式

分前置和后置两种运算,例如:

    int i=5, j=5, m, n;

    m=i++; //后置++;相当于m=i; i=i+1; 结果:i的值为6,m的值为5;

    n=++j; //前置++;相当于j=j+1;n=j; 结果:j的值为6,n的值为6;

赋值运算符

下面是Java语言支持的赋值运算符:

作符

描述

例子

=

简单的赋值运算符,将右操作数的值赋给左侧操作数

C = A + B将把A + B得到的值赋给C

+ =

加和赋值操作符,它把左操作数和右操作数相加赋值给左操作数

C + = A等价于C = C + A

- =

减和赋值操作符,它把左操作数和右操作数相减赋值给左操作数

C - = A等价于C = C - A

* =

乘和赋值操作符,它把左操作数和右操作数相乘赋值给左操作数

C * = A等价于C = C * A

/ =

除和赋值操作符,它把左操作数和右操作数相除赋值给左操作数

C / = A,C 与 A 同类型时等价于 C = C / A

(%)=

取模和赋值操作符,它把左操作数和右操作数取模后赋值给左操作数

C%= A等价于C = C%A

<< =

左移位赋值运算符

C << = 2等价于C = C << 2

>> =

右移位赋值运算符

C >> = 2等价于C = C >> 2

&=

按位与赋值运算符

C&= 2等价于C = C&2

^ =

按位异或赋值操作符

C ^ = 2等价于C = C ^ 2

| =

按位或赋值操作符

C | = 2等价于C = C | 2

关系运算符

关系运算符,结果为一个布尔值。假设变量A的值为10,变量B的值为20,见下表:

运算符

描述

例子

==

检查如果两个操作数的值是否相等,如果相等则条件为真。

A == B)为假。

!=

检查如果两个操作数的值是否相等,如果值不相等则条件为真。

(A != B) 为真。

检查左操作数的值是否大于右操作数的值,如果是那么条件为真。

A> B)为假。

检查左操作数的值是否小于右操作数的值,如果是那么条件为真。

A <B)为真。

>=

检查左操作数的值是否大于或等于右操作数的值,如果是那么条件为真。

A> = B)为假。

<=

检查左操作数的值是否小于或等于右操作数的值,如果是那么条件为真。

A <= B)为真。

位运算符

位运算符对整数的二进制形式逐位进行逻辑运算,得到一个整数。假设整数变量 A 的值为 60 (二进制为11 1100)和变量 B 的值为 13(二进制为1101),见下表:

操作符

描述

例子

低位对齐,高位不足的补零,如果相对应位都是1,则结果为1,否则为0

AB),得到12,即0000 1100

|

低位对齐,高位不足的补零,如果相对应位都是 0,则结果为 0,否则为 1

A | B)得到61,即 0011 1101

^

低位对齐,高位不足的补零,如果相对应位值相同,则结果为0,否则为1

A ^ B)得到49,即 0011 0001

按位取反运算符翻转操作数的每一位,即0变成11变成0

A)得到-61,即1100 0011

<< 

按位左移运算符。左操作数按位左移右操作数指定的位数。高位移出(舍弃),低位的空位补零。

A << 2得到240,即 1111 0000

>> 

按位右移运算符。左操作数按位右移右操作数指定的位数。低位移出(舍弃),高位的空位补零。

A >> 2得到15 1111

>>> 

按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。

A>>>2得到150000 1111

逻辑运算符

下表列出了逻辑运算符的基本运算,假设布尔变量A为真,变量B为假

操作符

描述

例子

&&

称为逻辑与运算符。当且仅当两个操作数都为真,条件才为真。

(A && B)为假。

| |

称为逻辑或操作符。如果任何两个操作数任何一个为真,条件为真。

(A | | B)为真。

称为逻辑非运算符。用来反转操作数的逻辑状态。如果条件为true,则逻辑非运算符将得到false。

!(A && B)为真。

条件运算符(三目运算符)

Java中也有一个条件运算符(三目运算符):

    condition ? x1 : x2

condition为一个boolean值。根据condition,取x1或x2的值。

Java运算符优先级

说明:

1) 该表中优先级按照从高到低的顺序书写,也就是优先级为1的优先级最高,优先级14的优先级最低。

2)结合性是指运算符结合的顺序,通常都是从左到右。从右向左的运算符最典型的就是负号,例如3+-4,则意义为3加-4,符号首先和运算符右侧的内容结合。

3) instanceof作用是判断对象是否为某个类或接口类型,后续有详细介绍。

4)注意区分正负号和加减号,以及按位与和逻辑与的区别。

System.out.printf方法的格式标识符

格式化输出语法

System.out.printf(format,item1,item2,…,itemk)

这里的format是指一个由子串和格式标识符构成的字符串.

注意的问题

1.默认情况下,输出是右对齐的.可以在格式标识符中放一个符号(-),表明该条目在特定区域中的输出是左对齐的.

2.使用符号%来标记格式标识符,要在格式字符串里输出直接量%,需要使用%%

转换符

类型

举例

d

十进制整数

System.out.printf("%d",159); //159

x

十六进制整数

System.out.printf("%x",159); //9f

o

八进制整数

System.out.printf("%o",159); //237

f

定点浮点数

System.out.printf("%.1f",15.9); //15.9

e

指数浮点数

System.out.printf("%e",15.9); //1.590000e+01

System.out.printf("%.2e",15.9); //1.59e+01

g

通用浮点数

System.out.printf("%g",15.9); //15.9000

a

十六进制浮点数

System.out.printf("%.3a",15.9); //0x1.fcdp3

System.out.printf("%a",15.9); //0x1.fcccccccccccdp3

s

字符串

System.out.printf("问候%s","Hello"); //问候Hello

c

字符

System.out.printf("字母a的大写是:%c %n", 'A'); //字母a的大写是:A

b

布尔

System.out.printf("3>7的结果是:%b %n", 3>7); //3>7的结果是:false

n

换行符

见上两行

格式标识符的补充说明

① %4.2f

4为域宽度.输出的浮点数条目宽度至少为4,包括小数点和小数点后两位数字.这样,给小数点前分配了1位数字。

如果该条目小数点前的位数小于1,就在数字前面加空格。

如果该条目小数点前的位数大于7,则自动增加宽度。

2为精度().即想要输出的小数点的长度。

f为转换码。

② "%x"表示以十六进制; 输出;"%X"表示以十六进制输出,并且将字母(A、B、C、D、E、F)换成大写。

③格式为"%t"表示输出时间日期类型。"%t"之后用y表示输出日期的二位数的年份(如99)、用m 表示输出日期的月份,用d表示输出日期的日号;"%t"之后用Y表示输出日期的四位数的年份 (如1999)、用B表示输出日期的月份的完整名,用b表示输出日期的月份的简称。"%t"之后用D 表示以"%tm/%td/%ty"的格式输出日期、用F表示以"%tY-%tm-%td"的格式输出日期。

 "%t"之后用H表示输出时间的时(24进制),用I表示输出时间的时(12进制),用M表示输出时间 分,用S表示输出时间的秒,用L表示输出时间的秒中的毫秒数、用 p 表示输出时间的是上午还是 下午。"%t"之后用R表示以"%tH:%tM"的格式输出时间、用T表示以"%tH:%tM:%tS"的格式输出 时间、用r表示以"%tI:%tM:%tS %Tp"的格式输出时间。

 "%t"之后用A表示输出日期的全称,用a表示输出日期的星期简称。

下面给出具体的例子

public class Test {

  public static void main(String[] args) {

        System.out.printf("%d",159); //159

        System.out.println();

        System.out.printf("%x",159); //9f

        System.out.println();

        System.out.printf("%o",159); //237

        System.out.println();

        System.out.printf("%.1f",15.9); //15.9

        System.out.println();

        System.out.printf("%e",15.9); //1.590000e+01

        System.out.println();

        System.out.printf("%.2e",15.9); //1.59e+01

        System.out.println();

        System.out.printf("%g",15.9); //15.9000

        System.out.println();

        System.out.printf("%.3a",15.9); //0x1.fcdp3

        System.out.println();

        System.out.printf("%a",15.9); //0x1.fcccccccccccdp3

        System.out.println();

        System.out.printf("问候%s","Hello"); //问候Hello

        System.out.println();

       

        System.out.printf("字母a的大写是:%c %n", 'A'); //字母a的大写是:A

        System.out.printf("3>7的结果是:%b %n", 3>7); //3>7的结果是:false

     

        System.out.printf("%5.3f",8642.5678); //8642.568

        System.out.println();

        System.out.printf("%.3f",8642.5678); //8642.568

        System.out.println();

        System.out.printf("%8.4f",1.12); //  1.1200

        System.out.println();

        System.out.printf("%-8.4f",1.12); //1.1200 

    }

}

运行结果如下:

下面给出日期的例子

import java.util.Date;

/**关键技术点

 * 使用java.io.PrintStream的printf方法实现C风格的输出

   输出日期格式

 */

public class PrintfDate {

       public static void main(String[] args) {

             

              /*** 输出日期类型***/

              // %t表示格式化日期时间类型,%T是时间日期的大写形式,在%t之后用特定的字母表示不同的输出格式

              Date date = new Date();

              long dataL = date.getTime();

              // 格式化年月日

              // %t之后用y表示输出日期的年份(2位数的年,如99)

              // %t之后用m表示输出日期的月份,%t之后用d表示输出日期的日号

              System.out.printf("%1$ty-%1$tm-%1$td; %2$ty-%2$tm-%2$td%n", date, dataL);

              // %t之后用Y表示输出日期的年份(4位数的年),

              // %t之后用B表示输出日期的月份的完整名, %t之后用b表示输出日期的月份的简称

              System.out.printf("%1$tY-%1$tB-%1$td; %2$tY-%2$tb-%2$td%n", date, dataL);

            

              // 以下是常见的日期组合

              // %t之后用D表示以 "%tm/%td/%ty"格式化日期

              System.out.printf("%1$tD%n", date);

              //%t之后用F表示以"%tY-%tm-%td"格式化日期

              System.out.printf("%1$tF%n", date);

            

              /*** 输出时间类型***/

              // 输出时分秒

              // %t之后用H表示输出时间的时(24进制),%t之后用I表示输出时间的时(12进制),

              // %t之后用M表示输出时间的分,%t之后用S表示输出时间的秒

              System.out.printf("%1$tH:%1$tM:%1$tS; %2$tI:%2$tM:%2$tS%n", date, dataL);

              // %t之后用L表示输出时间的秒中的毫秒

              System.out.printf("%1$tH:%1$tM:%1$tS %1$tL%n", date);

              // %t之后p表示输出时间的上午或下午信息

              System.out.printf("%1$tH:%1$tM:%1$tS %1$tL %1$tp%n", date);

            

              // 以下是常见的时间组合

              // %t之后用R表示以"%tH:%tM"格式化时间

              System.out.printf("%1$tR%n", date);

              // %t之后用T表示以"%tH:%tM:%tS"格式化时间

              System.out.printf("%1$tT%n", date);

              // %t之后用r表示以"%tI:%tM:%tS %Tp"格式化时间

              System.out.printf("%1$tr%n", date);

            

              /*** 输出星期***/

              // %t之后用A表示得到星期几的全称

              System.out.printf("%1$tF %1$tA%n", date);

              // %t之后用a表示得到星期几的简称

              System.out.printf("%1$tF %1$ta%n", date);

            

              // 输出时间日期的完整信息

              System.out.printf("%1$tc%n", date);

       }

}

运行结果如下:

转义字符

Java定义了一种特殊的标记来表示特殊字符,这种标记称为转义序列或转义字符,转义序列由反斜杠(\)后面加上一个字符或者一些数字位组成。

转义字符(ASCII码值【十进制】)

意义

\b008

退格(BS),将当前位置移到前一列

\f012

换页(FF),将当前位置一道下页开头

\n010

换行(LF),将当前位置移到下一行开头

\r013

回车(CR),将当前位置移到本行开头

\t009

水平制表(HT)(跳到次啊一个TAB位置)

\\092

代表一个反斜字符\

\’039

代表一个单引号(撤号字符)

\"034

代表一个双引号字符

\?063

代表一个问号

\0000

空字符(NULL

\ddd(三位八进制数字)

13位八进制数所代表的任意字符

\xhh(二个十六进制数字)

十六进制所代表的任意字符

\uhhhh(四个十六进制数字)

如:\u0000NULL \u0022 是双引号;\u0020 是半角(英文)空格;\u3000是全角(中文)空格

当我们需要在字符串中使用普通的反斜杠时,就需要使用双反斜杠\\来表示。

System.out.println("他说:"你好!" "); //这条语句有语法错误!编译器会认为第二个引号字符就是这个字符串的结束标志,而不知道如何处理剩余的字符。应改为下句

System.out.println("他说:\" 你好!\" "); //使用转义字符

数据类型转换

注:boolean类型不能转换为其他的数据类型

默认转换:(从小到大的转换)

byte,short,char—int—long—float—double

byte,short,char相互之间补转换,他们参与运算首先转换为int类型

运算中,不同类型的数据先转化为同一类型,然后进行运算,转换规则如下:

操作数1类型

操作数2类型

转换后的类型

byte、short、char

int

int

byte、short、char、int

long

long

byte、short、char、int、long

float

float

byte、short、char、int、long、float

double

double

强制转换:

目标类型 变量名=(目标类型)(被转换的数据);

例子、

public class Demo {

    public static void main(String[] args){

        int x;

        double y;

        x = (int)34.56 + (int)11.2;  // 丢失精度

        y = (double)x + (double)10 + 1;  // 提高精度

        System.out.println("x=" + x);

        System.out.println("y=" + y);

    }

}

运行结果:

x=45

y=56.0

分析:由于在 34.56 前有一个 int 的强制类型转化,所以 34.56 就变成了 34。同样 11.2 就变成了 11 了,所以 x 的结果就是 45。在 x 前有一个 double 类型的强制转换,所以 x 的值变为 45.0,而 10 的前面也被强制成 double 类型,所以也变成 10.0,所以最后 y 的值变为 56。

总结:那么,我们到底用那种转换呢?

一般建议,最好不要随意使用强制类型转换,容易造成数据精度的损失。

(1)容量大的数据类型转换为容量小的数据类型时,要加上强制转换符,但可能造成精度降低或溢出;使用时要格外注意。

(2)有多种类型的数据混合运算时,系统首先自动的将所有数据转换成容量最大的那一种数据类型,然后再进行计算。

变量的作用域和生存期

变量指在程序执行的过程中,在某个范围内其值可以发生改变的量。

变量定义格式:

数据类型 变量名 = 初始化值;

变量的作用域即变量的作用范围:

    作用域从变量定义的位置开始,到该变量所在的那对大括号结束。

生命周期:

    变量从定义的位置开始就在内存中活了;

    变量到达它所在的作用域的时候就在内存中消失了。

在Java中,多行语句用{ }括起来——语句块。很多控制语句,例如条件判断和循环,都以{ }作为它们自身的范围,例如:

if (...) { // if开始

    ...

    while (...) { while 开始

        ...

        if (...) { // if开始

            ...

        } // if结束

        ...

    } // while结束

    ...

} // if结束

只要正确地嵌套这些{ },编译器就能识别出语句块的开始和结束。而在语句块中定义的变量,它有一个作用域,就是从定义处开始,到语句块结束。超出了作用域引用这些变量,编译器会报错。举个例子:

{

    ...

    int i = 0; // 变量i从这里开始定义

    ...

    {

        ...

        int x = 1; // 变量x从这里开始定义

        ...

        {

            ...

            String s = "hello"; // 变量s从这里开始定义

            ...

        } // 变量s作用域到此结束

        ...

        // 注意,这是一个新的变量s,它和上面的变量同名,

        // 但是因为作用域不同,它们是两个不同的变量:

        String s = "hi";

        ...

    } // 变量x和s作用域到此结束

    ...

} // 变量i作用域到此结束

定义变量时,要遵循作用域最小化原则,尽量将变量定义在尽可能小的作用域,并且,尽量不要重复使用变量名。

关于变量的作用域和生存期以后还会结合实际情况介绍。

Java包装类、拆箱和装箱详解

Java 语言八种基本数据类型并不支持面向对象编程,基本类型的数据不具备“对象”的特性——不携带属性、没有方法可调用。

Java为每种基本数据类型分别设计了对应的类,称之为包装类(Wrapper Classes),也有教材称为外覆类或数据类型类。

基本数据类型及对应的包装类

基本数据类型

对应的包装类

byte

Byte

short

Short

int

Integer

long

Long

char

Character

float

Float

double

Double

boolean

Boolean

每个包装类的对象可以封装一个相应的基本类型的数据,并提供了其它一些有用的方法。包装类对象一经创建,其内容(所封装的基本类型数据值)不可改变。

基本类型和对应的包装类可以相互装换:

由基本类型向对应的包装类转换称为装箱,例如把 int 包装成 Integer 类的对象;

包装类向对应的基本类型转换称为拆箱,例如把 Integer 类的对象重新简化为 int。

八个包装类的使用比较相似,下面是常见的应用场景。

实现 int 和 Integer 的相互转换

可以通过 Integer 类的构造方法将 int 装箱,通过 Integer 类的 intValue 方法将 Integer 拆箱。例如:

public class Demo2A {

    public static void main(String[] args) {

        int m = 500;

        Integer obj = new Integer(m);  // 手动装箱

        int n = obj.intValue();  // 手动拆箱

        System.out.println("n = " + n);

      

        Integer obj1 = new Integer(500);

        System.out.println("obj 等价于 obj1?" + obj.equals(obj1));

    }

}

运行结果:

n = 500

obj 等价于 obj1?true

使用bluej(其使用参见“Java简介与实验基础” Java简介与实验基础-CSDN博客)编译运行之参见下图:

Integer 类有一个静态的 paseInt() 方法,可以将字符串转换为整数;Integer 类有一个静态的 toString() 方法,可以将整数转换为字符串。例如:

public class Demo2B {

    public static void main(String[] args) {

        String str  = "123";

        int n = Integer.parseInt(str, 10);

        System.out.println("数字字符串转换为整数:" + n); //将数字字符串转换为整数

        int m = 500;

        String s = Integer.toString(m);  //将整数转换为字符串

        System.out.println("s = " + s);

    }

}

运行输出结果:

数字字符串转换为整数:123

s = 500

自动拆箱和装箱

上面的例子都需要手动实例化一个包装类,称为手动拆箱装箱。Java 1.5(5.0) 之前必须手动拆箱装箱。

Java 1.5 之后可以自动拆箱装箱,也就是在进行基本数据类型和对应的包装类转换时,系统将自动进行,这将大大方便程序员的代码书写。例如:

public class Demo2C {

    public static void main(String[] args) {

        int m = 500;

        Integer obj = m;  // 自动装箱

        int n = obj;  // 自动拆箱

        System.out.println("n = " + n);

     

        Integer obj1 = 500;

        System.out.println("obj 等价于 obj1?" + obj.equals(obj1));

    }

}

运行输出结果:

n = 500

obj 等价于 obj1?true

引用数据类型 / 引用类型

Java中的引用类型包括类(class)、接口(interface)、数组(array)等。当我们声明一个引用类型的变量时,实际上是在栈内存中分配了一个引用变量,该变量指向堆内存中的对象。

Java引用类型(Reference types)与基本类型(Primitive types)的比较:

引用类型

基本类型

引用类型的数量是无限的,因为它们可以由用户自定义。除了用户自定义的引用类型,还有一些常见的引用类型,如类、接口和数组。

基本类型包括:char、byte、short、int、long、float和double。

内存位置存储对数据的引用——对于引用类型的数据,内存位置存储的是对实际数据的引用。引用类型的数据本身并不直接存储在内存位置上,而是存储在另外的内存位置上,然后通过引用来指向这个实际数据的位置。

内存位置存储基本类型所持有的实际数据——对于基本类型的数据,内存位置直接存储的是实际的数据值。

当将一个引用类型赋值给另一个引用类型时,两者都将指向同一个对象。

当将一个基本类型的值赋给相同类型的另一个变量时,会进行值的复制——即值的拷贝。

当一个引用类型数据(如对象、数组)传递给一个方法时,方法可以改变引用类型数据的内容,但不能直接改变引用类型数据的地址。

当一个基本类型被传递给一个方法时,只会传递一个基本类型的副本。被调用的方法无法访问原始的基本类型值,因此无法改变它。被调用的方法可以改变复制的值。

关于引用数据类型比较复杂,在此仅概要提及,将在以后涉及到的地方介绍。

附录

Java数据的基本(原始)类型和引用类型的特点差别 https://blog.csdn.net/cnds123/article/details/134307458

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学习&实践爱好者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值