Java SE 011 面向对象之封装
前言:此笔记为圣思园张龙老师讲述的java视频课程笔记,自己看视频学习时记录的,用于积累与复习,在此分享给学习软件编程的兄弟姐妹们,以供参考。
1.如果一个类包含了属性与方法,那么该类的每一个对象都具有自己的属性,但无论一个类有多少个对象,这些对象共享同一个方法。
解说:对于java来说,当我一个类,生成一个对象的时候,这个对象在内存的堆里面,这个内存区中就会存在这样一个变量,它会被这个对象所容纳。如果我再去new出来一个对象,在新的内存堆里面又会生成一个对象,这个对象里面也会放置属于自己对象的一个属性。那么这两个对象之间的属性是互不干扰的。即生成一个对象就会生成一个新的属性。
即新生成一个对象,这个对象就容纳一个属性,再生成一个对象,就再容纳一个属性。
对于方法来说,方法存在内存区的方法区中。这部分只有一个,即这部分的内存只有一份。所以无论一个类生成了多少个对象,这些对象都会使用内存里面同样的一个方法。只不过不同的对象去调用这个方法的时候,因为通过引用去调用这个方法,那么引用就知道,这个方法就知道是哪一个引用去调用我的。我来去操纵哪一个对象里面的属性。 因为通过引用就传递了这些信息。
通过引用里面传递的具体参数,来判断是哪一个引用调用了这个方法。
当方法传递的参数类型是原生数据类型的时候,原生数据类型的值是10即,上图上i为10,当赋完值之后,age的值也是10,但是age是age,i是i两者之间没有任何关系,即赋完值之后,你是你的,我是我的。你的任何变化对我来说不会产生任何影响,所以当i传给age之后,i与age已经脱离关系了,即便在方法里面将40赋给了age,相当于把age的值改成了40,那么对i的值也不会产生任何的影响。因为这是一个值的传递。它只是把10的值传给了age,传完之后,你是你,我是我,所以打印出来i没有发生变化。
为什么在引用传递的时候,那里就会发生变化,引用是什么,引用实际上是对象地址的一种表示形式,引用里面实际上存放的是对象的地址。那么当调用person.change(person)之后,它将person传给了形参,两个person的值是一样的,引用存放的是对象的地址。也就是将同一个person的值,传给了person。那么两者之间的值就一样了。那么引用的值一样,代表什么,代表它们指向同样的一个对象,因此既然指向同样一个对象,那么通过方法里面的那个引用,对对象所做的任何修改,就会反应到方法外面的对象的引用上面。所以方法里面对对象的修改,就会反应到person.change(person)这个引用上面,因为它们指向的是同样一个对象。
2.关于方法参数传递的总结:
关于java中方法参数传递,无论传递的是原生数据类型还是引用类型,统一是传值(pass by value)。
解说:
(1)对于原生类型来说,就是把值传过去,传完之后,你是你,我是我,两者之间没有关系了。
(2)如果传递的是引用类型,将引用的值传过去,引用的值是对象的地址,既然将对象的地址传过去了,那么说明两个引用就具有了相同的地址,相同的地址就表示两个同样的值指向同样的一个对象,因此通过一个引用所对对象作出的修改,就会立刻反应到另一个引用上面去。
3.什么类型的引用指向什么类型的对象
比如People类型的引用就能指向People类型的对象,但不能指向Student类型的对象。
例如:People people = new People();//正确
People people = new Student();//错误。
4.构造方法(Constructor)
构造方法用于完成对象属性的初始化工作。
构造方法的特点:
(1)构造方法的名字必须与类名完全一致(包含大小写)
(2)构造方法没有返回值,连void也不能出现。
(3)如果在定义一个类的时候,没有为类声明构造方法,那么Java编译器会自动为类添加一个没有参数且方法体为空的构造方法(默认的构造方法)。
(4)如果在定义一个类的时候,为类声明了构造方法,那么Java编译器就不会再为类添加构造方法了。
(5)不能显示调用类的构造方法,构造方法通常是通过new关键字隐式调用。
5.new关键字在生成对象时完成了三件事情:
(1)为对象开辟内存空间
(2)调用类的构造方法。
(3)将生成对象的地址返回。
Person person = new Person();
6.默认构造方法
构造方法没有参数,且方法体为空。
7.生成对象
on();
6.默认构造方法
构造方法没有参数,且方法体为空。
7.生成对象
使用new来生成对象的时候,后面的小括号()表示构造方法的参数列表,如果构造方法不接收参数,那么小括号中的内容为空。如果构造方法接收参数,那么构造方法中的实际参数需要与构造方法定义中的形式参数保持一致(参数类型一致,参数数量一致,按照顺序逐一的赋值)。