5.0 对象的几种创建方式
对象是对类的实例化。对象具有状态和行为,变量用来表明对象的状态,方法表明对象所具有的行为。Java 对象的生命周期包括创建、使用和清除,本次介绍对象的创建,在 Java 语言中创建对象分显式创建与隐含创建两种情况。
5.1 显式创建
对象的显式创建方式有 4 种。
5.1.1 使用new关键字创建
这是常用的创建对象的方法,语法格式如下:
类名 对象名 = new 类名();
5.1.2 newlnstance() 方法
在 Java 中,可以使用反射类的 newlnstance() 实例方法来创建对象,代码格式如下:
java.lang.Class Class 类对象名称 = java.lang.Class.forName(要实例化的类全称);
类名 对象名 = (类名)Class类对象名称.newInstance();
调用 java.lang.Class 类中的 forName() 方法时,需要将要实例化的类的全称(比如 com.mxl.package.Student)作为参数传递过去,然后再调用 java.lang.Class 类对象的 newInstance() 方法创建对象。
5.1.3 调用对象的 clone() 方法
在程序开发中,有时可能好会遇到下列情况:已经存在一个对象A,现在需要一个与对象A完全相同的B对象,并对B对象的值进行修改,但是A对象的原有的属性值不能改变。这时,如果使用java提供的对象赋值语句,当修改B对象值后,A对象的值也会被修改。那么应该如何实现创建一个和对象A完全相同的对象B,而且修改对象B时,对象A的属性值不被改变呢?
1
public class Test1 {
public static void main(String[] args)
{
//业务,我创建一个Student s1 我想用一下s2 其中默认就有s1的值5
Student s1 = new Student();
s1.setId(1);
s1.setName("张三"); //定义s2
Student s2 = s1;
//打印他们的内存地址 == 相同的内存地址
System.out.println("s1:"+s1);
System.out.println("s2:"+s2.getName());
//改变一下s2的ID值
s2.setId(2);
//输出一下s1的id
System.out.println(s1.getId());
//总结:因为s2引用的是s1 地址相同,所以s2改变s1跟随改变}
要实现这一功能,可以使用Object类中的clone方法。clone方法可以完成对象的克隆实现Cloneable
package com.qst.test;
public class Student implements Cloneable{
private String name;
public Student() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Student(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student{"
"name='" + name + '\''+
'}';
}
@Override
protected Student clone() throws CloneNotSupportedException {
Student o = (Student)super.clone();
return o;
}
}
测试方法
package com.qst.test;
import java.sql.SQLOutput
public class Ts01 {
public static void main(String[] args) throws Exception {
Student s1 = new Student("张三");
System.out.println("克隆前:"+s1);
//克隆
Student s2 = s1.clone();
System.out.println("克隆后:"+s2);
//给s2定义新的数据
s2.setName("李四");
System.out.println("克隆更改s2数据:"+s2);
System.out.println("重新打印s1:"+s1);
}
}
5.1.4 调用 java.io.ObjectlnputStream 对象的 readObject() 方法
使用流去创建对象,这里不做具体详解,以上三种常见的创建方式,需要大家牢牢记住,这种方法了解了解即可。
5.2 隐含创建
除了显式创建对象以外,在 Java 程序中还可以隐含地创建对象,例如下面几种情况。
5.2.1 变量定义
String strName = “strValue”,其中的“strValue”就是一个 String 对象,由 Java 虚拟机隐含地创建。
5.2.2 字符串的“+”运算符运算的结果为一个新的 String 对象
String str1 = "Hello";
String str2 = "Java";
String str3 = str1+str2; // str3引用一个新的String对象
5.2.3 当 Java 虚拟机加载一个类时,会隐含地创建描述这个类的 Class 实例
va 程序中还可以隐含地创建对象,例如下面几种情况。
5.2.1 变量定义
String strName = “strValue”,其中的“strValue”就是一个 String 对象,由 Java 虚拟机隐含地创建。
5.2.2 字符串的“+”运算符运算的结果为一个新的 String 对象
String str1 = "Hello";
String str2 = "Java";
String str3 = str1+str2; // str3引用一个新的String对象
5.2.3 当 Java 虚拟机加载一个类时,会隐含地创建描述这个类的 Class 实例
类的加载是指把类的 .class 文件中的二进制数据读入内存中,把它存放在运行时数据区的方法区内,然后在堆区创建一个 java.lang.Class 对象,用来封装类在方法区内的数据结构。