Java中创建对象的四种方法 收藏Java中创建对象的四种方式
1.用new语句创建对象,这是最常见的创建对象的方法。
2.运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。
3.调用对象的clone()方法。
4.运用反序列化手段,调用java.io.ObjectInputStream对象的 readObject()方法。
第一种最常见
使用new关键字:这是我们最常见的也是最简单的创建对象的方式,通过这种方式我们还可以调用任意的够赞函数(无参的和有参的)。比如:Student student = new Student();
使用Class类的newInstance方法:我们也可以使用Class类的newInstance方法创建对象,这个newInstance方法调用无参的构造器创建对象,如:Student student2 = (Student)Class.forName("根路径.Student").newInstance(); 或者:Student stu = Student.class.newInstance();
使用Constructor类的newInstance方法:本方法和Class类的newInstance方法很像,java.lang.relect.Constructor类里也有一个newInstance方法可以创建对象。我们可以通过这个newInstance方法调用有参数的和私有的构造函数。如: Constructor<Student> constructor = Student.class.getInstance(); Student stu = constructor.newInstance(); 这两种newInstance的方法就是大家所说的反射,事实上Class的newInstance方法内部调用Constructor的newInstance方法。这也是众多框架Spring、Hibernate、Struts等使用后者的原因。
使用Clone的方法:无论何时我们调用一个对象的clone方法,JVM就会创建一个新的对象,将前面的对象的内容全部拷贝进去,用clone方法创建对象并不会调用任何构造函数。要使用clone方法,我们必须先实现Cloneable接口并实现其定义的clone方法。如:Student stu2 = <Student>stu.clone();这也是原型模式的应用。
使用反序列化:当我们序列化和反序列化一个对象,JVM会给我们创建一个单独的对象,在反序列化时,JVM创建对象并不会调用任何构造函数。为了反序列化一个对象,我们需要让我们的类实现Serializable接口。如:ObjectInputStream in = new ObjectInputStream (new FileInputStream("data.obj")); Student stu3 = (Student)in.readObject();
我大一的时候学过一学期的C,时间有点久了只能记住一点点。印象最深刻的就是开头那个include。。.
说回来Java和C其实代码风格是很相似的。什么面向过程什么面向对象,说起来很绕,甚至我刚工作时还是很迷糊,但是工作一段时间就能明白了。
java中的对象可以理解为数据存储对象,比如说数据库里有个person表,对应的实体类一定要有一个person类,这个类里一般会有一些简单属性name,sex之类的。这些是每一个person都会有的,书上往往都会说“把大千世界看成一个个的对象”,这样太绕你读不懂就理解为数据库person的每行都有name,sex字段。
至于方法,就是为person编写的业务程序。你的代码需要person有一个听的功能,你就定义一个 void say(),如果这个person什么都不用做,那就没有方法。
在学习反射机制时,总结一下获得类对象方式:
第一种方式:通过类本身来获得对象
Java代码
Class classname =
this
.getClass();
第二种方式:通过子类的实例获取父类对象
Java代码
ClassName cn =
new
ClassName();
UserClass = cn.getClass();
Class SubUserClass = UserClass.getSuperclass();
第三种方式:通过类名加.class获取对象
Java代码
Class ForClass = **.**.ClassName.
class
;(类在包中的路径加.
class
)
第四种方式:通过类名的字符串获取对象
Java代码
Class ForName = Class.forName(
"**.**.ClassName"
);
类是对一类事物的描述。如“人”就是一个类,一个类又有很多属性和方法,如“人”有“名字”,“性别”“年龄”等属性,有“行走”,“说话”等方法。说简单点就是属性描述一个类是什么样的,而方法描述一个类能干什么。我们说创建一个类,就是写一个Java类,如
class Person{//类
String name;。.//属性
public void run(){..}//方法
}
而对象是类的一个实例,如“张三”就是“人”这个类的一个对象。我们可以通过如下语句来创建“张三”这个对象:Person zhangsan = new Person();这里用到了Person这个类的一个默认构造函数来创建zhangsan这个对象。至于setXXX,getXXX分别用来设置和获取属性XXX的值。
Object是所有类的父类,任何类都默认继承Object。Object类到底实现了哪些方法?
1.clone方法
保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出异常。
2.getClass方法
final方法,获得运行时类型。
3.toString方法
该方法用得比较多,一般子类都有覆盖。
4.finalize方法
该方法用于释放资源。因为无法确定该方法什么时候被调用,很少使用。
5.equals方法
该方法是非常重要的一个方法。一般equals和==是不一样的,但是在Object中两者是一样的。子类一般都要重写这个方法。
6.hashCode方法
该方法用于哈希查找,重写了equals方法一般都要重写hashCode方法。这个方法在一些具有哈希功能的Collection中用到。
一般必须满足obj1.equals(obj2)==true。可以推出obj1.hash-
Code()==obj2.hashCode(),但是hashCode相等不一定就满足equals。不过为了提高效率,应该尽量使上面两个条件接近等价。
7.wait方法
wait方法就是使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁。wait()方法一直等待,直到获得锁或者被中断。wait(long
timeout)设定一个超时间隔,如果在规定时间内没有获得锁就返回。
调用该方法后当前线程进入睡眠状态,直到以下事件发生。
(1)其他线程调用了该对象的notify方法。
(2)其他线程调用了该对象的notifyAll方法。
(3)其他线程调用了interrupt中断该线程。
(4)时间间隔到了。
此时该线程就可以被调度了,如果是被中断的话就抛出一个InterruptedException异常。
8.notify方法
该方法唤醒在该对象上等待的某个线程。
9.notifyAll方法
该方法唤醒在该对象上等待的所有线程。
Java中创建对象的四种方式 1.用new语句创建对象,这是最常见的创建对象的方法。
2.运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。 3.调用对象的clone()方法。
4.运用反序列化手段,调用java.io.ObjectInputStream对象的 readObject()方法。下面演示了用前面3种方式创建对象的过程:public class Customer implements Cloneable{ private String name; private int age; public Customer(){ this("unknown",0); System.out.println("call default constructor"); } public Customer(String name,int age){ this.name=name; this.age=age; System.out.println("call second constructor"); } public Object clone()throws { return super.clone(); } public boolean equals(Object o){ if(this==o)return true; if(! (o instanceof Customer)) return false; final Customer other=(Customer)o; if(this.name.equals(other.name) && this.age==other.age) return true; else return false; } public String toString(){ return "name="+name+",age="+age; } public static void main(String args[])throws Exception{//运用反射手段创建Customer对象 Class objClass=Class.forName("Customer"); Customer c1=(Customer)objClass.newInstance(); //会调用Customer类的默认构造方法 System.out.println("c1: "+c1); //打印name=unknown,age=0//用new语句创建Customer对象 Customer c2=new Customer("Tom",20); System.out.println("c2: "+c2); //打印name=tom,age=20//运用克隆手段创建Customer对象 Customer c3=(Customer)c2.clone(); //不会调用Customer类的构造方法 System.out.println("c2==c3 : "+(c2==c3)); //打印false System.out.println("c2.equals(c3) : "+c2.equals(c3)); //打印true System.out.println("c3: "+c3); //打印name=tom,age=20 } } 除了以上4种显式地创建对象的方式以外,在程序中还可以隐含地创建对象,包括以下几种情况:1.对于java命令中的每个命令行参数,Java虚拟机都会创建相应的String对象,并把它们组织到一个String数组中,再把该数组作为参数传给程序入口main(String args[])方法。
2.程序代码中的String类型的直接数对应一个String对象。3.字符串操作符“+”的运算结果为一个新的String对象。
4.当Java虚拟机加载一个类时,会隐含地创建描述这个类的Class实例.。
1. new一个对象
new ClassName();
2. 基本同上
Class.forName("className").newInstance();
3. 利用asm和cglib创建对象,不过这个对象在某些情况下有问题,比如做为hibernate对象的时候
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(ClassName);
enhancer.setCallback(NoOp.INSTANCE);
Object obj = enhancer.create();
4.克隆:clone()
声明:本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
蜀ICP备2020033479号-4 Copyright © 2016 学习鸟. 页面生成时间:2.763秒