java面向对象中的对象创建与使用。类是对象的抽象,为对象定义了属性和行为,但类本身既不带任何数据,也不存在于内存空间中。而对象是类的一个具体存在,既拥有独立的内存空间,也存在独特的属性和行为,属性还可以随着自身的行为而发生改变。接下来演示如何用类创建对象,创建对象之前,必须先声明对象,其语法格式如下:

  类名 对象名;

  类是自定义类型,也是一种引用类型,因此该对象名是一个引用变量,默认值为null,表示不指向任何堆内存空间。接下来需要对该变量进行初始化,Java使用new关键字来创建对象,也称实例化对象,其语法格式如下:

  对象名 = new 类名();

  上述示例中,使用new关键字在堆内存中创建类的对象,对象名引用此对象。声明和实例化对象的过程可以简化,其语法格式如下:

  类名 对象名 = new 类名();

  接下来演示创建Person类的实例对象,具体示例如下:

  Person p = new Person();

  上述示例中,“Person p”声明了一个Person类型的引用变量,“new Person()”为对象在堆中分配内存空间,最终返回对象的引用并赋值给变量p,如图4.1所示。

  图4.1 对象p在内存中的示意图

  对象实例化后,就可以访问对象的成员变量和成员方法,其语法格式如下:

  对象名.成员变量;

  对象名.成员方法();

  接下来通过一个案例来学习访问对象的成员变量和调用对象的成员方法,如例4-1所示。

  例4-1 TestPersonDemo.java

  1 class Person {

  2 String name; // 声明姓名属性

  3 int age; // 声明年龄属性

  4 public void say() { // 定义显示信息的方法

  5 System.out.println("姓名:"+name+",年龄:"+age);

  6 }

  7 }

  8 public class TestPersonDemo {

  9 public static void main(String[] args) {

  10 Person p1 = new Person(); // 实例化第一个Person对象

  11 Person p2 = new Person(); // 实例化第二个Person对象

  12 p1.name = "张三"; // 为name属性赋值

  13 p1.age = 18; // 为age属性赋值

  14 p1.say(); // 调用对象的方法

  15 p2.say();

  16 }

  17 }

  程序的运行结果如图4.2所示。

  图4.2 例4-1运行结果

  例4-1中,实例化了两个Person对象,并通过“对象.属性”的方式为成员变量赋值,通过“对象.方法”的方式调用成员方法。从运行结果可发现,变量p1、p2引用的对象同时调用了say()方法,但输出结果却不相同。这是因为用new创建对象时,会为每个对象开辟独立的堆内存空间,用于保存对象成员变量的值。因此,对变量p1引用的对象属性赋值并不会影响变量p2引用对象属性的值。为了更好地理解,变量p1、p2引用对象的内存状态如图4.3所示。

  图4.3 对象的内存关系

  例4-1中没有为p2对象的成员变量赋值,但从图4.3中可发现,p2对象的name值为null,age值为0。这是因为在实例化对象时,Java虚拟机会自动为成员变量进行初始化,根据成员变量的类型赋相对应的初始值。

  另外,需要注意的是,一个对象能被多个变量所引用,当对象不被任何变量所引用时,该对象就会成为垃圾,不能再被使用。接下来演示垃圾是如何产生的,如例4-2所示。

  例4-2 TestObjectRef.java

  1 class Person {

  2 String name; // 声明姓名属性

  3 int age; // 声明年龄属性

  4 public void say() { // 定义显示信息的方法

  5 System.out.println("姓名:"+name+",年龄:"+age);

  6 }

  7 }

  8 public class TestObjectRef {

  9 public static void main(String[] args) {

  10 Person p1 = new Person(); // 实例化第一个Person对象

  11 Person p2 = new Person(); // 实例化第二个Person对象

  12 p1.name = "张三"; // 为p1对象name属性赋值

  13 p1.age = 18; // 为p1对象age属性赋值

  14 p2.name = "李四"; // 为p2对象name属性赋值

  15 p2.age = 28; // 为p2对象age属性赋值

  16 p2 = p1; // 将p1对象传递给p2对象

  17 p1.say(); // 调用对象的方法

  18 p2.say();

  19 }

  20 }

  程序的运行结果如图4.4所示。

  图4.4 例4-2运行结果

  例4-3中,第16行代码p2被赋值为p1后,会断开原有引用的对象,而和p1引用同一对象。因此打印如图4.6所示结果。此时,p2原有引用的对象不再被任何变量所引用,就成了垃圾对象,不能再被使用,只等待垃圾回收机制进行回收。垃圾产生的过程,如图4.5所示。

  图4.5 垃圾对象的产生

  图4.5中,首先实例化两个对象p1和p2,其次分别为p1和p2的属性赋值,最后将p2从新赋值为p1,p2将断开原有引用,此时被断开引用的对象,也不被其他引用变量所引用,就成为垃圾空间,等待被回收。

