接着上一篇博客的总结,我已经学习并总结到了JAVA的类构造器,接着学习并总结。
四 . 将消息传给方法或构造器
参数即是将数据传送给方法或构造器的媒介。形参是指方法声明中的变量列表,而实参是方法调用时实际传递的值。调用方法时,所使用的实参与声明中形参的类型和次序必须相匹配
(1).形参类型 方法和构造器的形参可以是任意数据类型,包括double、float、interger等基本数据类型,以及对象和数组等引用类型。 这里给出一个方法,他接受数组作为实参。该方法创建新的 Polygon 对象并从 Point 对象数组初始化该对象,假设 Point 是表示 x、y 的类:
public Polygon polygonForm(Point[] corners){ //method body goes here }(注意:Java 程序语言不支持向方法传递方法,但可以将对象传递给方法,然后调用对象的方法)
(2).任意数目的实参 可变参数构造可用于向方法传递任意数目的值。不清楚某种类型实参的数量是,可以使用可变参数。 要使用可变参数,要在最后一个参数类型后添加省略号(…),然后添加空格和参数名。调用方法时,可以携带任意数量的该参数,包括零个。
(3).形参名 声明方法或构造器的形参时,要给这些形参指定名称。在作用域内,形参名必须唯一。 形参可以与类的一个字段同名,这种情况下,形参会覆盖字段,会降低代码的可读性,但是我们可以用 this 关键字,在以后会总结到。
(4).传递基本数据类型实参 基本数据类型的实参通过传值方式传入方法。这就意味着,对参数值的改变都只能发生在方法的作用域内。方法返回时,形参失效,对形参的改变也将丢失。例子:
public class PassPrimitiveByValue{ public static void main(String[] args) { int x = 3; passMethod(x); System.out.println("After invoking passMethod,x = " + x); } public static void passMethod(int p){ p = 10; } }程序输出结果如下:
After invoking passMethod,x = 3(5).传递引用数据类型实参 引用数据类型(对象等)也可以通过传值方式传入方法。这就是说,当方法返回时,输出的引用仍会引用相同的对象。。但是,如果正确访问对象的字段,其值可以在方法内部改变。
4.2 对象 一个典型的 Java 程序会创建许多对象,这些对象通过调用方法进行交互。 这里给出一个小 Demo ,它创建三个对象:一个 Point 对象和两个 Rectangle 对象。
public class CreatObjectDemo{ public static void main(String[] args) { //创建一个Point对象和两个Retangle对象 Point originOne = new Point(23,94); Rectangle rectOne = new Rectangle(originOne,100,200); Rectangle rectTwo = new Rectangle(50,100); System.out.println("Width of rectOne: " + rectOne.width); System.out.println("Height of rectOne:" + rectOne.height); System.out.println("Area of rectOne: " + rectOne.getArea()); rectTwo.origin = originOne; System.out.println("X Position of rectTwo: " + rectTwo.origin.x); System.out.println("Y Position of rectTwo: " + rectTwo.origin.y); System.out.println("Now rectTwo has been changed."); rectTwo.move(40,72); System.out.println("X Position of rectTwo: " + rectTwo.origin.x); System.out.println("Y Position of rectTwo: " + rectTwo.origin.y); System.out.println(new Rectangle(100,50).getArea()); } }其运行结果如下:
Width of rectOne: 100 Height of rectOne:200 Area of rectOne: 20000 X Position of rectTwo: 23 Y Position of rectTwo: 94 Now rectTwo has been changed. X Position of rectTwo: 40 Y Position of rectTwo: 72 5000接下来详细总结关于对象的细节
(一).创建对象 类为对象提供了一个实现框架;可以从类创建对象。下面的语句都是创建一个对象并将其赋值给变量:
Point originOne = new Point(23,94); Rectangle rectOne = new Rectangle(originOne,100,200); Rectangle rectTwo = new Rectangle(50,100);1).声明引用对象的变量
type name;该形式告诉编译器可以使用 name 引用 type 类型的数据。如果声明是猪类型变量,该声明就会为改变过俩保留适量的内存空间。引用变量也可以单独声明,其形式为:
Point originOne;简单声明引用变量没有创建对象。若创建对象,则需使用 new 运算符。
2).实例化类 new 运算符实例化类是,会为新对象分配内存并返回该内存的引用。new 运算符也会调用对象的构造器。
new 运算符需要一个后置的实参以调用构造器。构造器的名称是待初始化的类名。 new 运算符返回所创建对象的引用,并将该引用赋值给相应类型的变量。
3).初始化对象 Point 类的代码:
class Point{ public int x; public int y; //constructor public Point(){} public Point(int startX,int startY){ this.x = startX; this.y = startY; } }Rectangle 类的代码:
class Rectangle{ public int width; public int height; public Point origin; //constructor public Rectangle(){ origin = new Point(0,0); } public Rectangle(Point p){ origin = p; } public Rectangle(int startwidth,int startheight){ width = startwidth; height = startheight; origin = new Point(0,0); } public Rectangle(Point startPoint,int startwidth,int startheight){ origin = startPoint; width = startwidth; height = startheight; } public int getArea(){ return width * height; } public void move(int changeX,int changeY){ origin.x = changeX; origin.y = changeY; } }如果类有多个构造器,那他们必须有不同的方法签名。编译器会根据实参的数目和类型来区分构造器。 所有类都至少有一个构造器。如果类没有显式构造器,Java 编译器会自动给提供一个无参构造器,这在前一篇的博文中构造器那一块提到过,无参构造器会调用父类的无参构造器,如果没有父类。会调用 Object 构造器,如果父类没有构造器,即使 Object 有构造器,编译器也会报错。
(二).使用对象
1).引用对象的字段 对象的字段通过字段名来访问,且字段名是唯一的。类内部只需使用简单的字段名即可。例如:
System.out.println("Width and height are: " + width + "," + height);而对象外的代码要访问字段的话么就需要使用对象的引用或 ” 表达式 + 点操作符 + 简单的字段名 ” 的形式 , 如:
System.out.println("Width of rectOne: " + rectOne.width); System.out.println("Height of rectOne:" + rectOne.height);要访问字段,可以使用对象的引用,也可以使用返回对象类型的任意形式,例如:
System.out.println(new Rectangle(100,50).getArea());上述例子中,创建新的 Rectangle 对象并且立即获得它的 getArea 方法的值。本质上来说,程序并没有保存该对象的引用,执行完该语句后,Java 虚拟机会释放占用资源并回收利用。
2).调用对象的方法 调用对象的引用可以调用对象的方法,只需在对象引用后添加方法的简单名、点操作符和圆括号,并在园括号内添加传给方法的实参列表。
int areaRectangle = new Rectangle(100,50).getArea();调用对象的方法和向对象传递信息是一样的。上述代码中,调用 getArea() 的对象是构造器返回的 rectangle 。
3).垃圾收集器 Java 平台支持创建任意多对象,而且不需要销毁他们。当 Java 运行时环境确定不再使用某些对象是,就会删除他们。这个过程叫做垃圾收集。 对象没有引用,会被垃圾收集。变量超出作用域,通常删除变量中保存的引用。也可以将该变量的值设为 null ,显式删除其保存的对象引用。程序中同一对象有多个引用,垃圾收集该对象前,必须先删除这些引用。 Java 运行时环境有一个垃圾收集器,它会周期性释放那些没有引用的对象所占用的内存空间。垃圾收集器会在合适的时间自动完成该任务。
