7-基本数据类型和复合数据类型(引用数据类型)

目录

1.基本数据类型

1.1.逻辑型——boolean

1.2.文字型——char和String

1.2.1.char

1.2.2.String

1.3.整数类型:byte,short,int和long

1.3.1.byte

1.3.2.short

1.3.3.int

1.3.4.long

1.4.浮点型:float和double

1.4.1.float

1.4.2.double

1.5.输出Java基本数据类型相关的一些常数

2.复合数据类型

类:class

接口:interface

数组:Array

枚举

3.基本类型与引用类型变量

4.两种类型变量的不同处理

5.引用型变量的赋值

总结:


Java,C,C++是强类型语言,定义一个变量一定要规定它的类型。

js是弱类型语言,在声明变量时不需要指定数据类型,直接使用var修饰符声明变量。变量没有类型,但是数据本身是有类型的。

Java中数据类型分为两大类:基本数据类型和复合数据类型。

1.基本数据类型

Java语言中定义了4类共8种基本数据类型。

  • 逻辑型:boolean。
  • 文本型:char。
  • 整型:byte,short,int和long。
  • 浮点型:double和float。

1.1.逻辑型——boolean

基本语法格式:

boolean 变量名 = 初始值; 

代码示例:

boolean value = true;

注:

1).boolean类型数据只有两种取值true(真)和false(假);

2).boolean类型有些JVM的实现占1个字节,有些占1个比特位,(无明确规定);

3).与其他高级语言不同,Java中的布尔值和数字之间不能来回转换,即false和true不对应于任何零或非零的整数值。

4).boolean型变量的默认初始值为false。

1.2.文字型——char和String

char是文字型的基本数据类型,而String是类不是基本类型,但很常用,所以在此一并介绍。

1.2.1.char

基本语法格式:

char 变量名 = '初始值';

代码示例:

char ch = 'A';
char ch = '和'; //使用一个字符表示一个汉字

注:

1).Java中使用 单引号 + 单个字母 的形式表示字符字面值。

2).计算机中的字符本质上是一个整数。在C语言中使用ASCII表示字符,而Java中使用Unicode表示字符。因此一个字符占用2个字节。表示的字符种类更多,包括中文。

3).字符型变量的默认初始值是'\u0000'。(空字符,代表一个空格)。

4).执行javac时可能会出现乱码报错:未结束的字符文字。此时在执行javac时加上-encoding UTF-8选项即可。

Unicode字符集可以支持各类文字的字符,通过将国际标准的Unicode字符集作为字符变量的取值范围,使Java能方便地处理各种语言(例如将汉字作为字符型变量的值)。

一些控制字符不能直接显示,可利用转义序列来表示这些字符。还有一种直接以八进制或十六进制代表字符值的表示方法,在反斜杠后跟3位八进制数字或在反斜杠后跟u,后面再跟4位十六进制数字都可以代表一个字符常量,如"\141"和"\u0061"都代表字符常量"a"。

转义字符描述转义字符描述
\ddd1~3位八进制数所表示的字符\r回车
\uxxxx1~4位十六进制数所表示的字符\n换行
\'单引号字符\f走纸换页
\"双引号字符\b退格

\\

反斜杠字符\t

水平制表(Tab键)

一般情况下,char类型的十六进制Unicode编码值可自动转换成等值的int类型值,并可与int类型数值进行运算。而int类型到char类型需要通过强制类型转换。

1.2.2.String

基本语法格式:

String 变量名 = "初始值";

代码示例:

String name = "zhangsan";

注:

1).Java使用 双引号 + 若干字符 的方式表示字符串字面值。

2).和上面类型不同,String不是基本类型而是引用类型。是一个类。

3).字符串在Java中是对象,在Java中有两个类可以表达字符串:String和StringBuffer。String对象表示的字符串是不能修改的。如果需要对字符串修改,应该使用StringBuffer类。

4).字符串中的字符也是Unicode。与C和C++不同,Java中的字符串不以'\0'为结束符。

5).字符串中的一些特定的不太方便直接表示的字符需要进行转义。

6).引用型变量的默认初始值都是null。

7).在Java中,任何数据类型只要和字符串”+”,都会将其转为字符串而后进行字符串的拼接操作。

