方法参数
值调用(call by value)表示方法接收的是调用者提供的值。
引用调用(call by reference)表示方法接收的是调用都提供的变量地址。
一个方法可以个修改传递引用所对应的变更值,而不能修改传递调用所对应的变量值。
总结一下在Java程序设计语言中,方法参数的使用情况:
l 一个方法不能修改一个基本数据类型的状态。
l 一个方法可以改变一个对象参数的状态。
l 一个方法不能实现让对象参数引用一个新的对象。
书里的代码已经很好地体现出了以上几种情况,但是有些代码并没有对结果产生影响,所以我自己根据其思路写了一段新的,不过就阅读性而言,这段代码还是非常差的,自我检讨下先。
class CallbyTest
{
public static void Methods(int x)
{
x=5*x;
System.out.println("方法调用时的x值="+x);
}
public static void main(String[] args)
{
System.out.println("方法不能修改一个基本数据类型的状态");
int x = 3;
System.out.println("方法调用前的x值="+x);
Methods(x);
System.out.println("方法调用后的x值="+x);
FenGe();
System.out.println("方法可以改变一个对象参数的状态");
Callby c= new Callby(8);
System.out.println("方法调用前的c.x值="+c.getX());
Beishu(c);
System.out.println("方法调用后的c.x值="+c.getX());
FenGe();
System.out.println("方法不能实现让对象参数引用一个新的对象");
Callby a = new Callby("犀利哥");
Callby b = new Callby("HOLD住姐");
System.out.println("方法调用前的a.name值="+a.getName());
System.out.println("方法调用前的b.name值="+b.getName());
swap(a,b);
System.out.println("方法调用后的a.name值="+a.getName());
System.out.println("方法调用后的b.name值="+b.getName());
}
public static void Beishu(Callby c)
{
c.newMethod(4);
System.out.println("方法调用时的c.x值="+c.getX());
}
public static void swap(Callby x,Callby y)
{
Callby temp = x;
x = y;
y = temp;
System.out.println("方法调用时的a.name="+x.getName());
System.out.println("方法调用时的b.name="+y.getName());
}
public static void FenGe()
{
System.out.println("-----------------------------------------");//分隔线
}
}
class Callby
{
private int x;
private String name;
public Callby(int x)
{this.x=x;}
public Callby(String name)
{this.name=name;}
public void newMethod(int num)
{
x = x* num;
}
int getX()
{
return x;
}
String getName()
{
return name;
}
}
以上代码的运行结果如下:
方法不能修改一个基本数据类型的状态
方法调用前的x值=3
方法调用时的x值=15
方法调用后的x值=3
-----------------------------------------
方法可以改变一个对象参数的状态
方法调用前的c.x值=8
方法调用时的c.x值=32
方法调用后的c.x值=32
-----------------------------------------
方法不能实现让对象参数引用一个新的对象
方法调用前的a.name值=犀利哥
方法调用前的b.name值=HOLD住姐
方法调用时的a.name=HOLD住姐
方法调用时的b.name=犀利哥
方法调用后的a.name值=犀利哥
方法调用后的b.name值=HOLD住姐
通过显示的结果可以看出:
程序中试图将参数x的值提高5倍,但没有效果;之后成功地将对象c的值提高了4倍;第三种情况下,参数变量x和y被交换了,但是a和b没有受到影响。
之前似乎对于重载的概念并没有详细说明过,不过毕竟自己第一次写日志,难免有疏忽。
重载(overloading)
定义:如果多个方法有相同的名字、不同的参数,便产生了重载。(如上面Callby的构造函数)
注:Java允许重载任何方法,而不仅是构造函数。因此,要完整地描述一个方法,需要指出方法名以及参数类型。例如,String类中有4个名为indexOf的公有方法。
indexOf(int)
indexOf(int,int)
indexOf(String)
indexOf(String,int)
当然,String类中还有很多这样的方法,getBytes
、last
IndexOf等等,此处不再一一列出。
包(package)
Java允许使用包将类组织起来,相当于一个类集合。包确保了类名的惟一性。假如两个程序员都定义了Student类,只要将这些类放置在不同的包中,就不会产生冲宊。
类的导入
一个类可以使用所属包中的所有类,以及其他包中的公有类(public class)。我们可以用两种方式访问另一个包中的公有类。
第一种方式是在每个类名之前添加完整的包名。
例如:java.util.Date today = new java.util.Date();
这种方法用起来让人抓狂,所以第二种方法更简单且更为常用
使用import语句导入一个特定的类或者整个包,这样就不必写出包的全名了。import语句应该位于源文件的顶部(但们于package语句的后面)。
import java.util.*;
有了这条语句,就可以导入java.util包中的所有类了。然后就可以使Date today = new Date();而无需在前面加上包前缀了。也可以只导入包中指定的类,如
import java.util.Date;
import java.util.*的语法比较简单,对代码的大小也没有负面影响。当然,如果能够明确地指出所导入的类,将会使代码的读者更加准确地知道加载了哪些类
注:只能使用*(星号)导入一个包,而不能使用import java.*或import java.*.*导入以java为前缀的所有包。
在实际应用中,会出现会命名冲突。如java.util和java.sql包中都有Date类。如果在程序中导入这两个包
import java.util.*;
import java.sql.*;
在程序使用Date类时,就会编译失败。因为编译器无法判断程序要使用哪一个Date类。如果只使用其中一个包中的Date类,则增加一个特定的import语句来解决即可。但如果两个Date类都要使用,则就必须在每个类名的前面加上完整的包名。