一.创建对象

  下面的语句创建了一个对象并把它的引用赋值给了一个变量:

  1. Point originOne = new Point(23, 94);

  这条语句由三部分组成(下面将详细讨论):

  1. 声明对象变量:声明一个可以引用稍后创建的对象的变量。
  2. 实例化类:new关键字是实例化类的操作符。
  3. 初始化对象:new从操作符将会调用类的构造器,从而完成对象的初始化。

1.声明对象变量

  就像声明基本数据类型的变量一样,声明对象变量的语法如下:

  1. ClassName variableName;

  这会告诉编译器variableName将会用来引用一个ClassName类的对象。在使用这个变量之前,必须将一个对象的引用赋值给它,否则将会造成编译错误。

2.实例化类

  new操作符通过为对象分配内存并返回对这块内存的引用来实例化一个类。new操作符还会调用构造方法。

  new操作符后需要一个对构造方法的调用。构造方法的名字也就是需要实例化的类的名字。

  可以不将new操作符返回的引用赋值给变量,它可以直接用在表达式中:

  1. int x = new Point(1, 5).getX();

3.初始化对象

  下面是Point类的代码:

  1. public class Point {
  2. public int x = 0;
  3. public int y = 0;
  4. //constructor
  5. public Point(int a, int b) {
  6. x = a;
  7. y = b;
  8. }
  9. }

  Point类包含一个构造方法。这个构造方法接受两个整数参数,下面的代码提供23和94作为这些参数的值:

  1. Point originOne = new Point(23, 94);

  这条语句的结果可以用下面这张图说明:



  下面是RectAngle类的代码,这个类有四个构造方法:

  1. public class Rectangle {
  2. public int width = 0;
  3. public int height = 0;
  4. public Point origin;
  5. // four constructors
  6. public Rectangle() {
  7. origin = new Point(0, 0);
  8. }
  9. public Rectangle(Point p) {
  10. origin = p;
  11. }
  12. public Rectangle(int w, int h) {
  13. origin = new Point(0, 0);
  14. width = w;
  15. height = h;
  16. }
  17. public Rectangle(Point p, int w, int h) {
  18. origin = p;
  19. width = w;
  20. height = h;
  21. }
  22. // a method for moving the rectangle
  23. public void move(int x, int y) {
  24. origin.x = x;
  25. origin.y = y;
  26. }
  27. // a method for computing the area of the rectangle
  28. public int getArea() {
  29. return width * height;
  30. }
  31. }

  如果一个类有多个构造方法,则它们必须具有不同的签名。Java编译器根据参数的数量和类型区分构造方法。下面的代码创建了一个Point类的对象,并使用它和另外两个整数作为参数来创建一个RectAngle类的对象:

  1. Point originOne = new Point(23, 94);
  2. Rectangle rectOne = new Rectangle(originOne100,200);

  这条语句的结果可以用下面这张图说明:



  所有类至少有一个构造方法。如果类没有提供构造方法,则Java编译器会自动提供一个无参构造方法,称为默认构造方法。此默认构造方法会调用类父级的无参构造方法。如果类没有使用extends关键字直接继承父类,这个类将会有一个隐含的父类——Object类,它有一个无参构造方法。如果类使用extends关键字继承了父类,但是父类没有无参构造方法,编译器将会给出错误。

  如果类提供的构造方法里不包括无参构造方法,编译器将不会自动提供无参构造方法。此时使用无参构造方法初始化对象将会产生一个错误。

二.使用对象

  创建了一个对象之后,我们可以在接下来的代码中去使用它。可能是获取某个域的值,或者改变某个域的值,也可能是通过调用某个方法去执行一些操作。

  使用以下的语法来访问一个对象的域:

  1. objectReference.fieldName

  对于上面的rectOne所引用的对象来说,我们可以以如下方式去访问它的height域:

  1. rectOne.height

  使用以下的语法来调用一个对象的方法:

  1. objectReference.methodName(argumentList)

  下面的语句调用了rectOne所引用的对象的getArea方法并将返回值赋值给了一个变量:

  1. int area = rectOne.getArea();

垃圾回收

  某些语言要求您跟踪所创建的所有对象,并在不再需要时明确销毁它们。明确地管理内存是乏味且容易出错的。Java虚拟机在确定一个对象不再使用时删除这个对象。这个过程称为垃圾回收。

  当没有对该对象的引用时,虚拟机有资格对该对象进行垃圾回收。可以通过将变量设置为null来显式取消对该对象的引用。需要注意的是,程序可以对同一对象进行多次引用,在对象符合垃圾回收条件之前,必须删除对对象的所有引用。

