05-Java数据类型、常量和变量

  • 一、数据类型
  • 基本数据类型
  • 整数类型
  • 浮点数类型
  • 字符类型
  • 布尔类型
  • 引用数据类型
  • 二、常量
  • 字符串常量(String)
  • 三、变量
  • 1.成员变量
  • (1)类变量
  • (2)对象变量
  • 2.局部变量(本地变量)
  • 3.成员变量和局部变量的比较
  • 4.异常处理参数
  • 四、基本数据类型的转换
  • 自动类型转换
  • 强制类型转换
  • 五、基本数据类型的对象包装类
  • 基本数据类型转字符串
  • 字符串转成基本数据类型
  • 利用基本数据类型包装类进行进制转换
  • 十进制转其他进制
  • 其他进制转十进制
  • 自动装箱

一、数据类型

Java是一门强类型的编程语言,他对变量(具体讲解请见下文)的数据类型有严格的限定。在定义变量时必须声明变量的类型,在为变量赋值时必须赋予和变量同一种类型的值,否则程序会报错。

在Java中变量的数据类型分为两种,即基本数据类型和引用数据类型。

Java数据类型如下图所示

java 常亮获取怎么判定_java


注意: Java语言没有无符号整数、指针、结构体(struct)、联合(union)等数据类型,这使得Java简单易学,但功能没有减弱。

基本数据类型

整数类型

整数类型表示用来存储的数据是整数数值,即没有小数部分的值。

在Java中,为了给不同大小范围内的数合理地分配存储空间(避免空间浪费),整数类型分为四种类型:字节型(byte)、短整型(short)、整型(int)和长整型(long)。
四种类型所占空间的大小以及存值范围如下图

类型名

占用空间

取值范围

byte

8位(1个字节)

-128~127(-2的7次方到2的7次方-1)

short

16位(2个字节)

-32768~32767(-2的15次方到2的15次方-1)

int

32位(4个字节)

-2147483648~2147483647(-2的31次方到2的31次方-1)

long

64位(8个字节)

-9223372036854774808~9223372036854774807(-2的63次方到2的63次方-1)

浮点数类型

浮点数类型表示用来存储的数据类型是小数类型数值。

在Java中浮点数类型分为两种:单精度浮点数(float)和双精度浮点数(double)。double型所表示的浮点数比float型更精确。
两种类型所占空间的大小以及存值范围如下图

类型名

占用空间

取值范围

float

32位(4个字节)

3.402823e+38~1.401298e-45(e+38 表示乘以10的38次方,而e-45 表示乘以10的负45次方)

double

64位(8个字节)

1.797693e+308~4.9000000e-324(e+308 表示乘以10的308次方,而e-324 表示乘以10的负324次方)

字符类型

浮点数类型表示用来存储一个单一字符。

在Java中用char表示,每个char类型字符会占据2个字节。在给char类型变量赋值时需要用英文角标下单引号(’)将字符引起来。也可以0~65535范围内的整数赋值给char类型变量,这样计算机会自动将这些字符转换成ASCII表中对应的字符。

布尔类型

布尔类型表示存储的为布尔型值。

在Java中,boolean类型表示,值只有两种类型,即真(true)和假(false)。

引用数据类型

引用数据类型建立在基本数据类型的基础上,包括数组、类和接口和枚举等。引用数据类型是由用户自定义,用来限制其他数据的类型。一般建立后存储在栈内存中。

所谓引用数据类型就是对一个对象的引用,对象包括实例和数组两种。实际上,引用类型变量就是一个指针,只是 Java 语言里不再使用指针这个说法。

引用类型还有一种特殊的 null 类型,表示空引用。

注意: 空引用(null)只能被转换成引用类型,不能转换成基本类型,因此不要把一个 null 值赋给基本数据类型的变量。

二、常量

常量就是程序中固定不变的数据,是不能改变的数据。在Java中常量有整型常量浮点数常量、布尔常量、字符常量等类型。一般我们用final关键字修饰一种变量,来表示常量,类似于C语言中的宏定义。
在此就只介绍字符串常量(String)。

字符串常量(String)

String常量是用一对英文半角下双引号("")括起来的一串连续的字符。一般常量都是存储在堆中的常量池中,池中的数据和数组一样通过索引访问。所以,String不属于8中基本数据类型,而是属于引用类型,需要通过索引引用来使用。

三、变量

在程序运行期间,随时可能产生一些临时数据,应用程序会将这些数据保存在一些内存单元中,每个内存单元都用一个标识符来标识,这些内存单元被称为变量,定义的标识符就是变量名,内存单元中存储的数据就是变量的值。

注意:
(1)变量的类型必须是8中基本数据类型和引用类型中的一种
(2)可用在成员变量前的修饰符有static、final、public、protected、private、transient等。
(3)如果用final关键字修饰则说明这是一个常量,只能赋一次值,在程序运行过程中不能改变的。

1.成员变量

