抽象类
关键字:abstract
注意:不能有static修饰
接口
关键字:interface
用于解决不能多重继承的问题
注意:接口修饰符只能是默认的或public的
接口中的变量自动设置为static public final的。
接口定义的方法都是抽象的,自动设置为public的。
接口实现:implements 一个类可以实现多个接口
比较
一个类可以实现多个接口,但是只能继承一个抽象类。
抽象类可以有非抽象的方法,而接口中定义的方法必须全是抽象方法。
在抽象类中定义的方法,他们的修饰符可以是public、protected、private,也可以是默认值,但是在接口中所有的方法必须是public.
抽象类可以有构造函数,接口不能。两者都不能实例化,但是都能通过他们来存放子类对象或者是实现类的对象。可以说他们都可以实现多态。
克隆
clone( ) 需实现Cloneable接口
package com.mypackage.interfaced;
public class Human implements Cloneable{
String name;
String sex;
int age;
Human(){}
Human(String name,String sex,int age){
this.name = name;
this.sex = sex;
this.age = age;
}
void work(){}
void eat(){}
@Override
protected Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
Human h = null;
try{
h = (Human)super.clone();
}
catch(CloneNotSupportedException e){
e.printStackTrace();
}
return h;
}
}
public class Human implements Cloneable{
String name;
String sex;
int age;
Human(){}
Human(String name,String sex,int age){
this.name = name;
this.sex = sex;
this.age = age;
}
void work(){}
void eat(){}
@Override
protected Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
Human h = null;
try{
h = (Human)super.clone();
}
catch(CloneNotSupportedException e){
e.printStackTrace();
}
return h;
}
}
Human zhangyu = new Human("zhangyu","nv",24);
Human lala = (Human)zhangyu.clone();
lala.name = "lala";
System.out.println("lala:"+lala.name);
System.out.println("zhangyu:"+zhangyu.name);
Human lala = (Human)zhangyu.clone();
lala.name = "lala";
System.out.println("lala:"+lala.name);
System.out.println("zhangyu:"+zhangyu.name);
但是这样只是完成了浅拷贝,对于可变对象变量,他只能获得对象的地址,原对象和克隆得到的对象仍然包含的可变对象仍指向同一个对象,所以改变其中一个对象仍会改变另一个。但是String虽然作为对象出现,但是由于他的不可变性,所以在克隆中String不会产生问题。解决方法是对该对象变量也实现克隆。