本文共 3458 字,大约阅读时间需要 11 分钟。
以地球为例子,讲一讲在地球中的类和对象的关系:
在这个地球上,我们常见的有:动物、植物、人类,为什么把人类单独提出来,因为我觉得人类太伟大了,哈哈!进入正题
请大家思考一下,动物!植物!人类!是某一个具体的事物吗?平常我们会见到很多动物,比如:狗,猫,猪…这些其实都是看得见,摸得着的实物。动物这一词,其实就是指从这些实物上抽象出来的一个名词,在Java中把这种抽象出来的叫做类。
以人为例:
类: 人类
对象:黄种人、黑种人、白种人。( “人类” 只是对这三种人的一个抽象 )
以人为例:
小结:
创建对象也叫做实例化
创建对象后,对于不同的成员变量(属性),会按照默认的初始化方式进行初始化
举例说明:
Person类的定义
// 法1Person p1 = new Person();// 法2Person p2 = null;p2 = new Person();/* 注意: 通过两种方式初始化的 p1、p2对象中,属性都是默认的初始化属性 如:name = null、age = 0*/// 为这个人类对象赋值p1.name = "猪八戒";p1.age = 250;
在内存空间的堆区域中,申请一块内存。用于存放该对象的 特有的信息 (属性/成员变量)。
new Person();new Person().name = "匿名对象";// 这两次的 new,实际上在内存中开辟了两块内存,创建了不同的对象
new person() :是去堆区域中申请了一块儿内存。但是并没有名字(引用),我们把这种对象,叫做匿名对象。(想想一下中国皇帝培养的死侍,几乎都用的代号,匿名的)
用 “ new Person()” 创建的匿名对象,只能用一次!!!所以我们用引用来存放 “ new Person(); ”申请的堆内存的地址信息,这样我们可以通过引用来找到它该对象。通过引用,可以多次使用该对象
引用:
存放在stack(栈内存)中
存放的是 heap(堆内存) 的地址 (对象的堆内存地址值)
若对象无引用,则该对象就是匿名对象
想要获取、修改对象的属性,要通过引用定位到对象对应的堆内存
// 申明一个Person类型的引用变量:p1,指向new出来的Person对象Person p1 = new Person(); // 通过p1中的内存地址,找到了Person对象的内存空间,给name属性赋值p1.name = "张飞";
引用的本质: 引用存放的是地址值,不是对象。而是通过地址值指向了相应的对象( 完成了相应的绑定 )。
注意:
Java代码:
Person p1 = new Person(); p1.name = "张飞";
形参:
形参出现在函数定义中,在整个函数体内都可以使用, 离开该函数则不能使用
void setName(String s){ name = s;};
实参:
调用该方法时,用的是实参(地址值)
p1.setName("张飞");
可变长参数:
Java1.5版本的新特性,在定义方法时不知道以后要用的时候会传多少个参数。那么就用可变长参数,参数个数:0~n个
如果参数既有固定参数,又有可变长参数,那么可变长参数放在参数列表的末尾
// 方法名(参数类型...参数名);// 把该参数看做一位数组来使用showInfo(String...args){ for(int i; i < args.length; i++){ System.out.println( args[i]); }}// 调用p1.show(); // 无参数p1.show("参数1"); // 一个参数p1.show("参数1","参数2"); // 两个或者多个参数
形参和实参,在栈内存中,都有独立的空间。再方法调用完后,形参就会被释放掉。
基本数据类型,作为参数时,栈内存存放的是实际值,形参在方法体中,不论如何改变形参中的值,都不能影响实参的值 (因为形参和实参,是两块不同的内存空间)。
public class p{ int num = 5; // 实参 // 方法中的参数,是形参。 void test(int num){ num = 200; } // 传递实参 new p().test(num); System.out.println(num); // num = 5}
引用数据类型,作为参数时,**栈内存存放的是地址值**,而不是实际参数。地址值指向的才是实际的值。
在调用方法时,形参在栈内存中指向的,和实参指向的是同一个内存空间。所以,方法体中 给形参赋值,就是给指向的那块内存空间做出修改。
实际参数会改变。
public class p{ int[] arr = int[]{ 10, 20}; // 实参 // 方法中的参数,是形参。 void test(int[] arr){ arr = [200, 10]; } // 传递实参 new p().test(arr); System.out.println(arr); // arr =[200, 10, 3]}
参数传递的内存分析图:
引用数据类型,作为参数时还有一种情况要注意:
在方法体中,虽然实参的地址值传递给了形参。但是,形参又重新指向了其他对象(堆内存空间),这时候,不管形参怎么变都不会影响实参的值。
以上面的代码为例子:
void test(int[] arr){ arr = [200, 10]; }// 方法的调用new p().test(arr);
转载地址:http://gquen.baihongyu.com/