抽象类需要注意的几个点
抽象方法不能包含在非抽象类里,如果抽象父类的子类不能实现所有的抽象方法,那么子类也要声明为抽象类
抽象类是不能用new 操作符来初始化的,但是仍然可以定义它的构造方法,这个构造方法在它的子类的构造方法中调用
包含抽象对象的类必须是抽象的
子类的父类是具体的,这个子类也可以是抽象的
子类可以覆盖父类的方法并将它定义为抽象的
抽象类虽然不能new,但是可以作为一种数据类型
今天翻书的时候还看了clone这个知识点,顺便贴下总结和代码及运行结果
克隆,需要注意克隆的是内容相同的对象但不相等。域对象数据被克隆,但是它们可以相等,比较克隆对象内容是否相等需要重写equal方法
如果要想一个对象可以被克隆,那么它必须实现Cloneable接口
package 接口与抽象类;
public class testClone {
public static void main(String[] args) throws CloneNotSupportedException {
Mike mike = new Mike();
mike.setName("mike");
mike.setAge("21");
mike.setCar(new Car("AJ",2000));
Mike mike2 = (Mike)mike.clone();
System.out.println(mike2==mike);
System.out.println(mike2.equals(mike));
System.out.println(mike2.getCar()==mike.getCar());
System.out.println(mike);
System.out.println(mike2);
}
}
package 接口与抽象类;
public class Mike implements Cloneable{
private String name;
private String age;
private Car car;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public Car getCar() {
return car;
}
public void setCar(Car car) {
this.car = car;
}
@Override
protected Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
return super.clone();
}
public Mike(String name, String age, Car car) {
super();
this.name = name;
this.age = age;
this.car = car;
}
public Mike(){}
@Override
public String toString() {
return "Mike [name=" + name + ", age=" + age + ", car=" + car + "]";
}
//重写equals方法,因为我们要对比的是Mike类中的值而不是对象的引用地址
//如果传递的是Object类的话,我们就需要重写hashCode()方法,这样就比较麻烦
public boolean equals(Mike obj) {
if(this.getAge().equals(obj.getAge())&&this.getName().equals(obj.getName())&&this.getCar()==obj.getCar())
return true;
return false;
}
}
最后说一下接口和抽象类的一点简单区别
接口和抽象类的区别
在变量方面,抽象类对变量没有什么特别的要求,但是接口要求所有的变量必须是public static final 且所有的方法必须是公共的抽象的实例方法
PS:java只允许为类的扩展做单一继承,但是允许使用接口做多重扩展
最后看到一个包装类,简单提一下!
每一个数值包装类都是有抽象类Number扩展而来的