Java语言是静态类型的(statical typed),也就是说所有变量和表达式的类型再编译时就已经完全确定。由于是statical typed,导致Java语言也是强类型(Strong typed)的。强类型意味着每个变量都具有一种类型,每个表达式具有一种类型,并且每种类型都是严格定义的,类型限制了变量可以hold哪些值,表达式最终产生什么值。同时限制了这些值可以进行的操作类型以及操作的具体方式。所有的赋值操作,无论是显式的还是在方法调用中通过参数传递,都要进行类型兼容性检查。
Java的数据类型有两种:
Java数据类型通常(分类方法多种多样)从整体上可以分为两大类:基础类型(primitive types)和引用类型(reference types),基础类型的变量持有原始值,引用类型的变量通常表示的是对实际对象的引用,其值通常为对象的内存地址
关系整理一下如下图:
对象是动态创建的类实例或者动态创建的数组。而引用一般是指内存地址。所有的对象(包括数组)支持Object类中定义的方法。
基本类型具有明确的取值范围和数学行为。
基本数据类型和引用数据类型的区别主要在存储方式上:
基本数据类型在被创建时,在栈上给其划分一块内存,将数值直接存储在栈上; 引用数据类型在被床架时,首先要在栈上给其引用(句柄)分配一块内存,而对象的具体信息都存储在堆内存上,然后由栈上面的引用指向堆中对象的地址。
例如:我有一个类MyDate,其中有属性day,mouth,year等,有构造方法(带参数);
现在为其创建一个对象MyDate d1 = new MyDate(8,8,2008);
在内存中的具体创建过程是:
1)首先在栈内存中位其d1分配一块空间; 2)然后在堆内存中为MyDate对象分配一块空间,并为其三个属性设初值0,0,0; 3)根据类MyDate中对属性的定义,为该对象的三个属性进行赋值操作; 4)调用构造方法,为三个属性赋值为8,8,2008;(注意这个时候d1与MyDate对象之间还没有建立联系) 5)将MyDate对象在堆内存中的地址,赋值给栈中的d1;通过句柄d1可以找到堆中对象的具体信息。
1.基本数据类型(基础类型)
Java的八大基本数据类型为:
整型
byte 字节型1字节 8bit 最大存储数据量是255,存放的数据范围是-128~127之间 short 短整型2字节 16bit最大数据存储量是65536,数据范围是-32768~32767之间 int 整型4字节 32bit最大数据存储容量是2的32次方减1,数据范围是负的2的31次方到正的2的31次方减1 long 长整型8字节 64bit最大数据存储容量是2的64次方减1,数据范围为负的2的63次方到正的2的63次方减1
浮点型
float 单精度4字节 32bit数据范围在3.4e-45~1.4e38,直接赋值时必须在数字后加上f或F double 双精度8字节 64bit数据范围在4.9e-324~1.8e308,赋值时可以加d或D也可以不加
字符类型
char 字符型用单引号
布尔类型
boolean 布尔型true/false(只有真假两种结果)
数据值域的知识说明:
1.一个bit是计算机考研存储的最小的数据单位。即1位,只可能是0或1. 2.一个byte由八个bit组成,即八位,可以表示256个整数值,又由于byte在Java中有符号之分(即正负数),所以范围位-128~127. 3.一个char在Java中由两个byte组成,用来表示一个字符,即unicode编码,是无符号类型。 4.int和float在Java中由4个byte组成。 5.每个long或double型变量占用八个byte的存储空间。 6.1T=1024G,1G=1024M,1M=1024K,1K=1024B
心得:
1.程序中的整数默认都是int型,即在方法调用直接传入的一个具体的整数值,默认情况下是int型。
2.值域小的的类型可以自动转化为值域大的。值域大的不能直接转化为值域小的,但是可以通过强制转化实现。
eg:
byte a=10; int i=a; (程序正常运行,输出的i为10) eg:int a=10; byte i=(byte)a; (程序正常运行,输出的i为10)
若a的值超出了byte类型的上限或下限,可以输出值,但该值的数据会改变,改变规律如下:
假设a为int型,b为byte型(其他情况可以类比!~)
若a大于byte的上限值,则应减去其值域n次,直到最终的值落在-128~127之间,举个例子:int a=1000;
byte b=(byte)a;//1000-256-256-256-256=-24 (输出的b为-24)
3.浮点型转化为整型是不是四舍五入,而是直接截去小数部分。
double b=12.5; int i=(int)12.5; (输出值为12而不是13!)
4.浮点型数字的科学表示方法:
比如:1.2e+12f(表示1.2乘以10的12次幂) 1e-21f(表示1乘以10的-21次幂)
Java基本类型存储在栈中,因此它们的存取速度要快于存储在堆中的对应包装类的实例对象。从Java5.0(1.5)开始,JAVA虚拟机(Java Virtual Machine)可以完成基本类型和它们对应包装类之间的自动转换。因此我们在赋值、参数传递以及数学运算的时候像使用基本类型一样使用它们的包装类,但这并不意味着你可以通过基本类型调用它们的包装类才具有的方法。另外,所有基本类型(包括void)的包装类都使用了final修饰,因此我们无法继承它们扩展新的类,也无法重写它们的任何方法。
基本类型的优势:数据存储相对简单,运算效率比较高
包装类的优势:有的容易,比如集合的元素必须是对象类型,满足了java一切皆是对象的思想
2.对象数据类型(引用类型)
类、接口类型、数组类型、枚举类型、注解类型;
所有用class,interface,abstract
class定义的类;
String是Java定义的一个类。
String的数据存储方式和Java的基本数据类型是一致的。
String的定义方式
String str="abc"; String str=new String();
3 实际上,JAVA中还存在另外一种基本类型void,它也有对应的包装类 java.lang.Void,不过我们无法直接对它们进行操作