Java之三种显示对象创建方式

内容来自孙卫琴的《Java面向对象编程》,做了小的修改
  • Java中有四种显示地创建对象的方式
  • 1. 使用new语句创建
    2. 运用反射手段,调用Class或者Constructor类的newInstance()方法
    3. 调用对象的clone()方法
    4. 运用反序列化手段

  • 以下例子使用前三种方式创建,Customer是我们的测试类,clone方法调用了Object类的clone方法
  • package com.perficient.basic;
    
    public class Customer implements Cloneable{
    	private String name;
    	private int age;
    
    	public Customer() {
    		this("unknown", 0);
    		System.out.println("Call the defalut constructor");
    	}
    	
    	public Customer(String name, int age) {
    		this.name = name;
    		this.age = age;
    		System.out.println("Call the second constructor");
    	}
    	
    	public Object clone()throws CloneNotSupportedException{
    		return super.clone();
    	}
    	
    	public boolean equals(Object o){
    		boolean result=false;
    		if (this == o) result = true;
    		if (!(o instanceof Customer)) result = false;
    		
    		final Customer other = (Customer)o;
    		if (this.name.equals(other.name)&& (this.age == other.age)){
    			result = true;
    		} else {
    			result = false;
    		}
    				
    		return result;
    	}
    	
    	public String toString(){
    		return "Name=" + this.name + ",age=" + this.age;
    	}
    }
    

  • 以下是用来测试的main方法:
  • public static void main(String[] args) throws Exception{
    		// 运用反射创建对象
    		Class<?> objClass = Class.forName("com.perficient.basic.Customer");
    		Customer c1 =(Customer)objClass.newInstance();      // 会调用类的默认构造方法
    		System.out.println("c1:" + c1.toString());
    		System.out.println("+++++++++++++++++++++++");
    		
    		// 使用New语句
    		Customer c2 = new Customer("James", 20);
    		System.out.println("c2:" + c2.toString());
    		System.out.println("+++++++++++++++++++++++");
    		
    		// 用clone方法创建
    		Customer c3 = (Customer) c2.clone();
    		System.out.println("c2==c3: " + (c2 == c3));
    		System.out.println("c2.equals(c3): " + (c2.equals(c3)));
    		System.out.println("c3:" + c3.toString());
    		System.out.println("+++++++++++++++++++++++");
    	}
    
    

  • 输出结果:
  • Call the second constructor
    Call the defalut constructor
    c1:Name=unknown,age=0
    +++++++++++++++++++++++
    Call the second constructor
    c2:Name=James,age=20
    +++++++++++++++++++++++
    c2==c3: false
    c2.equals(c3): true
    c3:Name=James,age=20
    


  • 总结
  • 1.使用new语句以及newInstance()方法创建对象时,都会执行测试类的构造方法.
    2.使用clone方法的时候不会调用构造方法
    3.使用clone方法会创建一个复制的对象,这个对象与原来的对象具有不同的内存地址.所以使用==判断的时候,返回false

    你可能感兴趣的:(java,编程)