成员变量指在类内部、方法外部定义的变量,其在整个类中都有效。会在创建对象的时候就初始化。

(1)类变量

由static修饰的成员变量属于类变量,被该类的所有方法、对象所共享。
注意: 在静态方法和非静态方法中可以直接通过“类名.变量名”的方式访问。

(2)对象变量

没有用static修饰的成员变量属于对象,在访问时需要先构造该类的一个对象,然后通过“对象名.变量名”的方式访问。

2.局部变量(本地变量)

在方法或语句块每次运行时,就会产生独立的空间,在这个空间中声明的变量,是方法或语句块此次运行所独有的,称为局部变量。参数也是局部变量。
局部变量的声明和初始化都是在方法中,方法结束后,变量就会自动销毁,局部变量的生存周期和作用域都是块。

局部变量的规则:
(1)本地变量是定义在块({ } )内的
它可以是定义在函数的块内,也可以定义在语句的块内,甚至可以随便拉一对大括号来定义,但是只在本次定义的块内有效。
(2)程序运行进入这个块之前,其中的变量不存在,离开这个块,其中的变量就消失了。
(3)块外面定义的变量在内部依然有效。
(4)块里面定义了和外面同名的变量,则会掩盖外面的变量。
(5)不能在一个块内定义同名的变量。
(6)局部变量不会被默认初始化。
(7)参数在进入方法的时候被初始化了。

3.成员变量和局部变量的比较

作用范围:

成员变量作用于整个类中
局部变量作用于函数或语句块中

内存中的位置:

成员变量在堆内存中,因为对象的内存空间在堆内存中,所以它也在堆内存中
局部变量在栈内存中

4.异常处理参数

异常处理参数指catch子句中定义的异常类型的变量,有效范围是catch子句。

四、基本数据类型的转换

在程序中,当把一种数据类型的值赋给另一种数据类型的变量时,需要进行数据类型转换。我们有两种转换方式:即自动类型转换和强制类型转换。

自动类型转换

自动类型转换也叫隐式类型转换,指的是两种数据类型在转换的过程中不需要显示地进行声明。

实现自动类型转换的条件:
(1)两种数据类型必须兼容。
(2)目标类型的取值范围必须大于源类型的取值范围。

强制类型转换

强制类型转换也叫显式类型转换,指的是两种数据类型之间的转换需要进行显式的声明。

使用情况:
当两种类型彼此不兼容,或者目标类型取值范围小于源类型时,自动类型转换无法进行,这时就需要进行强制类型转换。

注意:
当对变量进行强制类型转换时,会发生取值范围较大的数据类型向取值范围较小的数据类型的转换,这样做特别容易造成数据精度的丢失。

五、基本数据类型的对象包装类

为了兼容非面向对象语言,Java语言保留了基本数据类型(不携带属性,没有方法可调用)。但由于此种方法没有任何属性与方法,我们使用起来不是很方便,因此Java语言也为各种基本数据类型提供了相应的包装类,对象包装类以对象的方式提供了很多实用方法和常量,方便在基本数据类型和引用数据类型之间进行转换。

基本数据类型和基本数据类型对象包装类的关系如下表:

基本数据类型

基本数据类型对象包装类

byte

Byte

short

Short

int

Integer

long

Long

boolean

Boolean

float

Float

double

Double

char

Character

注意: 基本数据类型包装类的最常见作用是用于基本数据类型和字符串类型之间做转换。

基本数据类型转字符串

方法有两种:
(1)基本数据类型值+“”;
(2)基本数据类型对象.toString(基本数据类型值);
实例:

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int n = 40;
		String str = Integer.toString(40);
		System.out.printf("str:%s",str);
		
	}

}

以上代码编译执行后的结果为:

str:40

(3)String.valueOf(基本数据类型);
实例:

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int n = 40;
		String str = String.valueOf(n);
		System.out.printf("str:%s",str);
		
	}

}

以上代码编译执行后的结果为:

str:40

字符串转成基本数据类型

(1)基本数据类型包装类.parseXxx(String);===>此方法是静态的
注意: 此方法中传递的String字符串必须是数字格式的字符串。
实例:

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String s = "127";
		byte b = Byte.parseByte(s);			//String-->byte
		short t = Short.parseShort(s);		//String-->short
		int i = Integer.parseInt(s);		//String-->int
		long l = Long.parseLong(s);			//String-->long
		float f = Float.parseFloat(s);		//String-->float
		double d = Double.parseDouble(s);	//String-->double
		System.out.printf("byte:%d\n",b);
		System.out.printf("short:%d\n",t);
		System.out.printf("int:%d\n",i);
		System.out.printf("long:%d\n",l);
		System.out.printf("float:%f\n",f);
		System.out.printf("double:%f\n",d);
	}

}

以上代码编译执行后的结果为:

byte:127
 short:127
 int:127
 long:127
 float:127.000000
 double:127.000000

