您的位置:首页 > 编程语言 > Java开发

(JAVA SE 学习笔记)Java.SE.第011讲.面向对象之封装.续二(对一些原理机制进行了详细的解释,适合初学者学习)

2011-11-19 03:08 916 查看
1. 如果一个类包含了属性与方法,那么该类的每一个对象都具有自己的属性,但无论一个类有多少个对象,这些对象共享同一个方法。

——详细解释:

对于Java来说,一个类生成对象时(new一个对象时),new完一个对象之后,这个对象在堆(内存的堆里面)里面 区域里面就会容纳出现一个属性这样的变量,就被被对象所容纳,如果在new出来一个对象,在新的内存堆里面又会生成一个对象,这个对象也会放置一个属于自己的属性,但这两个对象的属性是互不干扰的(生成一个对象,就会出来一份新的属性(就会容纳一份属性),当然从以后角度来说,这不是很明确,因为以后我们遇到的static关键字,这个关键字会导致我们这个结论不是特别准确,但目前可以先这样理解
),例如person类,可以生成李四,张三这两个对象,那么对于张三和李四的年龄,这两个年龄肯定是独立的,他们之间不会产生任何关系,但是对于方法来说就不然了,
因为类里面定义的方法,在内存里面存在一个叫方法区的这样一个内存区域,这部分只有一个(一份),所以呢,无论一个类生成了多少个对象,这个对象都会使用内存里的同样一个方法。只不过不同的对象去调用(通过引用调用)这个方法时,这个方法就知道是那个引用是调用我的 ,我来操作那一个对象里面的属性,这就很明白了,通过引用就传递了这些信息。



图1

2. 关于方法参数传递的总结:对于Java中的方法参数传递,无论传递的是原声数据类型还是引用数据类型,统一是传值(pass by value)。

例子:

(1)



图2

本程序输出 30



图3

——详细解释:

因为调用时,两个引用(第6 行中(person)和第 17行中的 person )会指向同一个 new出来的person对象(第5行 new person(),此处注意是通过 第6行 (person)中的person传递给 第17行 person 的引用地址)。通过方法中person.age(第19行)的引用来把age的值改为30。这样就会反映到外边的
第7行person.age 这个引用里面,这样改来该去还是改的同样一个对象的属性。



图4

(2).



图5

输出结果:20



图6

——详细解释:

在这里person(第19行) 指向的是一个新的对象,改的是新的对象的属性,而main方法中的person对象所生成的属性是没有任何的变化



图7

(3).



图8

输出结果:



图9

——详细解释:

先定义 i,调用change2方法时,将i的值传给age(第27行)。换句话说就是将 10 传给age,age现在为10,但此时要注意i为原生数据类型,当方法在传递是原生数据类型时,传的是数值,传完后,age为age,i为i,两者无任何关系,age的任何变化对i不会产生任何影响,而在引用(所谓引用就是对象地址的一种表示形式)传递时则不一样,因为引用类型中传递的是对象的地址(参考例子
1)。

3. 什么类型的引用就能指向什么类型的对象,比如People 类型的引用就能指向People类型的对象,但不能指向student类型的对象。比如:

People people = new People;//正确

People people = new People;//错误(尝试使用people类型的对象指向一个student类型的对象,不过在学习多态后,如果people和student之间存在继承关系,这么写就是正确的)

4. 构造方法(Constructor):构造方法用于完成对象属性的初始化工作,构造方法的特点:

(1)构造方法的名字必须与类名完全一致(包括大小写)

(2) 构造方法没有返回值,连void也不能出现。

(3) 如果定义一个类的时候,没有为类声明构造方法,那么Java编译器就会自动为类添加一个没有参数且方法体为空的构造方法(默认的构造方法)

(4) 如果在定义一个类的时候,为类声明了构造方法,那么Java编译器就不会再为类添加构造方法了(例如本例中第二个图)。

(5)不能显示调用类的构造方法,构造方法通常是通过new关键字隐式调用

——详细解释:



图10

上例中没有为Person定义构造方法,那么Java编译器在编译时,会自动添加



图11

public Person()

{

}

不带参数的,且方法体为空的,一个构造方法。——叫做默认的构造方法。

——此例子中写不写都一样,Java编译器也会编译成

public Person()

{

}

这种形式。

5. new关键字在生成对象时完成了三件事情:

(1) 为对象开辟内存空间

(2) 调用类的构造方法

(3) 将生成的对象的地址返回

——详细解释:

Person person = new Person(); 首先开辟一个未被使用的内存空间,为new Person()生成的对象,提供存储空间。接下来调用person的构造方法,其中Person()的小括号代表构造方法的参数列表,如果()类没有值,则调用不带参数的构造方法public Person{} ,最后将生成的person对象的地址返回给person这个引用。接下来person这个引用就会指向这个对象。

6. 默认的构造方法:构造方法没有参数且方法体为空。

7. 使用new来生成对象的时候,后面小括号()表示构造方法的参数列表,如果构造方法不接收参数,那么小括号的内容为空;如果构造方法接受参数,那么小括号中的实际参数就需要与构造方法定义中的形式参数保持一致(参数数量一致,参数类型一致,按照顺序逐一赋值)

——详细解释:

1.



图12

输出结果:



图13

2.



图14

输出结果:



图15

——原因分析:

小括号中的实际参数就需要与构造方法定义中的形式参数保持一致

3.



图16

输出结果:



图17

——详细解释:

new Person()时,传递一个整数,要找接收整型类的变量方法。即找到int i ,然后赋值给age,相当于给成员变量赋初值了(参考第四条)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息