数据类型
数据类型是指导程序在运行阶段应该分配多大的内存空间,Java中的数据的数据类型分为基本数据类型以及引用数据类型,基本类型变量内储存的是变量的值,引用型变量储存着对象实例的地址(默认初始值为null)
引用变量与基本类型变量一样储存在栈的内存结构中,对象实例储存在称为堆的内存结构中
Java的引用中存储的地址在堆中是自动分配的,不一定是连续的空间,不可以通过加一减一在内存中移动
基本数据类型
简单数据类型主要包含:
- 数值类型(整数类型、浮点类型)
- 字符类型
- 布尔类型
| 关键字 | 大小/b | 默认值 |
|---|---|---|
| Boolean | 8 | false |
| byte | 8 | 0 |
| char | 16 | \u0000 |
| short | 16 | 0 |
| int | 32 | 0 |
| long | 64 | 0 |
| float | 32 | 0.0F |
| double | 64 | 0.0D |
不同的数据类型,其在底层所分配的空间大小不同,在Java中基本类型数据的内存大小是固定的
布尔类型
boolean,逻辑型
注意:
- 取值只有true、false,并不像c语言中那样可以代表1和0,逻辑运算符返回布尔值
- 布尔值只能与逻辑关系运算:&& (与) 、||(或) 、== (相等) 、!= (不等)、!(非)
- 布尔值只有
true和false两值,并不对应于任何整数数值
字符类型
char,存储字符,Java使用2字节(16位)的unicode字符集,字符的范围是0到65536,没有负字符,故Java字符是一个16位的无符号整数。
Unicode可以表示在所有人类语言中找到的所有字符。
字符常数:两个单引号范围内所表示的字符,包括英文字母、数字、特殊字符
Java中的字符表示在一对单引号内,可以直接赋值给int类型(Unicode字符集索引)
规则:
- 直接进行算术运算(+、*等),结果为int类型
- 和整数比较大小
- 给ch类型赋值予整数
- 存储中文字符
注意:
- 如果是char类型或显示转换为char类型则直接输出字符,如果是显示转换为或赋值为int类型,则显示为整数
- 字符类型可以用字符常量、整数所表示的编码赋值
- int类型与char类型相加时,先把char类型转换成整数相加得到结果,然后把结果对应Unicode编码转换成字符
- 对于
char类型,最高位不是符号位,其范围为 -2n ~ 2n-1,n为位(1字节占8位) - 要观察一个字符在
Unicode表中的位置时,可以用int类型显式转换,如(int)'a'或int p='a'
整数类型
类型有:byte、short、int、long (所占位数为 8、16、32、64)
注意:
- 整型多为十进制,也可用”O“开头表八进制,用”OX“或”Ox“开头表十六进制
- 均为有符号数
- 默认为int类型,若为长整型则需要在数后面加l或L
- 强制类型转换则在其前加(类型)
- short类型的储存顺序为先高字节后低字节,因机器而异
byte类型和short类型不存在常量表示方法long类型常量用后缀L表示,float类型常量用后缀f或F表示,double类型常量用后缀d或D表示(double类型常量可以省略后缀)- 所有的byte、short、char类型的值将被提升为
int型
浮点类型
类型有:float、double (所占位数为 32、64)
注意:
- 十进制表示由数字和小数点组成,而且必须要有小数点
- 科学计数法由小数、e(或E)和指数组成,指数必须为整数,而且e(或E)前必须有数字
- 数字后加f(或F)为float,加d(或D)为double,默认为double类型
- 浮点型也称为实型,浮点型常量也称为实数
- float类型变量,在储存float型数据时保留8位有效数字
- double类型变量,在储存double型数据时保留16位有效数字
- 比较
float类型数据和double类型数据时,必须注意数据的实际精度
引用数据类型
指任何对象类型,当定义了一个类,引用类型变量可以用这类名加引用变量名的方式来声明
引用类型包含:
- 字符串
- 对象
字符串类型
在Java中,字符串类型数据是按照对象来处理的,字符串类型的值实际上是以字符串常量的方式存储在虚拟机上,如果虚拟机中有该字符串常量则直接将该字符串常量的地址赋值给新创建的变量;如果不存在该字符串的值,则将该值放进常量池中,然后将新的地址返回给新创建的变量。
在函数中给传入的字符串进行直接赋值时,实际上相当于新创建一个字符串然后将新的地址值覆给原变量。
- 【str = “world”;】相当于是【str = new String(“world”);】
- 【str =str+ “ji”;】相当于是【str = new String(“worldji”);】
字符串对象比较特殊,有两种方法创建字符串
1、通过构造函数显式地产生对象:
String r1=new string("a");
2、像用字符型基本数据类型变量声明一样以隐含的方式创建字符串:
String r3="a";
特殊
String r1=new string("a");
String r3="a";
r2=r1;
String r4="a";
分析:
- r1与r3,它们是不同的对象,地址不同,在内存中占用不同的空间
- r1与r2,相同,他们存储着同一个地址,可以通过着两个引用变量名操作同一个字符串
- r3与r4,相同,Java为了加快程序的执行速度,把隐式创建的字符串对象放在栈中一个特殊的区域–字符串池中,相同内容的字符串对象只保留一份,用隐含的方式产生字符串对象时先从字符串池中寻找是否已经存在,若已经存在就去出来直接使用
数据类型转换
基本数据类型
在运算中,当遇到不同类型的数据型时应该先将不同的数据转换为同一种类型,然后再进行运算
y=x,编译器不检查变量x的值,只检查x的类型
进行类型转换时要注意使目标能够容纳原类型的所有信息,当把级别低的值赋给级别高的变量时,系统进行自动类型转换,但把级别高的值赋给级别低的变量时必须进行显式类型转换
低–>高:byte short char int long float double
注意:
- 不能对Boolean类型进行类型转换
- 不能把对象类型转换成不相关类型的对象、
- 在把容量大的类型转换为容量小的类型时必须使用强制类型转换((类型)量),称之为窄化处理,反之,则不需要强制类型转换,称为宽化处理
- 转换过程中可能导致溢出或损失精度
- 浮点数到整数的转换是通过舍弃小数得到的,而不是四舍五入
对象的上转型对象
形式:
A为B的父类,有以下形式,则称对象a是对象b的上转型对象
A a=new B();
对象的上转型对象的实体是子类负责创建的,但上转型对象会失去子类的一些属性,只有继承的变量、隐藏的变量、继承或重写的方法(子类中重新写的与父类同名的变量不能调用)
- 上转型对象不能调用子类新增加的成员变量和方法
- 上转型对象调用继承的方法和变量相当于子类对象
- 如果子类重写了继承的方法,那么上转型对象调用的一定是重写的那个方法
- 不要将父类创建的对象和上转型对象混淆
- 可以将对象的上转型对象强制转换为子类对象,那么这个子类对象就有具有了子类的所有属性和功能
- 不可以将父类产生的引用赋值给子类创造的对象
- 如果子类重写了父类的静态方法,那么子类对象的上转型 对象不能调用子类重写的那个静态方法,只能调用父类的那个静态方法
原因:即便是在子类对象中定义一个于父类一模一样的静态方法,但是这个静态方法属于子类本身,在内存中会分配两块控件去存放这两个静态变量,因此静态方法不存在重写。
值传递与引用传递
在Java中,基本数据类型传递都是值传递,由于是将原有数据的副本传递给函数,所以在函数中对值进行操作不影响原来的值。而对象和字符串的传递是引用传递,直接将原有的数据的地址传递给函数的参数,所以在函数中对变量进行操作时会影响原来的值。
| 值传递 | 引用传递 | |
|---|---|---|
| 根本区别 | 会创建副本(Copy) | 不创建副本 |
| 结果 | 函数中无法改变原始对象 | 函数中可以改变原始对象 |

被折叠的 条评论
为什么被折叠?



