首页 > 如何理解java将对象作为参数?

如何理解java将对象作为参数?

class classname{
    .........
}
void method(classname ver0, classname ver1){
    System.out.println(ver0 + ver1);
}

平常方法参数都是int , String , boolean之类的, 或者int method(), 最后return一个int.
可是如果要吧对象作为参数我就不太明白了.平时我们要传递int, String之类的参数都很明显知道这是整形, 这是字符串之类.


大家都有同一个祖先,叫Object。int,String这些都是基本的数据类型,但是往往不能满足封装的需求。将java类作为一个对象传过去,是为你的方法需要一个这个类的实例来进行一些操作。你就当它是和String,int是一类东西,没什么不同的。


在C语言时代,我们也已经写函数

void open_window(char* title, int width, int height, int titlecolor, int M_BUTTON);

这个函数打开一个窗口,参数是窗口标题、宽、高、标题颜色、按钮……可能还有更多的函数。

当我们使用这个函数的时候,必须保证参数的个数和顺序。

类似的:

void insert_person_into_db(char* name, int age, int height, int sex, int ……);

在数据库中存储一个person。

凡是读完《C编程语言》的都知道,我们应该把这些放到一个结构体里面,然后将整个结构体当作参数传递过去。

不仅仅是C语言,在js中,我们通常会传递一个json。

在java中,我们虽然没有结构体,没有json,但是我们传递一个类,这样,在函数中,我们就可以操作这个类里面的公开的内容。

在C语言中,45 + 8.9032 你理解,其实,这个也有隐式类型转回,将45转变成了float(到底是float还是double我也记不清了)类型了。

在java中,+(加号)可以连接两个字符串,因此,类会被转换成字符串。

怎么转呢?

好在java的所有类,都有一个共同的祖先类 Object,所有的类都是这个类的子孙,当把类转变成字符串时,调用的就是从这个祖先类里面继承过来的 toString() 方法。


首先,明白为什么大多时候是使用值类型(大多时候,可以看作是基本类型)传递。 

1.指定类型好处。强类型语言,指定类型的时候,在编译阶段就可以检查参数类型的错误,当然,有时要自己注意类型强转的问题。 大多时候,不提倡使用object。

2.减少耦合状态。一般来说,模块或者对象(看作方法也可以,反正是调用者和被调用者)之间的耦合,通过数据耦合 是比较好的(视情况而定,不是绝对的)。减少耦合,可以看作是减少两者之间的透明度。如果传递的是值类型,在调用的对象中, 无论对传递的参数做任何修改,都不会影响到传递参数的对象。而如果传递了对象,那么调用者根本就无法预料到传递对象A进去后, A那些数据会被改动了。

举个例子:部门员工A负责编写一个接口。员工B调用这个接口。如果接口的参数是值类型,B不用关心传递参数后数据的状态会被改变,

只需要更新接口参数的类型以及返回值。如果接口参数是对象,如果过了一段时间,员工A突然把参数对象的某个状态改变了,而没有 通知员工B。这时候就出现问题了。

如果想把对象作为参数传递,要明确传递后,对象会做怎样的改变,或者就算对象状态改变后,也不影响其他程序的状态。

class A{
    void method(Class1 ver0, Class2 ver1){}
}

当调用new A().method(ver0, ver1)时, 在java thread stack里新建一个栈帧, 每个栈帧里都有 一个变量数组, 称为local variables. 它的第一个元素为 this, 是一个reference; 第二个元素是对 Class1的对象实例的reference; 第三个元素是对 Class2的对象实例的reference. local variables只能有boolean, byte, char, short, int, long, float, double, reference, or returnAddress. 具体去看jvm spec吧.

PS: java里的字符串String是对象, 不是基本类型, 和int不一样!!!!

【热门文章】
【热门文章】