这一节我们来说说类类型参数和匿名对象.
我们继续用之前的小汽车类吧
~~~
class Car
{
int num;//这是轮胎数属性
String color;//这是颜色属性
String brand;//这是品牌性
void start()//启动行为
{
System.out.println("小汽车已启动");
}
void run()//这就是运行行为
{
System.out.println(num+"..."+color+"..."+brand);
}
}
~~~
对于我们的Car类,如果我们要创建多个相同的小汽车我们应该怎么做呢?
对于我们初学者,我们肯定会用这样的操作:
~~~
class CarDemo
{
public static void main(String[] args)
{
//定义第一辆车
Car myCar1 = new Car();
myCar1.num = 4;
myCar1.color = "red";
myCar1.brand = "BWM";
//定义第二辆车
Car myCar2 = new Car();
myCar1.num = 4;
myCar1.color = "red";
myCar1.brand = "BWM";
//定义第三辆甚至更多时,只能这样不断的写代码
}
}
~~~
我们可以说说,上面的代码确实很烂了,我们做了很多相同的操作,如果我们要定义很多相同的车时,代码的复用性确实太差了.
那么我们该怎么做呢,很显然,我们必须要提高代码的复用性,也就是说我们可以把相同功能的代码封装起来以重复使用,那么就可这样做:
~~~
class CarDemo
{
public static void main(String[] args)
{
//定义第一辆车
Car myCar1 = new Car();
assemble(myCar1);
System.out.println("myCar1是一辆"+myCar1.color+"颜色的"+myCar1.brand+"品牌的小汽车,它有"+myCar1.num+"个轮子");
//定义第二辆车
Car myCar2 = new Car();
assemble(myCar2);
System.out.println("myCar2是一辆"+myCar2.color+"颜色的"+myCar2.brand+"品牌的小汽车,它有"+myCar2.num+"个轮子");
//定义第三辆可以直接复用assemble(Car car)这个组装功能即可
}
//我们可以封闭一个汽车组装的功能,然后调用这个功能就可以
public static void assemble(Car car)//类类型的参数一定要指向对象,要么就是null
{
car.num = 4;
car.color = "red";
car.brand = "BWM";
}
}
~~~
从上面的代码我们很容易就实现了相同车辆的组装,提高了代码的复用性,同时我们注意到,封装的功能的参数是一个类类型的形式参数,它指向的是一个Car类型的对象.
我们来看一下上面代码的结果:
![](https://box.kancloud.cn/2016-05-18_573c41af0d831.jpg)
我们从结果上看到确实实现了我们想要实现的相同汽车.
我们再简单来看一下比较特殊的情况,就是匿名对象.
匿名对象顾名思义就是没有名字的对象
~~~
new Car();//匿名对象,其实就是定义对象的简写格式
~~~
那么匿名对象一般怎么用呢?
我们先看一例子,比如我们要创建一辆车,并运行run方法,那么我们会这样做:
~~~
Car c = new Car();//这个是有名对象
c.run();
~~~
对于上面这种情况,我们可以简写为如下一句代码:
~~~
new Car().run;
~~~
那么我们就看到匿名对象的**第一种用法**:
当对象对方法仅进行一次调用的时候,就可以简化成匿名对象.
我们看一段代码:
~~~
class CarDemo
{
public static void main(String[] args)
{
new Car().num = 5;
new Car().color = "green";
new Car().run();
}
}
~~~
我们看一下结果:
![](https://box.kancloud.cn/2016-05-18_573c41af22b77.jpg)
对于这三句语句,每执行一名,在堆内存中都会创建新的空间,而不是只创建一个对象.当执行下面的一句语句时,前面的语句已经被释放了,所以上面的前两句代码没有意义.但是最后一句会被执行,因为该对象对方法只进行了一次调用.
匿名对象的**第二种用法**:
匿名对象可以作为实际参数进行传递.
比如前面我们的方法assemble(Car car),我们可以这样使用:
~~~
assemble(new Car());
~~~
- 前言
- 1.1 基本常识
- 1.2 Java语言概述
- 1.3 Java语言的环境搭建
- 1.4 Java程序开发之初体验--Hello World
- 2.1 关键字
- 2.2 标识符
- 2.3 注释
- 2.4 常量
- 2.5 进制扫盲
- 2.6 变量和数据类型(1)
- 2.7 变量和数据类型(2)
- 2.8 运算符
- 3.1 if语句
- 3.2 switch语句
- 3.3 while和do-while语句
- 3.4 for语句
- 3.5 for循环的嵌套
- 3.6 break语句与continue语句
- 4.1 函数的定义
- 4.2 定义函数的两个明确
- 4.3 函数的内存加载过程
- 4.4 函数的重载
- 5.1 数组的定义
- 5.2 数组的内存分配及特点
- 5.3 数组操作中常见问题
- 5.4 数组常用操作(1)
- 5.5 数组常用操作(2)
- 5.6 二维数组
- 6.1 面向对象的概述
- 6.2 类与对象的关系
- 6.3 对象的内存体现
- 6.4 成员变量与局部变量
- 6.5 类类型参数与匿名对象
- 6.6 基本数据类型参数与引用数据类型参数的传递过程
- 6.7 封装
- 7.1 构造函数概述与默认构造函数
- 7.2 构造函数与一般函数的区别
- 7.3 构造函数的重载
- 7.4 构造函数的内存加载
- 7.5 构造函数需要注意的几个细节
- 7.6 this关键字的原理
- 7.7 this关键字的细节与应用
- 8.1 static关键字之特点
- 8.2 成员变量与静态变量的区别
- 8.3 static关键字使用的注意细节
- 8.4 main函数的解析与细节
- 8.5 static关键字的使用场景
- 8.6 静态的内存加载
- 8.7 静态代码块
- 8.8 构造代码块
- 9.1 继承
- 9.2 单继承与多重继承
- 9.3 子父类中成员变量特征体现