二维数组[][]
格式一:int[][]arr=new int[3][2];
定义了名称为arr的二维数组。
二维数组中有三个一维数组。
每个一维数组中有2个int型的元素。
一维数组的名称分别为arr[0],arr[1],arr[2]
第一个一维数组1角标位赋值为66;arr[0][1]=66;
格式二:int[][]arr=new int[3][];
二维数组中有三个一维数组。
每个一维数组的都是默认初始化值 null
可对这三个一维数组分别进行初始化;
arr[0]=new int[3];arr[1]=new int [2];arr[2]=new int[3];
Int[]arr=new int[3];
System.out.println(arr);
结果为[I@c17164:@分隔符
将arr数组转成了字符串并打印。该字符串中包含的信息有以@左边是该实体的类型[代表数组,I代表int。右边是该实体的哈希值。
引用数据类型在堆内存中默认初始化值为null
当变量代表一个实体,该实体不存在的时候,该变量的初始化值为null,即没有任何指向。
int[][]arr=new int [3][2];
Sop(arr); 结果为[[I@哈希值3e0ebb
Sop(arr[0]); 结果为[I@哈希值19836ed
Sop (arr[0][0]);结果为0
int[][]arr=new int[3][];
Sop(arr); 结果为[[I@哈希值
Sop(arr[0]); 结果为null
int[][]arr=new int[3][2];
arr[0]=new int[6];这里就会发生原二维数组0角标位所存储的首地址由原来的长度为2的一维数组的首地址变为了新创建的长度为6的一维数组的首地址。
二维数组在内存中的存在形式,比如
int[][]arr=new int[2][3];
arr[0]中存储的是长度为3的一维数组的首地址。arr[0][1]的找寻便是先通过变量arr中实体的首地址找到arr[][]实体中的arr[0],然后通过arr[0]中存储的arr[0][]的首地址,找到arr[0][]的1角标位元素arr[0][1]
int[]a=new int[3];
int[][]b=new int[4][5];
int[]c=a;正确,将a中的实体首地址赋值给c 使得a,c指向同一个实体。而int[]c=b;错误,两边类型不匹配。b指向的二维数组,而c是一维的。
int[][]arr={{1,2,3},{1,2},{1}};二维数组的另一种格式
System.out.println(arr.length);结果为3
System.out.println(arr[1].length);结果为2
对二维数组里的元素进行求和
int[][]arr={{1,2,3,4},{5,6},{7,8}};
int sum=0;
for (int x=0;x
{
for (int y=0;y
{
sum+=arr[x][y];
}
}
System.out.println("sum="+sum);
int[] x[],y;相当于 int[]x[],int[]y;也相当于 int[][]x,int[]y;
由此可见,x是二维数组。Y是一维数组。
所以x=y;是错误的。x[0]=y;是正确的。
[]在变量前后对于单个来说都可以。但是int[] x[],y;中的第一个[](即在变量前)是对x和y都是有效的。而第二个[]只是对x有效。
面向对象
面向对象相对面向过程而言。面向对象和面向过程都是一种思想。
面向过程 强调的是功能行为。
面向对象 将功能封装进对象,强调具备了功能的对象
面此对象是基于面向过程的
面向过程:c语言 ,这种语言编写时,都是通过函数来体现的
面向对象的特点:
1、面向对象是一种思想,是符合现在人们思考的习惯的一种思想。
2、面向对象的出现将复杂问题简单化。
3、面向对象将过程中的执行者转换成了指挥者。
解决问题,先找到该问题领域中所涉及的对象(名词提炼法),如果没有,就造一个具备所需功能的对象。
功能定义在哪个对象中最合适:哪个对象最清楚这个功能。
计算机的Java语言,也用来描述事物。Java语言描述事物的方式:用类来完成。
例:描述一辆汽车这个对象。
属性:颜色;车轮数;
行为:运行功能。
class Car
{
String color;
int num;
public void run()
{
System.out.println(color+" "+num);
}
}
new Car();创建一个Car的对象
类是用于描述对象的。对象:是该类事物存在的个体(实体)
class Car
{
String color;
int num;
public void run()
{
System.out.println(color+" "+num);
}
}
class CarDemo
{
public static void main(String[] args)
{
创建Car类的对象,通过new关键字完成。左边定义了一个Car类类型变量。
Car c=new Car();
调用对象做事情,格式:对象.对象成员
c.color="blue";
c.num=6;
c.run();
}
}
new Car()并不依赖于上方Car类的源代码,而是编译后的Car.class文件。C.color并没有改变上方类中的color值,这个类仅是在描述事物,告诉事物中有什么而已。改变的是对象中的color值。
Car c=new Car();
Car c=new Car();在堆内存中又创建了一个Car类型的对象(实体),它们的初始化是一样的。
若 Car c=new Car();
Car c1=c;(将c指向的对象的首地址赋值给栈内存中变量c1,使得c1,c同时指向该对象。)
c.color="blue";
c1.num=6;
c.run();结果为 blue 6
描述事物就是在描述该事物的属性和行为。
在类中的体现:
属性:成员变量 行为:成员函数
描述类就是定义类中的成员(成员变量、成员函数)
成员变量和局部变量的区别
1、定义的位置不同
成员变量定义在类中,作用于整个类。
局部变量定义在函数中,作用于整个函数。或者定义在语句中,作用于语句。
2、内存中出现的时间和位置不同
成员变量:当对象创建时,出现在堆内存的对象中。
局部变量:当所属区间被运算时(函数加载或语句运行)出现在栈内存中
3、生命周期不同
成员变量:随着对象的出现而出现,消失而消失
局部变量:随着所属区间的运算结束,立即被释放。
4、初始化值
成员变量:因为在堆内存中,都有默认初始化值。
局部变量:没有默认初始化值。
Car c=new Car();
c.run();可简化为new Car().run();这里的new Car()就是匿名对象
匿名对象的使用:当对象对方法进行一次调用的时候,可以使用匿名对象来简化。第二点:可以将匿名对象作为实际参数进行传递。
Car c1=new Car();
c1.color="red";
c1.num=8;
c1.run();结果为red 8
而
new Car().color="red";
new Car().num=8;
new Car().run();结果为null 0.而且这些语句执行完时,在堆内存中建立了3个实体。
且第一个实体创建并赋值,赋值动作一结束,即成了垃圾,因为没有变量引用。
所以第一、二句是没有意义的。而第三句中包含了run()函数这个运算体,是有意义的。
练习
class Demo
{
public static void main(String[] args)
{
int x=2;
show(2);
System.out.println("x="+x);
}
public static int show(int x)
{
x=4;
return x;
}
}结果为2.首先在栈内存中开辟main函数空间,main空间中存储一个变量x赋值为2,执行到show语句时,show函数进栈,开辟show函数空间,在show函数空间中有变量x,将main中的x值赋给show中的x值,执行show函数中的语句x=4;x由2变为4,返回x=4.但是主函数并没有引用show函数的返回值,没有对show函数进行任何引用,只是调用了一下而已。所以打印出来的仍是main函数中的x变量值。
class Demo
{
int x=3;
public static void main(String[] args)
{
Demo d=new Demo();
d.x=5;
show(d);
System.out.println("x="+d.x);
}
public static void show(Demo d)
{
d.x=4;
}
}结果为4.首先Demo对象中的x的值为3;x是个成员变量。在栈内存中定义了一个 Demo类类型的变量d,将Demo对象的首地址值赋值了d。d.x是对d所指向的对象中的x进行操作---赋值为5,由3变为了5.执行到show函数。Show函数进栈,show函数中参数变量d获得了Demo d中d所存储的能指向对象首地址值,使得show中d变量也指向了对象。执行show函数中的语句 d.x=4;即对对象中x进行赋值操作,又由5变为了4.show函数结束出栈。此时,对象中x已由原来的3变为5最终又变为4;继续执行主函数中的执行语句,输出d.x,4.
----------------------- android培训、java培训、java学习型技术博客、期待与您交流! ----------------------