Java基础教程(11)--对象的更多相关文章

  1. Java基础教程:对象比较排序

    Java基础教程:对象比较排序 转载请标明出处:http://blog.csdn.net/wangtaocsdn/article/details/71500500 有时候需要对对象列表或数组进行排序, ...

  2. Java基础教程(5)--变量

    一.变量 1.变量的定义   正如上一篇教程<Java基础教程(4)--面向对象概念>中介绍的那样,对象将它的状态存在域中.但是你可能仍然有一些疑问,例如:命名一个域的规则和惯例是什么?除 ...

  3. Java基础教程:HashTable与HashMap比较

    Java基础教程:HashTable与HashMap比较 1.  关于HashMap的一些说法: a)  HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体.HashMap的底层结 ...

  4. Java基础教程(18)--继承

    一.继承的概念   继承是面向对象中一个非常重要的概念,使用继承可以从逻辑和层次上更好地组织代码,大大提高代码的复用性.在Java中,继承可以使得子类具有父类的属性和方法或者重新定义.追加属性和方法. ...

  5. Java基础教程(12)--深入理解类

    一.方法的返回值   当我们在程序中调用方法时,虚拟机将会跳转到对应的方法中去执行.当以下几种情况发生时,虚拟机将会回到调用方法的语句并继续向下执行: 执行完方法中所有的语句: 遇到return语句: ...

  6. Java基础教程:注解

    Java基础教程:注解 本篇文章参考的相关资料链接: 维基百科:https://zh.wikipedia.org/wiki/Java%E6%B3%A8%E8%A7%A3 注解基础与高级应用:http: ...

  7. Java基础教程:网络编程

    Java基础教程:网络编程 基础 Socket与ServerSocket Socket又称"套接字",网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个s ...

  8. Java基础教程:Lambda表达式

    Java基础教程:Lambda表达式 本文部分内容引用自OneAPM:http://blog.oneapm.com/apm-tech/226.html 引入Lambda Java 是一流的面向对象语言 ...

  9. Java基础教程:泛型基础

    Java基础教程:泛型基础 引入泛型 传统编写的限制: 在Java中一般的类和方法,只能使用具体的类型,要么是基本数据类型,要么是自定义类型.如果要编写可以应用于多种类型的代码,这种刻板的限制就会束缚 ...

随机推荐

  1. Hello World! 我的程序员入坑之旅!

    先说下本文标题,各行各业都有自己的行规和一些内行人玩的梗什么的,这是我开始写技术博客的第一篇,所以它的标题毫无疑问只能是Hello World! 介绍一下我自己 我算是一个少见的科班出身的开发者了,1 ...

  2. NRF52840相对于之前的NRF52系列、NRF51系列增加了什么功能

    现在广大客户的蓝牙采用NORDIC越来越多了,NORDIC一直在不断进行技术改进更好的满足市场需求 推出了新款NRF52840.NRF52840更为先进些,支持的功能也多点,比如IEEE802.15. ...

  3. Python 使用 lambda() 结合sort() 或 sorted() 对列表嵌套字典格式的数据进行排序

    1.使用sort()方法进行排序 my_list = [{"age":65, "money":5}, {"age":35, "mo ...

  4. thinkphp5的mkdir() Permission denied问题

    最近一直在用tp5写项目,在此遇到的问题也比较多.今天来谈谈“mkdir() Permission denied”错误. 你如果不仅仅写代码,还得部署到线上,那么这个tp5的这个错误,你有很大概率会遇 ...

  5. 双11,自动领取优惠券 js 代码

    http://www.zhihu.com/question/36426051/answer/67690322 本来我不熟悉 js,正好研究一下 (function(window, document) ...

  6. MySQL(ORM框架)

    day63 参考:http://www.cnblogs.com/wupeiqi/articles/5713330.html SQLAlchemy本身无法操作数据库,其必须以来pymsql等第三方插件, ...

  7. echart 遇到的点

    1,图表随着外部container变化而变化: window.onresize = myChart.resize (拿着resize在api文档中搜就看到了)

  8. android平台一些常用代码

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...

  9. MVC各部分技术体现

      视图层用jsp,javascript 作用--显示数据,接受用户输入数据 控制层用servlet 作用--接收视图层数据,传输 给业务逻辑层(即模型层) 模型层用普通java class 作用-- ...

  10. php判断是否使用手机访问

    直接上代码 /** * 检测是否使用手机访问 * @access public * @return bool */ public function isMobile() { if (isset($_S ...