文章目录
- 1.参数传值
- 2.对象的组合
- 2.1 对象组合的示例
1.参数传值
参数传值是什么意思? 顾明思意,就是把一个变量的数值传给另一个变量。
比如:
int x = 10;
int y = x;
y = 20;
上面的操作是,首先给x赋值,然后将x的值赋给变量y。最后x=10,y=20;
那其中到底是怎么回事呢?
其实在这里的传值(即赋值)所用的值不是x的本值,而是它的拷贝(copy)。
所以不会影响x本来的值。参数y得到的值相当于生活中的”原件“”的“复印件“。
上面的操作其实就是给y开辟了新的内存空间然后将x的值复制到y的内存空间里,所以对y的操作不会对x有影响,这就是参数的传值原理。
同理,引用类型的参数的传的值是地址,地址的数值也是拷贝来的。但是对地址指向的内存空间并没有拷贝。
所以对这个引用类型进行操作会改变其属性,例如:
public class Main {
public static void main(String[] args) {
Person p = new Person();
p.age = 10;
System.out.println(p.age);
Person m = p;
m.age = 100;
System.out.println("m.age: "+m.age);
System.out.println("p.age: "+p.age);
}
}
class Person{
public int age;
}
因为引用类型的值是一个地址,它指向的是同一个位置。
2.对象的组合
首先我们知道一个类可以把某个对象引用作为自己的一个成员变量,若用这样的类创建一个对象,那么这个对象中就会包含其他的对象,也就是说这个的对象将其他的对象作为自己的组成部分。
这就是类与类的 Has-A.
如果对象a组合了对象b,就相当于,对象a包含了对象b,对象b是对象a的有一个属性,那么对象a就可以委托对象b调用其方法,就是对象a以组合的方式复用对象b的方法。
虽然听起来有些云山雾绕的感觉,但是,简单来说:就是通过组合的方式来复用其他类的定义达到复用其他对象的功能的方法。
2.1 对象组合的示例
public class ObjectCombination {
public static void main(String[] args) {
TV haierTV = new TV();
haierTV.setChannel(5);
System.out.println("haierTV的频道是: 频道"+haierTV.getChannel());
//新建一个Family对象
Family zhangSanFamily = new Family();
//将之前新建的TV对象组合进Family
zhangSanFamily.buyTV(haierTV);
System.out.println("张三Family开始看电视节目:");
zhangSanFamily.seeTV();//通过Family对象使用TV对象的方法
int m = 2;
System.out.println("张三Family将电视更换到"+m+"频道");
zhangSanFamily.remoteControl(m);
System.out.println("haierTV的频道是: 频道"+haierTV.getChannel());
System.out.println("张三Family在看电视节目");
zhangSanFamily.seeTV();
}
}
/**
* Family类,其中属性是引用类型TV
*/
class Family {
TV homeTV;
void buyTV(TV tv) {
homeTV = tv;
}
void remoteControl(int m) {
homeTV.setChannel(m);
}
void seeTV() {
homeTV.showProgram();
}
}
/**
* TV类,里面的属性是基本类型
*/
class TV {
int channel;
void setChannel(int m) {
if(m>=1) {
channel = m;
}
}
int getChannel() {
return channel;
}
void showProgram() {
switch(channel) {
case 1 : System.out.println("综合频道");
break;
case 2 : System.out.println("经济频道");
break;
case 3 : System.out.println("文艺频道");
break;
case 4 : System.out.println("国际频道");
break;
case 5 : System.out.println("体育频道");
break;
default : System.out.println("不能收看"+channel+"频道");
}
}
}
这个例子很好的说明了对象的组合复用。