Java语言是强类型语言程序员
强类型包含两个含义:数组
1. 全部的变量必须先声明后使用缓存
2. 指定类型的变量只能接受类型与之匹配的值spa
『意味着』每一个变量和表达式都有一个在编译时就肯定的类型。类型限制了变量能被赋的值,限制了表达式能够产生的值,限制了这些值上能够进行的操做,并肯定了这些操做的含义。指针
引用数据类型就是对一个对象的引用,对象包括实例和数组两种;引用类型变量相似C++中的指针。code
空类型(null类型)就是null值的类型,没有名称,因此不能声明一个null类型的变量或者转到null类型;null(空引用)是null类型变量惟一的值,null(空引用)能够转换为任何引用类型。对象
字符串不是基本数据类型,字符串是一个类,也就是引用数据类型。blog
Java为8种基本类型都提供了对应的包装类:boolean-Boolean、byte-Byte、short-Short、int-Integer、long-Long、char-Character、float-Float、double-Double。8种包装类经过静态方法parseXxx(string str)用于将字符串转换成基本类型。索引
直接量:程序中经过源代码直接给出的值。接口
常量池:程序第一次使用某个字符串直接量时,Java会使用常量池(constant pool)来缓存字符串直接量,若是程序后面的部分须要用到该字符串直接量时,Java会直接使用常量池中的字符串直接量。
常量池指的是在编译期被肯定,并被保存在一边以的.class文件中的一些数据,包括类、方法、接口中的常量,也包括字符串直接量。
Java数据类型
基本类型 | boolean类型 | boolean | 8 | true/false | ||
整数类型 | byte | 8 | -128~127 | 若是直接将一个较小在byte或者short类型的表示范围内的整数值付给一个byte或者short变量,系统自动将整数值当成byte或者short类型来处理;若是一个超过int范围的巨大的整数值,Java不能自动将整数值当成long类型来处理,须要以L做为后缀。 | ||
short | 16 | -32768~32767 | Java中整数值的四种表示方式:0b/0B-二进制;0-八进制;0x/0X-十六进制。二进制表示最高位为符号位,补码表示;0bxxxxxxxL表示64位二进制数,第64位为符号位 | |||
int | 32 | -2147483648~2147483647 | 强制转换,低位截取; | |||
long | 64 | -1.84467E+19~1.84467E+19 | ||||
浮点类型 | float | 32 | 1符号+8指数+23尾数 | |||
double | 64 | 1符号+11指数+52尾数 | ||||
字符类型 | 16 | Unicode字符集 | 三种表示形式:直接经过单个字符表示,'A';经过转义字符表示,'\n';直接经过Unicode值来表示,'uXXXX',XXXX-十六进制证书 | |||
引用类型 | 类 | |||||
接口 | ||||||
数组类型 | ||||||
null类型 |
基本类型间的自动类型转换
数组
C++中的多为数组定义时,直接将数组线性化分配内存,数组的每一个维度上应该保持等长的;而Java中没有严格的多为数组的概念,采用“引用”类型的概念,多维数组的高维也是引用类型,因此最高维能够不是等长的;
例子:
int[][] X;
X的数组元素是int[]类型,X[0]元素只能是int类型;X不能扩展为更高维的数组;扩展只能经过其余方式;
数值中使用下划线分隔
Java7支持数值中使用下划线,无论是什么类型的数值,好比能够定义int binVal=0B1000_0000_0000_0011;double PI=3.14_15_92_65_36;
直接量、直接量的赋值
数组是一种引用类型的变量,定义一个数组只是定义了一个引用变量,并未只想任何有效的内存空间,因此尚未内存空间来存储元素,所以这个数组也不能使用,只能对数组初始化以后才能使用。『定义数组时不能指定数组的长度』
只要为数组元素分配了内存空间,数组元素就具备了初试值。
静态初始化:初始化时由程序员显示指定每个数组元素的初始值,有系统决定数组长度;arrayName=new type[]{element1,element2,element3,...,element4,...}
type[] arrayName={element1,element2,element3,...,element4,...}『定义与初始化合并』
动态初始化:初始化时程序员只指定数组长度,有系统为数组元素分配初始值;arrayName=new type[length]
type[] arrayName=new type[4];
动态初始化时,系统为这些数组元素分配初始值,指定初始值时,系统按照如下的规则分配初始值:
1. 类型byte、short、int、long,则数组元素的值为0;
2. 类型float、double,则数组元素值为0.0;
3. 类型char,则数组元素的值为'\u0000';
4. 类型boolean,则数组元素的值为false;
5. 引用类型,则数组元素的职位null;
『不要同时使用静态初始化和动态初始化』
foreach循环
遍历数组和集合,更加简洁。『好处』无须得到数组、集合的长度,无需根据索引访问数组元素和集合元素,自动遍历每个元素。
for(TYPE variableName : array | collection){}
『注意』使用foreach循环迭代输出数组元素、集合元素时,并不能改变数组元素的值,所以一般不要对循环变量进行复制,容易引发错误。
内存中的数组
数组是一种引用数据类型,数组引用变量只是一个引用,『数组元素和数组变量在内存中是分开存放的』
引用是访问真实对象的根本方式,只能经过数组的引用变量来访问数组中的元素;
理解栈内存和堆内存:
每个方法在执行时都会创建本身的内存栈,方法内定义的变量将逐个放到这块栈内存中,随着方法的执行结束,该方法的内存栈也会天然销毁,『所偶方法中定义的局部变量都是放在栈内存中的』;
程序建立一个对象是,这个对象警备保存在『运行时数据』区中,以便反复利用,『运行时数据区就是堆内存』;堆内存中的对象不会随着方法的结束而销毁,即使是方法结束后,这个对象还可能被另外一个引用变量所引用(参数传递常见),则这个对象依然不会被销毁。只有当一个对象没有任何引用变量引用它时,系统的『垃圾回收器』才会在合适的时候回收它。
为了让垃圾回收机制回收一个数组所占的内存空间,能够将该数组变量赋为null。
import语句应该出如今package语句以后,类定义以前;
import中的*号只能表明类,不能表明包或者子包、子包中的类,所以import A.*则A中的类会导入,而A的子包中的类不会导入;
import static导入指定类的静态成员变量、方法;