public class Test {
    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        System.out.println("运算结果为:"+a+b);
    }
}

1.3.整数类型:byte,short,int和long

1.3.1.byte

基本语法格式:

byte 变量名 = 初始值;

代码示例:

byte value = 0;

注:Java中byte类型占1字节。

1.3.2.short

基本语法格式:

short 变量名 = 初始值;

代码示例:

short value = 0;

注:Java中short类型占2字节。这个表示范围较小,一般不推荐使用。

1.3.3.int

基本语法格式:

int 变量名 = 初始值;

代码示例:

int num = 10;

注:

1).初始化操作是可选的,但是建议创建变量时都显式初始化。

即定义了一个整型变量,可以在声明变量时,不赋值。

前提:必须是类中(当类内有方法时,为类内,方法外)的变量。

否则会报错。

public class Test{
    public static void main(String[] args){
        int a;
        System.out.println(a);
    }
}
        

这样在类中,方法中会报错:可能尚未初始化变量a。

public class Test{
    int a;
    public static void main(String[] args){
        System.out.println(new Test().a);
    }
}

这样就可以,不报错,会打印0。注意:这里不能直接打印a,一切皆对象,要new一个新对象。

当在类中(主方法外)定义int变量时,默认值为0。

2).在Java中,一个int变量占4个字节,和操作系统没有直接关系。(C语言中一个int变量所占字节数与操作系统,编译器有关)

字节是计算机中表示空间大小的基本单位。

计算机使用二进制表示数据。

8个二进制位(bit)为1个字节(Byte)。

1KB = 1024Byte

1MB = 1024KB

1GB = 1024MB

1.3.4.long

基本语法格式:

long 变量名 = 初始值;

代码示例:

long num = 10L; //也可写作10l(小写L)

注:Java中long类型占8字节。

小结:由于char类型的值可以转换为int型,故下面一起列出char和这4种类型的长度与取值范围。

类型长度取值范围
byte8位-2^7~2^7-1,即-128~127
short16位-2^15~2^15-1,即-32768~32767
int32位-2^31~2^31-1,即-2147483648~2147483647
long64位-2^63~2^63-1,即-9223372036854775808~9223372036854775807
char16位'\u0000'~'\uffff',即0~65535

注:

1).Java中所有的整数类型都是有符号的整数类型,Java没有无符号整数类型(最高位表示正负,0表示正数,1表示负数)。

2).所有整型变量的默认初始值为0。

3).由于不同的机器对于多字节数据的存储方式不同,可能是从低字节向高字节存储,也可能是从高字节向低字节存储,这样,在分析网络协议或文件格式时,为解决不同机器上的字节存储顺序问题,用byte类型来表示数据会比较合适。但通常,由于其表示的数据范围很小,容易造成溢出,因此尽量少使用。

4).如果一个数超出了计算机的表达范围,称为溢出。超出最大值,称为上溢;超过最小值,称为下溢。将一个整型类型数的最大值加1后,产生上溢而变成了同类型的最小值;最小值减1后,产生下溢而变成了同类型的最大值。

5).整型常量可以有4种形式:二进制(以0b或0B开头),八进制(以0开头),十进制十六进制(以0x或0X开头)。

1.4.浮点型:float和double

1.4.1.float

基本语法格式:

float 变量名 = 初始值;

代码示例:

float num = 1.0f; //也可写作1.0F

注:float类型在Java中占4个字节,遵循IEE754标准。由于表示的数据精度范围较小,一般优先考虑double,不太推荐使用float。

1.4.2.double

基本语法格式:

double 变量名 = 初始值;

代码示例:

double num = 1.0d;  //也可写成1.0D

注:

Java中的double虽然也是8个字节,但是浮点数的内存布局和整数差别很大,不能单独用2^n的形式表示数据范围。

Java的double类型的内存布局遵循IEE754标准,尝试使用有限的内存空间表示可能无限的小数,势必会存在一定的精度误差。

import java.math.BigDecimal;

