JAVA——第四章——类与对象

接着上一篇博客的总结,我已经学习并总结到了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(10050).getArea();

调用对象的方法和向对象传递信息是一样的。上述代码中,调用 getArea() 的对象是构造器返回的 rectangle 。

3).垃圾收集器
Java 平台支持创建任意多对象,而且不需要销毁他们。当 Java 运行时环境确定不再使用某些对象是,就会删除他们。这个过程叫做垃圾收集。
对象没有引用,会被垃圾收集。变量超出作用域,通常删除变量中保存的引用。也可以将该变量的值设为 null ,显式删除其保存的对象引用。程序中同一对象有多个引用,垃圾收集该对象前,必须先删除这些引用。
Java 运行时环境有一个垃圾收集器,它会周期性释放那些没有引用的对象所占用的内存空间。垃圾收集器会在合适的时间自动完成该任务。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值