大家好,今儿和大家一起来学习,共同探讨一下接口和抽象都是什么?有什么区别?
话不多说,直接一梭子。
抽象类
1、什么是抽象类?
抽象类是用来映射子类的通用特性的,不能被实例化。
只能被用来做子类的超类,用来创建子类的模板。
2、语法:
抽象类中可以定义方法,也可以有方法实现,也可以没有方法实现。
3、实现:
1)子类使用extends关键字来继承抽象类,如果子类不是抽象类,需要实现我们父类中的所有的抽象方法。
2)单继承,父类就比父亲,子类就好比儿子。一个父亲可以有若干个儿子,而一个儿子只能有一个父亲,实际的应 用中有,BaseActivity和各个Activity之间的关系
3)修饰符:可以public、protected、default
例子:
//我是base层,我是父类
public static class Base{
//这个是定义方法的
abstract void init();
abstract void findViewById(View view);
//这个是定义实现方法主体的
abstract void haha(){
Log.i("我是base中的实现方法主体的方法");
}
}
//我是子类
public class LoginActivity extends Base{
//当我们的子类非静态的时候,base中的方法我们必须全部实现、
@Override
public void init(){
//初始化代码
}
@Override
public int findViewById(){
return R.layout.activity_login;
}
@Override
public void haha(){
log.i(我是子类);
}
}
//当我们的子类是抽象的时候,我们可以选择我们想要实现的部分进行实现。
public abstract class LoginActivity extends Base{
//当我们的子类非静态的时候,base中的方法我们必须全部实现、
@Override
public void init(){
//初始化代码
}
}
接口
1、什么是接口?
接口是比抽象类更加抽象的一个“非类”,毕竟它是一个虚的一个概念,不是真实的可以new出来的。
接口是用来建立类与类之间的协议的。没有具体的实现,只能通过关键字implements在我们需要的类中实现这个接口。
2、语法:
关键字来实现。接口可以进行多实现。
3、例子:
//定义接口,提供一些我们公共的方法。
public interface Base{
//定义一个接口a
void a();
//定义一个接口b
void b();
}
public interface Base2{
//定义一个接口
void c();
}
//接口可以多实现
public class LoginActivity implements Base,Base2{
//Base中的方法实现
@Override
public void a(){}
@Override
public void b(){}
//Base2中方法的实现
@Override
public void c(){}
}
抽象类和接口的区别?
//参考https://blog.youkuaiyun.com/jessenpan/article/details/38148775的整理的表格。
参数 | 抽象类 | 接口 |
默认的方法实现 | 它可以有默认的方法实现 | 接口完全是抽象的。它根本不存在方法的实现 |
实现 | 子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。 | 子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现 |
构造器 | 抽象类可以有构造器 | 接口不能有构造器 |
与正常Java类的区别 | 除了你不能实例化抽象类之外,它和普通Java类没有任何区别 | 接口是完全不同的类型 |
访问修饰符 | 抽象方法可以有public、protected和default这些修饰符 | 接口方法默认修饰符是public。你不可以使用其它修饰符。 |
main方法 | 抽象方法可以有main方法并且我们可以运行它 | 接口没有main方法,因此我们不能运行它。 |
多继承 | 抽象方法可以继承一个类和实现多个接口 | 接口只可以继承一个或多个其它接口 |
速度 | 它比接口速度要快 | 接口是稍微有点慢的,因为它需要时间去寻找在类中实现的方法。 |
添加新方法 | 如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变你现在的代码。 | 如果你往接口中添加方法,那么你必须改变实现该接口的类。 |