`
2277259257
  • 浏览: 515348 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

JAVA创建对象-----四种方式

    博客分类:
  • java
 
阅读更多

Class对象的生成方式

1.Class.forName("类名字符串")  (注意:类名字符串必须是全称,包名+类名)

2.类名.class

3.实例对象.getClass()

 

Class.forName、实例对象.class(属性)、实例对象getClass()的区别:

1)Class cl=A.class; JVM将使用类A的类装载器,将类A装入内存(前提是:A还没有装入内存),不对类A做类的初始化工作.返回类AClass的对象

2)Class cl=对象引用o.getClass();返回引用o运行时真正所指的对象(因为:儿子对象的引用可能会赋给父对象的引用变量中)所属的类的Class的对象 

3)Class.forName("类名"); JAVA人都知道.装入类A,并做类的初始化

 

 附:

JVM的角度看,我们使用关键字new创建一个类的时候,这个类可以没有被加载。但是使用Class对象的newInstance()方法的时候,就必须保证:1、这个 类已经加载;2、这个类已经连接了。而完成上面两个步骤的正是Class的静态方法forName()所完成的,这个静态方法调用了启动类加载器,即加载 java API的那个加载器。 

现在可以看出,Class对象的newInstance()(这种用法和Java中的工厂模式有着异曲同工之妙)实际上是把new这个方式分解为两步,即首先调用Class加载方法加载某个类,然后实例化。 这样分步的好处是显而易见的。我们可以在调用class的静态加载方法forName时获得更好的灵活性,提供给了一种降耦的手段。 

最后用最简单的描述来区分new关键字和newInstance()方法的区别: 
newInstance: 弱类型。低效率。只能调用无参构造。 
new: 强类型。相对高效。能调用任何public构造。

 

 

 


 实例对象的创建四种方式
public class CreateObj implements Cloneable,Serializable{
    private static String filename = CreateObj.class.getResource("").getPath()+ "/obj.txt";
    static File file = new File(filename);
    static {
        if (!file.exists())
            try {
                file.createNewFile();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

    }

    public static void main(String[] args) throws Exception {
        // 1.第一种常用方式    (用new语句创建对象)
        CreateObj s1 = new CreateObj();
        System.out.println(s1);
        // 2.第二种方式 静态方式 java.lang.InstantiationException   (运用反射手段)
        CreateObj s2 = (CreateObj) Class.forName( "com.newland.commons.collectionutil.CreateObj").newInstance();
        System.out.println(s2);
        //第三种方式 用对象流来实现 前提是对象必须实现 Serializable  (运用反序列化手段)
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(
                new FileOutputStream(filename));
        objectOutputStream.writeObject(s2);
        ObjectInput input=new ObjectInputStream(new FileInputStream(filename));
        CreateObj s3 = (CreateObj) input.readObject();
        System.out.println(s3);
        //第四种 必须 实现Cloneable接口 否则抛出CloneNotSupportedException(调用对象的clone()方法)
        CreateObj obj=new CreateObj();
        CreateObj s4= (CreateObj) obj.clone();
        System.out.println(s4);
    }
}

 

 

Class对象和实例对象的区别与联系:

 任何 Java 的类或接口都是 Class 类的一个实例,反射就是 Java 自我管理这些(类、对象)的机制

 

Class对象的作用(应用):

 1、可以通过反射机制发现对象的类型,发现类型的方法/属性/构造器

   Class  cls =obj.getClass();

   Field[] fields =cls.getDeclaredFields();    //获取该类的所有属性

   for(Field  field : fields){

           field.getType();       //属性类型

           field.getName();     //属性名称

   }

  Method[]  methods = cls.getDeclaredMethods();//获取该类的所有方法

  for(Method  method : methods){

           method.getReturnType();    //方法类型

           method.getName();             //方法名称

  }

  Constructor[]  constructors = cls.getDeclaredConstructors();//获取该类的所有构造器

  for(Constructor  constructor : constructors){

           constructor .getName();             //构造器名称

  }

2、可以创建对象并访问任意对象方法和属性等

      Class<Date> date=Class.forName("类文件名");  //加载指定的类文件,获得一个Class对象

      Date d=date.newInstance();                                 //由Class对象获得一个新实例对象(默认调用类的无参构造器)

      

public  Object  getFieldValue(Object  obj , String  fieldname){

      Class  cls = obj.getClass();                                //反射出类型

      Field  field = cls.getDeclaredField(fieldname);  //反射出类型属性

      Object  val =field.get(obj);                                 //在对象obj上读取field属性的值

      return  val;

}

 

在对象obj上调用方法签名是(method ,paramTypes)的方法,params是传递的参数,有方法返回,无返回null

public  Object  getMethod(Object  obj , String  method , Class[] paramTypes , Object[] params){

      Class  cls = obj.getClass();                                                       //反射出类型

      Method  m= cls.getDeclaredMethod(method , paramTypes);  //反射出类型方法

      Object  val =m.invoke(obj , params);                                       //在对象obj上调用方法m,传递参数类别params

      return  val;

}

 

分享到:
评论

相关推荐

    JAVA创建对象的四种方法

    -java 创建对象的四种方法是指在 Java 中创建对象的不同方式,它们分别是使用 new 语句创建对象、使用反射机制创建对象、使用 clone() 方法创建对象和使用反序列化机制创建对象。 - 使用 new 语句创建对象是 Java ...

    mysql-connector-java-5.1.5-bin.jar mysql-connector-java-5.1.40-bin

    4. 通过Connection对象创建Statement或PreparedStatement对象,用于执行SQL查询和操作。 5. 执行SQL语句,获取ResultSet,处理查询结果。 6. 最后,关闭所有的资源,包括ResultSet、Statement和Connection,以释放...

    mysql-connector-java-5.1.7-bin.jar

    在编程中,我们通常会创建一个`Connection`对象,然后创建一个`Statement`或`PreparedStatement`对象来执行SQL查询。例如: ```java import java.sql.*; public class MySQLDemo { public static void main...

    mysql-connector-java-5.1.45-bin.jar

    JDBC是Java平台中用于与各种数据库交互的一组API,它为开发人员提供了一种统一的方式来访问数据库,无论数据库系统是什么。 MySQL Connector/J的工作原理主要包括以下步骤: 1. **加载驱动**:在Java代码中通过`...

    java mysql jar包mysql-connector-java-5.0.8-bin.zip

    这可以通过多种方式实现,如在IDE(如Eclipse或IntelliJ IDEA)中配置构建路径,或者在运行Java应用时使用`-cp`或`-classpath`命令行选项指定。当Java虚拟机(JVM)运行时,它会查找这个jar包中的类来建立到MySQL...

    mysql-connector-java-5.1.44-bin.jar 包

    使用`mysql-connector-java-5.1.44-bin.jar`,Java开发者可以创建`java.sql.Connection`对象来连接MySQL数据库。首先需要在代码中引入驱动,然后通过`DriverManager.getConnection()`方法建立连接: ```java import...

    mysql-connector-java-5.1.39-bin.jar

    首先,JDBC是Java平台的标准API,由Sun Microsystems(现已被Oracle收购)开发,它提供了一种标准化的方式来访问各种类型的数据库。JDBC驱动是数据库供应商提供的中间件,它实现了JDBC API,使得Java程序能够与特定...

    mysql-connector-java-gpl-5.1.36

    MySQL Connector/J是MySQL数据库系统与Java应用程序之间的桥梁,它是一个实现了Java Database Connectivity (JDBC) API的驱动程序,使得Java开发者能够方便地在Java应用程序中访问MySQL数据库。"mysql-connector-...

    java-unrar-0.3.jar以及commons-logging-1.1.1.jar

    - 创建RAR档案对象,例如:`Archive archive = Archive.getArchiveInstance(new File("path_to_rar_file.rar"));` - 使用archive对象提供的方法进行解压、遍历等操作,如`archive.getVolumeFileList();`获取文件...

    mysql驱动包 mysql-connector-java-5.1.7-bin.jar

    它为Java程序员提供了统一的数据库访问方式,屏蔽了不同数据库系统之间的差异。 2. JDBC URL:JDBC URL是JDBC驱动程序用来定位和连接到特定数据库的关键信息。其格式通常为`jdbc:子协议:子名称[;属性=值]...`,例如...

    mysql-connector-java-5.1.37-jar

    它是MySQL官方推荐的用于Java应用的JDBC驱动,支持标准的JDBC接口,如Connection、Statement、PreparedStatement、ResultSet等,使得开发人员无需关注底层数据库操作细节,而是通过面向对象的方式进行数据库交互。...

    mysql-connector-java-5.1.37-bin.jar

    3. 执行 SQL:通过 `Connection` 对象的 `createStatement()` 或 `prepareStatement()` 方法创建 `Statement` 或 `PreparedStatement` 对象,然后调用它们的 `executeQuery()` 或 `executeUpdate()` 方法执行 SQL。...

    java基础教程----精华版

    Java是一种广泛使用的面向对象的编程语言,以其平台独立性、安全性、健壮性和高性能而闻名。这个"java基础教程----精华版"显然是一份精心整理的资料,旨在帮助初学者快速掌握Java编程的基础知识。下面将详细介绍Java...

    java源码包---java 源码 大量 实例

    6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用...

    mysql-connector-java-5.1.40.zip和mysql-connector-java-5.1.10.jar

    2. **创建Statement或PreparedStatement**:连接建立后,可以创建Statement对象用于执行静态SQL语句,或者PreparedStatement对象用于预编译和执行参数化的SQL语句。 3. **执行SQL操作**:通过Statement或...

    mysql连接包mysql-connector-java-5.1.27.jar

    1. **JDBC API**:这是Java访问数据库的标准接口,提供了多种类和接口,如`java.sql.DriverManager`,`java.sql.Connection`,`java.sql.Statement`,`java.sql.ResultSet`等,它们使得开发人员能够创建数据库连接,...

    mysql-connector-java-5.1.23-bin.zip

    MySQL Connector/J是MySQL数据库与Java应用程序之间的重要桥梁,它是一个实现了Java Database Connectivity (JDBC) API的驱动程序,使得Java开发者能够方便地在MySQL数据库上执行CRUD(创建、读取、更新、删除)操作...

    Java面向对象程序设计

    - **构造器**:用于初始化新创建对象的特殊方法。 5. **第5章:继承与接口** - **继承**:子类继承父类的属性和方法,实现代码重用和多态性。 - **访问修饰符**:public, protected, default, private,它们决定...

    java 游戏源码-----模拟钢琴

    "Java 游戏源码-----模拟钢琴"是一个项目,它提供了一种独特的学习体验,让你能够深入理解如何使用Java语言来创建互动性的游戏应用。这个源码实现了一个模拟钢琴,允许用户在虚拟键盘上弹奏音乐,体验接近真实钢琴的...

Global site tag (gtag.js) - Google Analytics