静态语言(强类型语言)是在编译时即可确定数据类型的语言,多数静态类型需要要求使用变量之前必须声明数据类型。例如C/C++,java,C#,Delphi等,而动态语言(弱类型语言)是在运行时确定变量数据类型的语言的,使用之前不需要声明。如:PHP/Python/javaScript等。强类型语言虽然在速度上可能会略微逊色于弱类型语言,但强类型语言是类型安全的语言,更加严谨性。
java中
public void add(int x,int y){ int z = x+y; }
javaScript中
function add(x,y){ var z = x + y; return z; }
String [] str = new String[4];
数组是引用类型,数组对象(str)并不代表数组本身,而是代表它所指向的堆内存中的对象,数组在虚拟机中存储的结构如下:
数组一旦初始化之后,长度就不能再改变了
数组有两种初始化方式:静态初始化和动态初始化
静态初始化:String[] arr1 = new String[]{"abc","cba","nss"};或者 String []arr1 = {"abc","cba","nss"};
动态初始化:String[] arr2 = new String[4];
静态初始化时直接指定元素的初始值,此时数组的长度不需要指明,由系统自己决定,而动态初始化时则由程序员指定数组的长度,至于数组的初始值则由系统指定。
动态初始化时,系统会根据数组元素的类型来指定数组的初始值:
如果数组是整数类型(int,short,long,byte),则系统默认值为 0;
如果数组是浮点类型(float,double),则系统默认值为 0.0;
如果数组是字符类型(char),则系统默认值为 ‘u000’;
如果数组是布尔类型(boolean),则系统默认值为 false ;
因为数组是引用对象,所以当arr1=arr2时,如果修改arr1的元素值,则arr2对应的元素值也会发生变化,如下图所示:
引用类型变量不等于引用类型对象!引用类型变量里存储的是引用类型对象在堆内存中的地址值,可以通过该地址值找到引用类型对象
所有的局部变量都是放在栈内存里保存的,不管其是基本类型的变量还是引用类型的变量,都是存储在各自的方法栈区的,但引用类型的变量所引用的对象则总是存储在堆内存中的(数组【不管数组中存储的是基本类型数据还是引用类型数据】,java对象)
public static void main(String[] args){ int[] aa = {1,2,3}; int a = aa[0]; int b = 20; aa[1] = b; System.out.println("a = " + a); // 1 System.out.println("b = " + b); // 20 System.out.println("aa[0] = " + aa[0]); // 1 System.out.println("aa[1] = " + aa[1]); // 20 aa[0] = 10; b = 200; System.out.println("a = " + a); // 1 System.out.println("b = " + b); // 200 System.out.println("aa[0] = " + aa[0]); // 10 System.out.println("aa[1] = " + aa[1]); // 20 }
多维数组:
int[][] aa = new int[5][]; // 五个一维数组,每个一维数组的长度不一定
int[][] aa = new int[2][3]; // 两个一维数组,每个一维数组的长度为3
int[][] aa = {{1,2,3},{5,6,8,7}};// 两个一维数组,直接定义数组的初始值。
多维数组的内存结构如下:
如果在已有的数据类型之后增加方括号,就会产生一个新的数组类型。如:int a ;是int类型的变量,而 int[] aa则是int类型的数组,int[][]aaa则是int[]类型的数组。。。。。。