黑马程序员_day06_二维数组和面向对象

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

二维数组[][]

格式一: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学习型技术博客、期待与您交流! ----------------------

你可能感兴趣的:(Java)