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"。
转义字符 描述 转义字符 描述 \ddd 1~3位八进制数所表示的字符 \r 回车 \uxxxx 1~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种类型的长度与取值范围。
类型 | 长度 | 取值范围 |
byte | 8位 | -2^7~2^7-1,即-128~127 |
short | 16位 | -2^15~2^15-1,即-32768~32767 |
int | 32位 | -2^31~2^31-1,即-2147483648~2147483647 |
long | 64位 | -2^63~2^63-1,即-9223372036854775808~9223372036854775807 |
char | 16位 | '\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代替。
小结:
类型 |
长度 | 取值范围 |
float | 32位 | 1.4e-45~3.4028235e+38 |
double | 64位 | 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/0System.out.println("Float.NaN = " + Float.NaN);System.out.println();//输出double型0/0System.out.println("Double.NaN = " + Double.NaN);System.out.println();}
}
运行结果:
Byte.MAX_VALUE = 127
Byte.MIN_VALUE = -128Short.MAX_VALUE = 32767
Short.MIN_VALUE = -32768Integer.MAX_VALUE = 2147483647
Integer.MIN_VALUE = -2147483648
Integer.MAX_VALUE + 1 = -2147483648
Integer.MIN_VALUE - 1 = 2147483647Long.MAX_VALUE = 9223372036854775807
Long.MIN_VALUE = -9223372036854775808Float.MAX_VALUE = 3.4028235E38
Float.MIN_VALUE = 1.4E-45Double.MAX_VALUE = 1.7976931348623157E308
Double.MIN_VALUE = 4.9E-324Float.POSITIVE_INFINITY = Infinity
Float.NEGATIVE_INFINITY = -InfinityDouble.POSITIVE_INFINITY = Infinity
Double.NEGATIVE_INFINITY = -InfinityFloat.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)
7-基本数据类型和复合数据类型(引用数据类型)相关推荐
- 基本数据类型和引用数据类型作为参数时候的问题
1.看看怎么打印? OC: Java: 答案:10,hello, 25; hello, 你好世界 总结:基本数据类型在栈区,引用数据类型对象在堆区 基本数据类型作为参数传递的时候,不会改变其值. 引用 ...
- 【C++ 语言】引用数据类型 ( 引用数据类型定义 | 引用数据类型使用 | 引用类型参数 )
文章目录 引用类型 引用类型 引用数据类型 : 1. 引用数据类型定义 : 类型名称& 变量名 = 对应类型变量名称 ; //① 定义 普通 类型 变量int a = 8;//② 定义 引用类 ...
- 引用数据类型的方法调用
引用数据类型的方法调用 /*** 引用数据类型的方法调用*/ public class TestRefArgs{public static void main(String[] args) {Poin ...
- java引用数据类型可以更改类型_java,基本数据类型和引用数据类型
java中的数据类型分为基本数据类型和引用数据类型 基本数据类型 整型:byte,short,int,long 浮点型:float,double 字符型:char 布尔型:boolean 引用数据类型 ...
- java 引用数据类型Scanner类 Random类
Scanner类是属于引用数据类型 与定义基本数据类型变量不同,引用数据类型的变量定义及赋值有一个相对固定的步骤或格式. 基本数据类型定义:数据类型 变量名 = 值; 引用 ...
- java中引用数据类型有哪几种
本文主要介绍了java中引用数据的类型,具有很好的参考价值.希望对你有帮助.如有错误或不足之处,请不吝赐教. 目录 Java中的引用数据类型有哪些?先说Java中的引用数据类型:1.类别引用2.接口参 ...
- JAVA八种基本数据类型+三种引用数据类型
一.Java八种基本数据类型 在程序设计中经常用到一系列类型,把它们存储在堆栈中,加快程序的运行效率,它们就是基本数据类型.Java提供了8中基本数据类型,分别是:boolean.char.byte. ...
- Java数据类型(八种基本数据类型 + 四种引用数据类型)
1.位(bit): 又名 比特位,表示二进制位,是计算中内部数据储存的最小单位.一个二进制位只能表示0和1两种状态. 2.字节(byte): 是计算机中处理数据的基本单位.一个字节等于八位(1Byte ...
- ArrayList基本使用和引用数据类型
ArrayList 1.ArrayList是一个数组列表,提供了相关的添加.删除.修改.遍历等功能. ArrayList 类提供了很多有用的方法 2.初始化 ArrayList<E> ob ...
- JavaScript基本数据类型与引用数据类型
一.数据类型 基本数据类型:String.Number.Boolean.undefined.null.Symbol(ES6) 引用数据类型:Object.Array.Function.Date 基本数 ...
最新文章
- (转)android UI进阶之用ViewPager实现欢迎引导页面
- 批量模糊查询_模糊匹配,Power Query的这个功能太实用了,可惜Excel还没有
- 树状数组,Fenwick Tree
- c语言整数四则运算表达式的输出格式控制,Educoder CC++基本输入输出
- codeforces gym-101745 C-Infinite Graph Game 分块
- Storm与Spark区别
- Web Developer's Handbook
- [改善Java代码]避免对象的浅拷贝
- Spring boot 2.1版本、2.3及以上版本使用actuator实现优雅关闭程序
- 简述deque容器的插入删除原理
- 机器码(machine code)和字节码(byte code)是什么?
- SSM框架运行原理以及流程
- 数据清洗的主要类型及步骤
- NISP和CISP考试通过率怎样?
- 使用手持式频谱分析仪进行TDD信号分析
- keil4和keil5如何兼容使用
- opencv实现图像平移
- Arch 安装 deb
- nodeJS实现简单网页爬虫功能
- ACM集训队论文合集
热门文章
- tomcat出现“localhost拒绝了我们的请求”问题
- 腾讯派息式减持京东,“伯克希尔”的投资策略变的逻辑是?
- STM32 CubeIDE(九)串口通讯
- Ajax --- 客户端与服务器端之间传递数据
- 解决方法数超65536(java.lang.IllegalArgumentException: method ID not in [0, 0xffff]: 65536)
- 一切免费的大学视频教程,免费空间和网盘
- 【转载】SLB技术原理浅析
- im4java 水印_app后端设计(13)--IM4JAVA+GraphicsMagick实现中文水印
- 计算机应用论文评语大全,硕士学位论文评语大全
- 【Qt】通过QtCreator源码学习Qt(十二):Q_D和Q_Q指针(简称“d指针”)详解