注意: 在包装类中character包装类和String是一样的,因此可以使用String的方法。

(2)基本数据类型包装类.intvalue();===>此方法是非静态的
实例:

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Byte b = new Byte("127");
		Short s = new Short("127");
		Integer i = new Integer("127");
		Long l = new Long("127");
		Float f = new Float("127");
		Double d = new Double("127");
		
		byte b1 = b.byteValue();
		short t1 = s.shortValue();
		int i1 = i.intValue();
		long l1 = l.longValue();
		float f1 = f.floatValue();
		double d1 = d.doubleValue();
		
		System.out.printf("byte:%d\n",b1);
		System.out.printf("short:%d\n",t1);
		System.out.printf("int:%d\n",i1);
		System.out.printf("long:%d\n",l1);
		System.out.printf("float:%f\n",f1);
		System.out.printf("double:%f\n",d1);
		
	}

}

以上代码编译执行后的结果为:

byte:127
 short:127
 int:127
 long:127
 float:127.000000
 double:127.000000

利用基本数据类型包装类进行进制转换

十进制转其他进制

这是利用了Integer类的方法进行转换的。

public static String toBinaryString(int i); //将指定的整数i转换为二进制数的字符串类型。
 public static String toOctalString(int i); //将指定的整数i转换为八进制数的字符串类型。
 public static String toHexString(int i); //将指定的整数i转换为十六进制数的字符串类型。

实例:

public class Test {

	public static void main(String[] args) {
		int i = 60;
        //十进制转成二进制
        String strb = Integer.toBinaryString(i);
        System.out.println("二进制:"+strb);
        
        //十进制转成八进制
        String stro = Integer.toOctalString(i);
        System.out.println("八进制:"+stro);

        //十进制转成十六进制
		String strh = Integer.toHexString(i);
        System.out.println("十六进制:"+strh);
		
	}

}

以上代码编译执行后的结果为:

二进制:111100
 八进制:74
 十六进制:3c

其他进制转十进制

有两种转换方法:
(1)利用Integer的parseInt()进行转换。

public static int parseInt(String s,int radix); //将指定的字符串s转换为整数,其中radix指字符串s的进制数。

实例:

public class Test {

	public static void main(String[] args) {
		int b = Integer.parseInt("1000000",2);
		int o = Integer.parseInt("100",8);
		int h = Integer.parseInt("40",16);
		
		System.out.println("二进制转十进制:"+b);	
		System.out.println("八进制转十进制:"+o);	
		System.out.println("十六进制转十进制:"+h);	
	}

}

以上代码编译执行后的结果为:

二进制转十进制:64
 八进制转十进制:64
 十六进制转十进制:64

(2)利用Integer的valueOf()和toString()方法进行转换。

Integer valueOf(String s, int radix): 返回一个 Integer 对象,该对象中保存了用第二个参数提供的基数进行解析时从指定的 String 中提取的值。
String toString(): 返回表示 Integer 值的 String 对象。

实例:

public class Test {

	public static void main(String[] args) {
		//二进制转十进制
        int b = Integer.valueOf("1000000",2);
        System.out.println("二进制转十进制:"+b);

        //八进制转成十进制
        int o = Integer.valueOf("100",8);
        System.out.println("八进制转十进制:"+o);

        //十六进制转成十进制
        int h = Integer.valueOf("40",16);
        System.out.println("十六进制转十进制:"+h);
        
        
        //二进制转十进制(转为了字符串类型)
        String strb = Integer.valueOf("1000000",2).toString();
        System.out.println("二进制转十进制字符串:"+strb);
        
        //八进制转成十进制(转为了字符串类型)
        String stro = Integer.valueOf("1000000",2).toString();
        System.out.println("八进制转十进制字符串:"+stro);
        
        //十六进制转成十进制(转为了字符串类型)
        String strh = Integer.valueOf("1000000",2).toString();
        System.out.println("十六进制转十进制字符串:"+strh);
	}

}

以上代码编译执行后的结果为:

二进制转十进制:64
 八进制转十进制:64
 十六进制转十进制:64
 二进制转十进制字符串:64
 八进制转十进制字符串:64
 十六进制转十进制字符串:64

自动装箱

我们可以把 Integer x = new Integer(4); 写成 Integer x = 4; 这就是自动装箱,此时可以对 x 运算。

如 x = x+2;
在这个过程中,计算机会自动拆箱,与2进行加法运算,然后将结果再进行封箱赋值给引用类型变量 x 。

注意: 如果我们使用Integer类定义变量时,当数值在byte范围内时,如果该数值已经存在,则不会开辟新的空间。

实例:

public class Test {

	public static void main(String[] args) {
		Integer m = 128;
		Integer n = 128;
		System.out.println("m==n "+(m==n));
		
		Integer x = 127;
		Integer y = 127;
		System.out.println("x==y "+(x==y));
	}

}

以上代码编译执行后的结果为:

m==n false
x==y true