public class Test {
public static void main(String[] args) {
   //精度不准
   System.out.println(1.1 * 1.1);
   //使用此类来表示小数
   BigDecimal b1 = BigDecimal.valueOf(1.1);
   BigDecimal b2 = BigDecimal.valueOf(1.1);
   System.out.println(b1.multiply(b2));
  }
}

 当使用double类型进行小数运算时,精度会出现不准,使用BigDecimal代替。

小结:

类型

长度取值范围
float32位1.4e-45~3.4028235e+38
double64位4.9e-324~1.7976931348623157e+308

1).双精度类型double比单精度类型float具有更高的精度和更大的表示范围,但float类型具有速度快,占用内存小的优点。

2).浮点型变量的默认初值是0.0。浮点数在运算过程中不会因为溢出而导致异常处理。如果出现下溢,结果为0.0;如果上溢,结果为正或负无穷大;如果出现数学上没有定义的值,如0.0/0.0,结果被视为非法数,NaN(Not-a-Number)。

3).浮点类型的常量默认是double类型,可用科学计数法表示(6.02*10^23可表达为6.02e23)。

1.5.输出Java基本数据类型相关的一些常数

public class SomeConstTest{
    public static void main(String args[]){
        
       //输出byte型的最大值与最小值
       System.out.println("Byte.MAX_VALUE = " + Byte.MAX_VALUE);
       System.out.println("Byte.MIN_VALUE = " + Byte.MIN_VALUE);
       System.out.println();

       //输出short型的最大值与最小值
       System.out.println("Short.MAX_VALUE = " + Short.MAX_VALUE);
       System.out.println("Short.MIN_VALUE = " + Short.MIN_VALUE);
       System.out.println();

       //输出int型的最大值与最小值
       System.out.println("Integer.MAX_VALUE = " + Integer.MAX_VALUE);
       System.out.println("Integer.MIN_VALUE = " + Integer.MIN_VALUE);
       //当整数最大值+1,发生溢出(当前的数据类型放不下当前数据)
       //当发生数据溢出时,需要更换更大的数据类型。
       System.out.println("Integer.MAX_VALUE + 1 = " + Integer.MAX_VALUE + 1);
       System.out.println("Integer.MIN_VALUE - 1 = " + Integer.MIN_VALUE - 1);
       System.out.println();

       //输出long型的最大值与最小值
       System.out.println("Long.MAX_VALUE = " + Long.MAX_VALUE);
       System.out.println("Long.MIN_VALUE = " + Long.MIN_VALUE);
       System.out.println();

       //输出float型的最大值与最小值
       System.out.println("Float.MAX_VALUE = " + Float.MAX_VALUE);
       System.out.println("Float.MIN_VALUE = " + Float.MIN_VALUE);
       System.out.println();

       //输出double型的最大值与最小值
       System.out.println("Double.MAX_VALUE = " + Double.MAX_VALUE);
       System.out.println("Double.MIN_VALUE = " + Double.MIN_VALUE);
       System.out.println();

       //输出float型的正无穷大与负无穷大
       System.out.println("Float.POSITIVE_INFINITY = " + Float.POSITIVE_INFINITY);
       System.out.println("Float.NEGATIVE_INFINITY = " + Float.NEGATIVE_INFINITY); 
       System.out.println();

       //输出double型的正无穷大与负无穷大
       System.out.println("Double.POSITIVE_INFINITY = " + Double.POSITIVE_INFINITY);
       System.out.println("Double.NEGATIVE_INFINITY = " + Double.NEGATIVE_INFINITY); 
       System.out.println();

       //输出float型0/0
       System.out.println("Float.NaN = " + Float.NaN);
       System.out.println();

       //输出double型0/0
       System.out.println("Double.NaN = " + Double.NaN);
       System.out.println();
    }
}

运行结果:

Byte.MAX_VALUE = 127
Byte.MIN_VALUE = -128

Short.MAX_VALUE = 32767
Short.MIN_VALUE = -32768

Integer.MAX_VALUE = 2147483647
Integer.MIN_VALUE = -2147483648
Integer.MAX_VALUE + 1 = -2147483648
Integer.MIN_VALUE - 1 = 2147483647

Long.MAX_VALUE = 9223372036854775807
Long.MIN_VALUE = -9223372036854775808

Float.MAX_VALUE = 3.4028235E38
Float.MIN_VALUE = 1.4E-45

