3.Java值传递与引用传递( 二 )


一:值传递
解释:实参传递给形参的是值 形参和实参在内存上是两个独立的变量 对形参做任何修改不会影响实参 。通俗的讲法就是:形参只是实参创建的一个副本,副本改变了,实参当然不可能跟着改变;
再通俗的讲法就是:小明去餐厅吃饭,看见别人点的红烧肉挺好吃,九把服务员叫过来,说我要一份红烧肉,服务员从后厨拿来一份红烧肉,小明吃完了,但是他吃的红烧肉跟旁边那个人吃的是一份吗?当然不是 。
public class Demo1 {public static void main(String[] args) {int b =20;change(b);// 实参实际上的参数System.out.println(b);}public static void change(int a){//形参形式上的参数a=100;}}//20
二:引用传递
也称为传地址 。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,函数接收的是原始值的内存地址;
在方法执行中,形参和实参内容相同,指向同一块内存地址,方法执行中对引用的操作将会影响到实际对象 。
public class Demo {public static void main(String[] args) {Demo demo=new Demo();MyObj obj=new MyObj();demo.test2(obj);//这里传递的参数obj就是引用传递System.out.println(obj.b);}public void test2(MyObj obj){obj.b=100;System.out.println(obj.b);}}class MyObj{public int b=99;}/*100100*/
可以看到,int值没有发生变化,但是在test2方法中对obj类做的修改影响了obj这个对象 。
结合上面的分析,关于值传递和引用传递可以得出这样的结论:
(1)基本数据类型传值,对形参的修改不会影响实参;
(2)引用类型传引用,形参和实参指向同一个内存地址(同一个对象),所以对参数的修改会影响到实际的对象;
(3), , 等的类型特殊处理,可以理解为传值,最后的操作不会修改实参对象 。
4.Java封装
程序设计追求“高内聚,低耦合“,高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合:仅暴露少量的方法给外部使用 。
封装,即数据的隐藏:通常,应禁止直接访问一个对象中数据的实际表示,而应同通过操作接口来访问,这称为信息隐藏 。就记住两个特点:属性私有,get/set 。
原先写一个类,里面定义一个属性都是类型的,外部是可以直接访问并且给他的属性赋值,也就是可以直接用这个属性,比如
public class Person {public String name;public int age;}-----------------------------------------------------------------public class Application {public static void main(String[] args) {Person person = new Person();person.name="张三"; //外部是可以直接访问并且给他的属性赋值}}
如果是封装好的类的属性都是修饰的,比如
public class Person {private String name;//属性私有public int age;}----------------------------------------------public class Application {public static void main(String[] args) {Person person = new Person();person.name="张三";//此处的name会报红,提示'name' has private access in 'Person',意思是私有属性禁止访问person.age = 0;//因为是public修饰,所以可以直接访问并赋值}}
所以需要提供一些可以访问这个这种私有属性的方法,所以提供了一种修饰的set/get方法,get表示获取这个数据,set表示给这个属性设置值 。
get/set方法也可以使用重载,但是正常情况下不会使用重载的,一般使用构造器重载多一点,
然后关于重载的题外话最经典的就是源码,他的重载比如