Java语言是强类型语言

强类型包含两个含义:

  1. 所有的变量必须先声明后使用

  2. 指定类型的变量只能接受类型与之匹配的值

  『意味着』每个变量和表达式都有一个在编译时就确定的类型。类型限制了变量能被赋的值,限制了表达式可以产生的值,限制了这些值上可以进行的操作,并确定了这些操作的含义。

  引用数据类型就是对一个对象的引用,对象包括实例和数组两种;引用类型变量类似C++中的指针。

  空类型(null类型)就是null值的类型,没有名称,所以不能声明一个null类型的变量或者转到null类型;null(空引用)是null类型变量唯一的值,null(空引用)可以转换为任何引用类型。

  字符串不是基本数据类型,字符串是一个类,也就是引用数据类型。

  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类型






基本类型间的自动类型转换 

java如何定义空类 java中什么表示空类型_java

数组

  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导入指定类的静态成员变量、方法;