Double.MAX_VALUE = 1.7976931348623157E308
Double.MIN_VALUE = 4.9E-324

Float.POSITIVE_INFINITY = Infinity
Float.NEGATIVE_INFINITY = -Infinity

Double.POSITIVE_INFINITY = Infinity
Double.NEGATIVE_INFINITY = -Infinity

Float.NaN = NaN
Double.NaN = NaN

2.复合数据类型

  • 类:class

  • 接口:interface

  • 数组:Array

  • 枚举


上面所说的4类8种基本数据类型,是Java的内置类型。在很多应用程序开发中,仅使用这几种类型是远不够的。

一般将用户定义的新类型称为复合数据类型。在Java中,接口是两种用户定义的复合数据类型。

例如:如果要处理日期,要独立声明3个整数,分别代表日,月,年。将这三个变量进行封装,用class关键字创建一个日期类。

class MyDate{
    int day;
    int month;
    int year;
}

使用语言内置类型定义变量时,因为每种类型都是预定义的,所以无须程序员指定变量的存储结构。

对于新的数据类型,需要指定该类型所需的存储空间以及如何解释这些空间中的内容。新类型不是通过字节数指定空间大小,也不是通过位的顺序和含义定义该存储空间的含义,而是通过包含在类定义中的已有数据类型来提供这些信息。

复合数据类型由程序员在源程序中定义。一旦有了定义,该类型就可以像其他类型一样使用。可以声明MyDate类的变量,并且日期的年,月,日三部分也都由该变量表示。例如:

MyDate a, b;

对于一个日期的年,月,日各组成部分的使用,都是通过MyDate类型的a,b变量进行,例如:

a.day = 30;
a.month = 12;
a.year = 1999;

在定义了MyDate类后,对于一个日期的定义只需要声明一个变量,并且日期中的3个组成部分被封装为一个有机的整体,它们之间的取值约束关系可以通过在MyDate类内部定义方法实现,操纵MyDate变量的程序员不需要关心这些问题。因此在Java中使用类或接口这样的复合数据类型,不仅反映了现实世界事物的本质形态,还使程序简练并且更可靠。


Java中数据类型分为两大类:基本数据类型与复合数据类型。相应地,变量也有两种类型:基本类型与引用类型。

3.基本类型与引用类型变量

基本数据类型的变量包含了单个值,这个值的长度和格式符合变量所属数据类型的要求,可以是一个数字,一个字符或一个布尔值。

引用类型变量的值是指向内存空间的引用(地址)。所指向的内存中保存着变量所表示的一个值或一组值。引用在其他语言中称为指针或内存地址。Java语言与其他程序设计语言不同,不支持显示使用内存地址,而必须通过变量名对某个内存地址进行访问。

4.两种类型变量的不同处理

在Java中基本类型变量声明时,系统直接给该变量分配空间,因此程序中可以直接操作。例如:

int a; //声明变量a的同时,系统给a分配了空间
a = 12;

引用类型变量声明时,只是给该变量分配引用空间,数据空间未分配。因此引用变量声明后不能直接引用,下列第二条语句是错误的。

MyDate today;
today.day = 14; //错误!因为today对象的数据空间未分配

引用型变量在声明后必须通过实例化开辟数据空间,才能对变量所指向的对象进行访问。

MyDate today;
today = new Date();

上面第一条语句的执行,将给today变量分配一个保存引用的空间。第二条语句分两个步骤执行:首先执行new Date(),给today变量开辟数据空间,然后再执行第二条语句中的赋值操作。

5.引用型变量的赋值

Java中引用型变量之间的赋值是引用赋值。

MyDate a, b; //在内存开辟两个引用空间
a = new MyDate(); //开辟MyDate对象的数据空间,并把该空间的首地址赋给a
b = a; //将a存储空间中的地址写到b的存储空间中

总结:

数据类型:

  • 基本数据类型

数值型:整型:byte,short,int,long(默认值为0)

              浮点型:float,double(默认值为0.0)

字符型:char(默认值为'\u0000')

布尔型:boolean(默认值为false)

  • 复合(引用)数据类型

数组,类,接口(默认值为null)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值