Java面试题八:抽象类和接口的区别

0、相关文章:

文章1:简述Java中抽象类和接口,及其两者区别(1.3w阅读量,57赞,有代码)

抽象类和接口有什么区别(1.9w阅读量,13赞  以下内容参照此文 )

抽象类和接口的区别(面试题)(5000阅读量,7赞)

1、抽象类

用abstract修饰的类叫做抽象类。  

在讲抽象类之前有必要强调一下abstract修饰符:

  • abstract修饰的类为抽象类,此类不能有对象,(无法对此类进行实例化,说白了就是不能new);
  • abstract修饰的方法为抽象方法,此方法不能有方法体(就是什么内容不能有);

关于抽象类的使用特点:

  • 抽象类不能有对象,(不能用new此关键字来创建抽象类的对象);
  • 有抽象方法的类一定是抽象类,但是抽象类中不一定有抽象方法;
  • 抽象类中的抽象方法必须在子类中被重写。

同学们可能会问到:抽象类不能被“new”,抽象方法必须重写,那么定义它们做什么嘞?

       答:抽象类生来就注定它是要被继承的,如果没有任何一个类去继承它的话,那么也就失去了它的意义;抽象方法生来就是要被重写的,而且是必须重写。(只要继承了某个抽象类,就必须去重写此抽象类中含有的抽象方法)

话不多说,看代码:

public abstract class AbstractAnimal {
    public abstract void eat();

    public abstract void sleep();
}

以上代码是定义了一个叫做AbstractAnimal 的抽象类,其中含有eat()和sleep()两个抽象方法。

定义了一个animal类之后再定义一个cat类:

public class Cat extends AbstractAnimal {
    @Override
    public void eat() {
        LogUtils.e("我是猫,我吃的是猫粮呀");
    }

    @Override
    public void sleep() {
        LogUtils.e("我是猫,我比你们人类睡的时间短!");
    }
}

 此时,我再来写一个Person类:

public class Person extends AbstractAnimal {
    @Override
    public void eat() {
        LogUtils.e("我是人,我要吃大鱼大肉!");
    }

    @Override
    public void sleep() {
        LogUtils.e("我是人,每天必须睡够8个小时!");
    }
}

OK,现在类已经写完了。接下来结合以上的代码说一下抽象类的用处:

       细心地同学可以看得出,在cat和person这两个类中都含有了sleep和eat这两个方法,但是它们的方法体却不一样。重点就在这里,假设不定义AbstractAnimal 这个抽象类以用来让cat和person去继承的话,虽然也要在cat和person中定义sleep和eat这两个方法,看似代码上没有太多简化。但是这背后却隐藏着一个规范问题:也就是“是不是”的问题。cat和person都“是”AbstractAnimal ,所以就必须继承AbstractAnimal 里面的方法。相当于提供了一个大的体制。就好比人:人活着就必须要遵守国家的法律,而至于你信仰佛,还要遵守“佛法”,你信仰共产党,你还要遵守党章和党纪。那就是你自己的事情了

2、接口

 接口就是一个规范和抽象类比较相似。它只管做什么,不管怎么做。通俗的讲,借口就是某个事物对外提供的一些功能的声明,其定义和类比较相似,只不过是通过interface关键字来完成

其中重要的几个知识点:

  • 1、接口中的所有属性默认为:public static final ****;
  • 2、接口中的所有方法默认为:public abstract ****;
  • 3、接口不再像类一样用关键字 extends去“继承”,而是用 implements 去“实现”,也就是说类和接口的关系叫做实现,(例如:A类实现了B接口,那么成为A为B接口的实现类。而类与类之间的继承的话,叫做A类继承了B类,其中B类即为A类的父类)。实现接口与类的继承比较相似

具体看一下代码:

public interface Sleep {
    public static int A = 1;
    public static int B = 2;

    void isleep(int i);
}

public interface Eat {
    void ieat();
}

public interface Study {
    void istudy();
}
public class Cat2 implements Sleep,Eat {
    @Override
    public void ieat() {

    }

    @Override
    public void isleep(int i) {

    }
}
public class Person2 implements Sleep,Eat,Study {
    @Override
    public void ieat() {
        
    }

    @Override
    public void isleep(int i) {

    }

    @Override
    public void istudy() {

    }
}

以上代码定义了三个接口分别是:Study,Eat,Sleep,以及两个类分别是Cat2和Person2。其中Cat2类实现了两个接口分别是:Eat和Sleep,而Person2实现了三个接口分别是:Study,Eat,Sleep。这是为什么呢?就是因为Cat并不需要学习,而Person2需要学习,所以在Cat2类中没有实现Study这个接口,而在Person2中却是有的。那么显而易见,接口所阐述的是“有没有”的问题,而刚刚所说的抽象类阐述的是“是不是”的问题

所以也就可以列出抽象类和接口的几点区别

  • 1、抽象类描述的是“是不是”的问题,而接口描述的是“有没有”的问题;
  • 2、在Java中类的继承是“单继承”,可以“多对一”,但是不允许“一对多”。而一个类却可以同时实现多个接口;

3、Dagger2中关于接口的例子

public interface Provider<T> {
    T get();
}

public interface Factory<T> extends Provider<T> {
}


public class Student{
}

public class Student_Factory implements Factory<Student> {
    @Override
    public Student get() {
        return new Student();
    }
}
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Provider<Student> studentProvider = new Student_Factory();
        Student student = studentProvider.get();
        LogUtils.e(student.toString());
    }
}

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值