抽象类可以称为一个模板,定义以后所有该基类的子类的最基本特征,就像定义什么叫动物,什么叫植物,所以有些属性和方法是固有的,可以在抽象类中先定义好,就像之前学过的继承一样,把某些很有用的东西传承下去;但还有些东西是不能确定的,比如,这种动物吃什么等,都还是不能确定,但是这又是其固有的和方法,这时候我们可以用关键字 abstract 将其定义为抽象方法,等待它们的子类去实现,而其子类一定要实现这些抽象方法,不然不能被创建实例,依旧是属于抽象类。抽象类适用于很强的父子关系。
- 抽象类可以没有抽象方法,但有抽象方法的类一定属于抽象类;
- 抽象类中一旦定义了构造方法,实类必须显示覆盖它的构造方法,哪怕只是super();
- 抽象类的抽象方法没有方法体,所以不能出现{}; 写法需如同:public abstract void eat();
- 抽象类可以有变量和非抽象方法;
接口不同于抽象类,接口没有很强的父子关系,更多只是用来描述某些类继承该接口后都会执行某种动作,如植物类和动物类都继承了一个进食接口,这只表明了植物和动物都具有相同的进食动作;
- 接口内都是常量和抽象方法,默认修饰符为 public static final 和 public abstract ,可加可不加;
- 接口可以继承别的接口,且可以为多个;
- 只能继承单一类,但是可以继承多个接口;
关于 java.lang.Cloneable 这一接口,其内部不实现任何方法,只是作为一个标识接口,继承这一接口的类可通过.clone()进行复制,二者是指向了不同的对象,但注意,当对这一对象内部的其中一个属性引用了一个对象,克隆这一动作也仅仅是复制了它的引用,并没有将内容进行复制,只能称这样的克隆动作为浅克隆,深克隆的实现可以自己重写.clone()方法;
以下代码演示了深克隆与浅克隆:实现深克隆时需使复制内容中的所有对象都实现了 Serializable 接口,通过流来读取内容并保存到另一个对象中。
public class C implements Serializable{ public int a = 1; public C(int ab){ this.a = ab; } }
public class entity implements Serializable,Cloneable{ public C c = new C(1); public Object deepClone() throws IOException,ClassNotFoundException { ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(this); //从流里读回来 ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bis); return ois.readObject(); } public Object clone() { Object o = null; try { o = super.clone(); } catch (CloneNotSupportedException e) { // TODO Auto-generated catch block e.printStackTrace(); } return o; } }
1 public class entityText{ 2 3 public static void main(String[] args){ 4 entity e = new entity(); 5 try { 6 entity e1 = (entity) e.clone(); 7 entity e2 = (entity) e.deepClone(); 8 e.c.a = 2; 9 System.out.println(e1.c.a); 10 System.out.println(e2.c.a); 11 } catch (IOException e) { 12 // TODO Auto-generated catch block 13 e.printStackTrace(); 14 } catch (ClassNotFoundException e) { 15 // TODO Auto-generated catch block 16 e.printStackTrace(); 17 } 18 19 } 20 }
时间: 2024-10-23 23:08:13