变量的值存储在内存中,内存管理系统通过变量的类型分配存储空间,且该空间只能存储该类型数据,通过定义不同的变量,在内存中储存不同类型的数据。
JAVA的两大数据类型
1. 内置数据类型
2.引用数据类型
1. 内置数据类型
JAVA的基本数据类型分为八种:六种数字类型(四个整数类型,两个浮点类型)、一种字符型、一种布尔型
数字类型:
整数类型:①byte ②short ③int ④long
有符号的二进制补码表示;
从小到大的表示位数n依次为8位,16位,32位,64位,表示范围为(-2^(n-1))~(2^(n-1)-1);
默认值为0,long型默认值为0L。
浮点类型:①float ②double
float为单精度,32位浮点数,默认值为0.0f;
double为双精度,64位浮点数,默认值为0.0d;
浮点数不能用来表示精确的值,如货币。可用来表示测量的值,因为测量值不精确。
布尔类型:boolean
布尔类型表示一位的信息,只能取true和false,默认值为false。
字符类型:char
char是单一的16位Unicode字符;
最小值为0(\u0000),最大值为65535(\uffff);
可以储存任何类型的字符。
通过
java.lang.Byte;
java.lang.Short;
java.lang.Integer;
java.lang.Long;
java.lang.Float;
java.lang.Double;
java.lang.Character
包中的MIN_VALUE、MAX_VALUE与SIZE属性可以分别获得各个数据类型的最小值、最大值与二进制位数。(例:Integer.MIN_VALUE)
值得一提的是,double与float的最大最小值表示形式为科学记数法,Character的最大最小值需要强制转换成int才能显示更清楚。
实际上,JAVA中还存在另外一种基本类型void,它也有对应的包装类 java.lang.Void,不过我们无法直接对它们进行操作。
2.引用类型
Java中,引用类型的变量类似于C/C++的指针。
引用类型指向一个对象,指向对象的变量是引用变量。这些变量在声明时被指定为一个特定的类型。
变量一旦声明后,类型就不能被改变了。
对象、数组都是引用数据类型。
所有引用类型的默认值都是null。
一个引用变量可以用来引用任何与之兼容的类型。
Site site = new Site("Runoob")
JAVA常量
常量在程序运行时不能被修改;
用final修饰;
一般命名时全部用大写;
final double PI = 3.1415927;
byte、int、long、和short都可以用十进制、16进制以及8进制的方式来表示。
前缀 0 表示 8 进制,而前缀 0x 代表 16 进制,0b表示二进制。
JAVA的类型转换:(自动类型转换、强制类型转换)
自动类型转换:
整型,常量,字符可以混合运算,先转换成同一类型再运算,转换的规则为:
byte,short,char—> int —> long—> float —> double
思想是位数少的转换成位数多的,整数转换成浮点。
boolean不能进行类型转换,
对象类型不能转换成不相关的类的对象。
强制类型转换:
例:
1 int i =128;
byte b = (byte)i;
注意以下几点:
转换的数据类型必须是兼容的;
浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入;
转换过程中可能导致溢出或损失精度;
隐含强制类型转换
1. 整数的默认类型是 int。
2. 浮点型默认为double,在定义 float 类型时必须在数字后面跟上 F 或者 f。
常见问题:
1.引用类型具有引用空间与数据空间
1 MyDate today; //将变量分配一个保存引用的空间
today = new MyDate(); // 这句话是2步,首先执行new MyDate(),给today变量开辟数据空间,然后再执行赋值操作
所以声明引用类型时,必须先给变量开辟数据空间才能赋值。
2.整数默认为int
1 short a = 1;
short b = 2;
c = a+b //此时c的类型为int,java中比int小的类型在运算时会自动转换成int
3.使用包装类来进行类型转换
1 float f1=100.00f;
Float F1=new Float(f1);
double d1=F1.doubleValue(); //F1.doubleValue()为Float类的返回double值型的方法
1.声明一个变量;2.生成对应的包装类;3.调用相应的方法进行类型转换:intValue()可以得到其对应的整型变量,而doubleValue()可以得到其对应的双精度实型变量……
4.其他类转换成字符串的方法:
1.调用类的串转换方法:X.toString();
2.X+"";(自动转换)
3.String.valueOf(X);
5.字符串向其它类型的转换:
1、先转换成相应的封装器实例,再调用对应的方法转换成其它类型:
例如,字符中"32.1"转换double型的值的格式为:new Float("32.1").doubleValue()。也可以用:Double.valueOf("32.1").doubleValue()
2、静态parseXXX方法:
1 String s = "1";
byte b = Byte.parseByte( s );
short t = Short.parseShort( s );
int i = Integer.parseInt( s );
long l = Long.parseLong( s );
Float f = Float.parseFloat( s );
Double d = Double.parseDouble( s );
3、Character的getNumericValue(char ch)方法
6.Date类与其它数据类型的相互转换
整型和Date类之间并不存在直接的对应关系,只是可以使用int型为分别表示年、月、日、时、分、秒,
Date类构造函数的三种形式:
Date(int year, int month, int date):以int型表示年、月、日
Date(int year, int month, int date, int hrs, int min):以int型表示年、月、日、时、分
Date(int year, int month, int date, int hrs, int min, int sec):以int型表示年、月、日、时、分、秒
在长整型和Date类之间的对应关系,Date(long date)。
获取Date类中的年、月、日、时、分、秒以及周你可以使用Date类的getYear()、getMonth()、getDate()、getHours()、getMinutes()、getSeconds()、getDay()方法,转换为int
Date类的getTime()方法可以得到我们前面所说的一个时间对应的长整型数,与包装类一样,Date类也有一个toString()方法可以将其转换为String类。
import java.text.SimpleDateFormat; java.util.Date date = new java.util.Date();
//如果希望得到YYYYMMDD的格式
SimpleDateFormat sy1=new SimpleDateFormat("yyyyMMdd");
String dateFormat=sy1.format(date);
//如果希望分开得到年,月,日
SimpleDateFormat sy=new SimpleDateFormat("yyyy");
SimpleDateFormat sm=new SimpleDateFormat("MM");
SimpleDateFormat sd=new SimpleDateFormat("dd");
String syear=sy.format(date);
String smon=sm.format(date);
String sday=sd.format(date);
7.字符串拼接
在 java 中,任何字符类型与字符串相加,结果都是拼接
1 String s = null;
s += "hello";
System.out.println(s); // 输出 nullhello1
其中,第三行代码等效于:
s = (new StringBuilder(String.valueOf(s))).append("hello").toString();
8.包装类Integer的自动封装
1 Integer a = 1;
int类型在赋值到Integer类时会自动封装并且调用valueOf()函数:
1 Integer a = Integer.valueOf(1); //自动调用
函数功能为:当 i >= -128 && i <= 127 时,Integer.valueOf(i) 会将 i 存储在内部类 IntegerCache的static final Integer cache[]里,这一字节的缓存内存地址是静态的
1 public static Integer valueOf(int i) {
assert IntegerCache.high >= 127;
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
若执行如下代码:
1 Integer a = 1;
Integer b = 1;
则a与b的引用指向同一个对象,即a == b。
当a,b的范围在[-128~127]时,java为了提高效率,IntegerCache类中有一个数组缓存了值从-128到127的Integer对象。当我们调用Integer.valueOf(int i)的时候,如果i的值是>=-128且<=127时,会直接从这个缓存中返回一个对象,否则就new一个Integer对象。
若仍有问题可查阅Java中Integer类的自动装箱和自动拆箱
感谢菜鸟教程: http://www.runoob.com/java/java-basic-datatypes.html