java对象与类
1.构造器总是伴随着new操作符的执行而被调用,而不能对一个已经存在的对象调用构造器来达到重新设置实例域的目的。
2.静态域与静态方法
如果将类定义为static,每一个类只有一个这样的域。静态域是属于类的,而不属于任何独立的对象,其又被称为类域。
静态方法是一种不能向对象实施操作的方法,但是他可以访问自身类中的静态域。
main方法也是一个静态方法,main方法不对任何对象进行操作,实际上,在启动程序时还没有任何一个对象。静态的Main方法将执行并创建所需要的对象。
3.方法参数
常见的将参数传递给方法的方式有2种:按值调用,按引用调用
按值调用表示方法接受的是调用者提供的值,按引用调用表示方法接受的是调用者提供的变量地址;
java程序设计语言总是采用按值调用,也就是说,方法得到的是所有参数值得一个拷贝,特别的,方法不能修改传递给他的任何参数变量得内容
例如
public static void tripleValue(double x){ x=3*x; }
然后,调用这个方法
double percent=10; tripleValue(percent);
在调用完这个方法后,percent的值还是10.
下面来看一下上面代码的具体执行过程
a.首先,x被初始化为percent值得一个拷贝(也就是10)
b.然后,x在被乘3后变成30,但是percent 依然是10
c.在这个方法中,x变为了30,但是在方法结束之后,参数变量x不再使用,percent依然还是10.
一般来讲,方法参数共有两种类型:
a.基本参数类型(数字,布尔值)
b.对象引用
从上面可以看出,一个方法是不能修改一个基本数据类型的参数,但是当参数为对象引用就不一样了
例如,下面程序实现将一个员工的工资提升两倍
1 public static void tripleSalary(Employee x) 2 { 3 x.raiseSalary(200); 4 }
当调用
1 harry=new Employee(...); 2 tripleSalary(harry);
后,员工的工资加倍了
下面来看一下具体的执行过程
a.x被初始化为harry值的拷贝,这里是一个对象的引用
b.raiseSalary方法应用于这个对象引用。x和harry同时引用的那个Employee对象的工资提升了200%
c.方法结束后,参数变量x不在使用,当然,对象变量harry继续引用那个工资增至3倍的员工对象
java对于对象采用的也是值传递的方式,但是不少人认为采用的为引用调用,下面给出一个反例
//首先,编写一个交换两个员工对象的方法; public static void swap(Employee x,Employee y) { Employee temp=x; x=y; y=temp; }
如果java对于对象采用的是按引用调用,那么这个方法就能够实现交换数据的效果
Employee a=new Employee("Alice",...) Employee b=new Employee("Bob",...) swap(a,b)
但是,方法并没有改变储存在变量a和变量b中的对象引用,swap方法的参数x,和参数y被初始化为两个对象引用的拷贝,这个方法交换的是这两个拷贝。
//x refers to Alice,y to Bob Employee temp=x; x=y; y=temp; //now x refers to Bob,y to Alice
两个拷贝被成功交换了,但随着方法的结束,参数变量随之被丢弃,原来的a,b 变量仍保留方法调用之前所引用的对象,实质上,对象引用是按值传递的
总结一下java中方法参数的使用情况:
a.一个方法不能修改一个基本参数类型的参数(即数值型,布尔型)
b.一个方法可以改变一个对象参数的状态
c.一个方法不能让对象参数引用一个新的对象