java基础之接口与抽象类的区别
抽象类,包含一个抽象方法的类就是抽象类。什么是抽象方法呢?声明而未被实现的方法,抽象方法必须用abstract关键字,抽象类不能直接实例化,都是通过它的子类,即继承抽象类的类来实例化的,而且子类必须重写抽象类中的所有抽象方法。
接口,接口的关键字是interface,
接口中的成员变量必须是静态的,而且必须是被初始化的,接口中的方法必须全部为abstract,即全为抽象方法。
一个抽象类在android中的简单应用:在实现多布局RecyclerView的时候,holde类,里面要重写绑定数据的方法bindHolder而且几种布局,要实现几次。
第一个布局代码:
public class TypeOneViewholder extends TypeAbstractViewholder { private TextView aname; private ImageView avatar; //初始化中找到控件等 public TypeOneViewholder(View itemView) { super(itemView); aname = (TextView) itemView.findViewById(R.id.name1); avatar = (ImageView) itemView.findViewById(R.id.avator1); } //绑定数据,将ViewHoler的数据和Datemodle绑定起来 public void bindHolder(Datemodle datemodle) { aname.setText(datemodle.name); avatar.setBackgroundResource(datemodle.avaotorcolor); }第二个布局的代码:
public class TypeTwoViewholder extends TypeAbstractViewholder { private TextView aname; private ImageView avatar; private TextView content; //初始化中找到控件等 public TypeTwoViewholder(View itemView) { super(itemView); aname = (TextView) itemView.findViewById(R.id.name2); avatar = (ImageView) itemView.findViewById(R.id.avator2); content = (TextView) itemView.findViewById(R.id.content2); } //绑定数据,将ViewHoler的数据和Datemodle绑定起来 @Override public void bindHolder(Datemodle datemodle) { aname.setText(datemodle.name); avatar.setBackgroundResource(datemodle.avaotorcolor); content.setText(datemodle.content); }在这里我们就用到了抽象类。将这个bindHolder方法拿出来,代码如下:
public abstract class TypeAbstractViewholder extends RecyclerView.ViewHolder{ public TypeAbstractViewholder(View itemView) { super(itemView); } public abstract void bindHolder(Datemodle datemodle); }像这种我们确定了每一个都需要调用哪个方法,就要把方法设置为abstract类型,但是对于不知道方法要使用几次,有点不需要的时候,抽象类中的这个方法可以不用设置为抽象方法。上面使用了抽象类后,可以在使用的时候
((TypeAbstractViewholder) (holder)).bindHolder(mDates.get(position));这样就不需要每一个类重新声明一下,一个抽象类就都解决了。
再说明一点:
1、抽象类中的非抽象方法不用重写,其他必须重写,接口的方法必须重写。
3、在抽象类这块,还有一种新的机制。IOC机制,控制反转,用法是在父类中定义一个抽象方法,子类中进行实现,父类中调用子类的实现,Android中好多会用到,例如Button的点击事件。