日期:2014-05-20  浏览次数:20726 次

话说JAVA之创建对象
创建对象,在面向对象的程序设计里最基本的语句.都来说说如何创建对象,有哪些方式...>?
  我先来说几种:
  1. 构造器. 默认情况下,如果你不去编写构造器,JAVA类都会调用默认无参的构造器.构造器在传递参数时,一般以1-2个居多,超过4个参数的在API中很少见.相信这也是用的最多的创建对象的方法.但在需要参数太多时并不推荐.
  2. 静态工厂方法. 利用静态工厂方法来创建对象,获得实例也是一种方法.这种方法尤其在单例模式中用到.使用静态工厂发放创建对象好处很多,例如通过名称可以知道确切含义,可以重复利用创建好的对象等.该方法在包装类型中比较多,如其中的valueOf()方法.实际应用中,我用的还是比较少.
  3. 构建器模式. 当一个类有很多成员属性时,如何更好的创建对象,上述两种方式就不是那么的容易了.特别是其中有些属性可选的情况下,此时构建器不失为一种好的创建对象方法.这中创建对象的方式,相信经常用的更少.
  以上是我的总结,还有其他情况,欢迎大家讨论.
  另附构件器模式创建对象示例:
Java code

/**
 * @author HUHG
 * 2009-07-29 11:37
 */
public class Nutrition {
    private final int servingSize;
    private final int servings;
    
    //option
    private final int calories;
    private final int fat;
    private final int sodium;
    //...  more
    
    public static class Builder {
        private int servingSize;
        private int servings;
        
        //option
        private int calories= 0;
        private int fat= 0;
        private int sodium= 0;
        //... more
        
        public Builder(int servingSize, int servings){
            this.servingSize= servingSize;
            this.servings= servings;
        }
        
        public Builder calories(int value){
            calories= value;
            
            return this;
        }
        
        public Builder fat(int value){
            fat= value;
            
            return this;
        }
        
        public Builder sodium(int value){
            sodium= value;
            
            return this;
        }
        
        //... more
        
        public Nutrition build(){
            return new Nutrition(this);
        }
    }
    
    private Nutrition(Builder builder){
        servingSize= builder.servingSize;
        servings= builder.servings;
        
        calories= builder.calories;
        fat= builder.fat;
        sodium= builder.sodium;
        //... more
    }

    /**
     * @param args
     */
    public static void main(String[] args){
        Nutrition object= new Nutrition.Builder(100, 10).calories(20).fat(5).build();
        //... use it
    }

}



------解决方案--------------------
1.使用new操作符
2.调用Class或java.lang.reflect.Constructor对象的newInstance()方法
3.调用现有对象的clone()方法
4.通过java.io.ObjectInputStream类的getObject()方法反序列化。
5.如果字符串对象不是编译时常量,会创建一个隐含的StringBuffer对象处理
6.每个类在被装载时都会创建一个Class对象来代表它的类型
.....
就知道这些了
------解决方案--------------------
楼主的方法都是用了new
反射与clone应该是另外的两种
------解决方案--------------------
哦,还有序列化