java基础之接口与抽象类的区别

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、抽象类中的非抽象方法不用重写,其他必须重写,接口的方法必须重写。
2、 接口和抽象类中只有方法名,没有定义的,如果你不定义 也就是空方法,接口就是为了弥补java不能 多重继承 ,接口针对的是对象而不是实现。实现的部分可以交由对象去实现。这就是java中的多态啊。
3、在抽象类这块,还有一种新的机制。IOC机制,控制反转,用法是在父类中定义一个抽象方法,子类中进行实现,父类中调用子类的实现,Android中好多会用到,例如Button的点击事件。

你可能感兴趣的:(java基础,java基础,抽象类使用,抽象类,接口,抽象类接口区别)