一、构造函数java
一般用来在对象实例化时初始化对象的成员变量。函数
1)构造函数必须与类的名字相同,而且不能有返回值(也不能返回void)this
2)每一个类都有一个默认的无参构造函数,修饰符只与所在的class有关(类为class,构造函数也是class)。一个类能够有多个构造函数,构造函数能够有n个参数,便可以被重载。spa
3)构造函数伴随着new一个类的时候一块儿调用。指针
4)构造函数不能被继承,所以不能被覆盖。code
二、接口对象
因为Java不支持多重继承,为了克服单继承的缺点,引入了接口,能够实现多个接口的方式间接达到多重继承的目的。继承
接口中成员的做用域修饰符都是public,常量值默认使用public static final修饰。接口中只包含方法的定义不包括方法的实现。接口
Java语言中有些接口内部并无声明任何方法,此种接口又叫标识接口,仅有标识做用相似汽车的标志图标,人们看到图标就知道是哪款车,目前Java类库中存在的标识接口有Cloneable,Serializable等。作用域
三、clone()
protected Object clone()
throws CloneNotSupportedException
继承自Object的clone()方法返回Object对象的新对象,不是引用。
深复制和浅复制:
浅复制:不复制对象的引用,即对象的引用仍指向原来的值,如b复制a,则a,b仍指向同一个存储空间,改变其中一个的值另外一个也会跟着改变。
深复制:在对对象调用clone()完成复制后,对对象中非基本类型的方法等clone().如Obje.java中对getBirth()进行clone()。
浅复制:
package Four; class Obj implements Cloneable{ private int aInt = 0; public int getInt(){ return aInt; } public void changeInt(){ this.aInt = 1; } public Object clone(){ Object o = null; try{ o = (Object)super.clone(); }catch(CloneNotSupportedException e){ e.printStackTrace(); } return o; } } public class CloneTest { public static void main(String[] args){ Obj a = new Obj(); //Creates and return a copy of this Object Obj b = (Obj)a.clone();//如果 Obj b = a;则changeInt()不会改变aInt的值,此时b是a的引用 Obj c = a; b.changeInt(); System.out.println("a: "+a.getInt()); System.out.println("b: " + b.getInt()); System.out.println("c: " + c.getInt()); } }/* a: 0 b: 1 c: 0*/
深复制:
package Four; //深复制 import java.util.Calendar; class Obje implements Cloneable{ Calendar date = Calendar.getInstance();//类中包含对象(即非基本类型,须要深度复制) public Calendar getBirth(){ return date; } public void setBirth(Calendar date){ this.date = date; } public void changeDate(){ // Calendar.set(Calendar.MONTH, int month). this.date.set(Calendar.MONTH, 5); } public Object clone(){ Obje obj = null; try { obj = (Obje)super.clone(); } catch (CloneNotSupportedException e) { // TODO Auto-generated catch block e.printStackTrace(); } obj.date = (Calendar)this.getBirth().clone();//深复制 return obj; } } public class DeepClone { public static void main(String[] args){ Obje a = new Obje(); Obje b = (Obje)a.clone(); b.changeDate(); System.out.println("a = "+a.getBirth()); System.out.println("b = " + b.getBirth()); } } /*若是不对getBirth()进行clone()则输出a,b的Month都改变,输出5,深复制后只有b的Month改变了*/
四、反射机制(待补充)
Java语言一个很是重要的特性,容许程序在运行时进行自我检查,同时对内部成员进行操做,可以实如今运行时对类进行装载。
反射机制的功能主要有:获得一个对象所属的类:实例.getClass();获取一个类的全部成员变量和方法;在运行时建立对象;在运行时调用对象的方法。
3种方法获取到class类:
1)class.forName("Test");//建立一个类的引用
2)类名.class;//每一个类都有一个Class对象,每当编写并编译了一个新类,就会产生一个Class对象(保存在一个.class文件中)
3)实例.getClass()
Java中4种建立对象的方法:
1)new语句
2)反射机制
Class c = Class.forName("Test"); Base b = (Base)c.newInstance();
3)clone()
Obje b = (Obje)a.clone();
4)反序列化
五、回调函数
利用接口与类实现实现相似指针的效果:定义一个接口,在接口中声明要调用的方法,接着实现这个接口,最后把实现接口类的对象做为参数传递给调用程序,调用程序经过参数来调用指定的函数,从而实现接口回调。