Java开发学习教程之对象的创建与使用的更多相关文章

  1. Java开发学习心得(一):SSM环境搭建

    目录 Java开发学习心得(一):SSM环境搭建 1 SSM框架 1.1 Spring Framework 1.2 Spring MVC Java开发学习心得(一):SSM环境搭建 有一点.NET的开 ...

  2. Java开发学习(二十五)----使用PostMan完成不同类型参数传递

    一.请求参数 请求路径设置好后,只要确保页面发送请求地址和后台Controller类中配置的路径一致,就可以接收到前端的请求,接收到请求后,如何接收页面传递的参数? 关于请求参数的传递与接收是和请求方 ...

  3. Java开发学习(二十六)----SpringMVC返回响应结果

    SpringMVC接收到请求和数据后,进行了一些处理,当然这个处理可以是转发给Service,Service层再调用Dao层完成的,不管怎样,处理完以后,都需要将结果告知给用户. 比如:根据用户ID查 ...

  4. Java开发学习(二十八)----拦截器(Interceptor)详细解析

    一.拦截器概念 讲解拦截器的概念之前,我们先看一张图: (1)浏览器发送一个请求会先到Tomcat的web服务器 (2)Tomcat服务器接收到请求以后,会去判断请求的是静态资源还是动态资源 (3)如 ...

  5. Java开发学习(三十六)----SpringBoot三种配置文件解析

    一. 配置文件格式 我们现在启动服务器默认的端口号是 8080,访问路径可以书写为 http://localhost:8080/books/1 在线上环境我们还是希望将端口号改为 80,这样在访问的时 ...

  6. Java开发学习(四十一)----MyBatisPlus标准数据层(增删查改分页)开发

    一.标准CRUD使用 对于标准的CRUD功能都有哪些以及MyBatisPlus都提供了哪些方法可以使用呢? 我们先来看张图: 1.1 环境准备 这里用的环境就是Java开发学习(四十)----MyBa ...

  7. Java开发学习心得(二):Mybatis和Url路由

    目录 Java开发学习心得(二):Mybatis和Url路由 1.3 Mybatis 2 URL路由 2.1 @RequestMapping 2.2 @PathVariable 2.3 不同的请求类型 ...

  8. 《Java开发学习大纲文档》V7.0

    <Java开发学习大纲文档>V7.0简介: 本文档是根据企业开发所需要掌握的知识点大纲进行总结汇编,是Java开发工程师必备知识体系,系统化学习针对性非常强,逻辑分析能力非常清晰;技术方面 ...

  9. Java开发学习(二十二)----Spring事务属性、事务传播行为

    一.事务配置 上面这些属性都可以在@Transactional注解的参数上进行设置. readOnly:true只读事务,false读写事务,增删改要设为false,查询设为true. timeout ...

随机推荐

  1. 20180925 SQL Server游标使用

    之前写了一个存储过程 目标: 根据时间,获取指定范围的数据集A, 再从数据集A 中,取出每行数据中的两个时间,卡另外一个B表里面的某列时间范围的值集.得到均值进行配置值比对. 这里有个问题,就是取得B ...

  2. 报错解决——Failed to load resource: the server responded with a status of 404 (Not Found) favicon.ico文件找不到

    Django项目开发完成后在本地运行没问题,但在推到服务器上后出现报错Failed to load resource: the server responded with a status of 40 ...

  3. chmod a+r file:给所有用户添加读的权限

    chmod a+r *:用户自己使用此命令,柯给所有用户添加可读的权限 超级用户给其他用户设置权限:sudo chmod a+rx /home/user   使所有人可以访问,读取文件,bu no W ...

  4. 007-js中的Array常用方法

    原文:http://www.runoob.com/jsref/jsref-obj-array.html 摘要常用方法 const array=new Array(); // 1 增加元素 // 1.1 ...

  5. 手机端 https://doc.vux.li/zh-CN/components/badge.html

    https://doc.vux.li/zh-CN/components/badge.html 手机端前端框架

  6. abap函数返回结构体类型

    1: 定义一个结构体 T-CODE   se11 2: 选择 structure 3:输入相应的字段 4:激活 5:创建一个function module zfm_return_table,返回类型为 ...

  7. iOS 点击返回键崩溃的未解之谜

    1. iOS8出现. 2.点击进去下一层View,然后返回,再返回上一级的视图的时候奔溃. 3.只有点击进去一下层View的时候才出现. 4. 报错的是给一个未知对象发送这个消息 gestureRec ...

  8. Kotlin enum class 匿名类实例

    Kotlin里的枚举类里有新玩意:就是枚举类的常量可以同时看成是一个同名匿名类 既然是类就可以与方法关联 看看官网的代码 如果你有过其它语言的使用枚举的经历,你可能对这个定义和说明很迷惑 我给你一个例 ...

  9. IdentityServer3:.NET开源OpenID和OAuth2架构

    简介 大多数软件的相互沟通图:客户端与Web应用程序的访问.应用与Web api.api与api……相互沟通则需要授权.身份验证 IdentityServer3的功能:Web认证.SSO单点登录.We ...

  10. rosetta mpi编译时出现 MPI has not been declared 错误

    安装openmpi2.1.0版本,编译mpi rosetta时出现 MPI has not been declared 错误,经过一系列的摸索发现安装openmpi-1.6.5就可以顺利编译,降低版本 ...