一、什么是接口?
接口通常以interface来声明,如下图代码所示:(用户信息接口声明语法格式)
接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念,接口在JAVA编程语言中是一个抽象类型,是抽象方法的集合。类描述对象的属性和方法。接口则包含类要实现的方法。
那么我们就来完整的写一个接口:(用户信息接口)
public interface UserService {
// 声明变量
final Integer NUMBER_ONE = 1;
// 抽象方法
public Integer num(Integer NUMBER_ONE, Integer a, Integer b);
}
声明接口特点:
Java 接口中声明的变量默认都是 final 的,Java 接口中的成员函数默认是 public 的。
接口实现类怎么写呢?
类如果要实现一个接口,它必须要实现接口声明的所有方法。
public class UserServiceImpl implements UserService {
@Override
public Integer num(Integer NUMBER_ONE, Integer a, Integer b) {
return NUMBER_ONE + a + b;
}
public static void main(String[] args) {
UserServiceImpl userService = new UserServiceImpl();
Integer num = userService.num(NUMBER_ONE,1,2);
System.out.println(num);
}
}
类只能实现一个接口?
显然不是,类可以实现很多个接口,比如我们再编写一个订单接口,用于验证:
public interface OrderService {
// 声明变量
final Integer NUMBER_ONE = 1;
// 抽象方法
public Integer subtraction(Integer NUMBER_ONE, Integer a, Integer b);
}
注意:实现类必须要实现接口声明的所有方法。
接口可以被实例化吗?
显然不可以,因为它并不是一个类,只是一个接口。
二、什么是抽象类?
如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
员工抽象类:
public abstract class Employee {
private String name;
private String address;
private int number;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
// 无参构造
public Employee() {
}
// 有参构造
public Employee(String name, String address, int number) {
this.name = name;
this.address = address;
this.number = number;
}
// 抽象的方法
public abstract Integer num(Integer a, Integer b);
@Override
public String toString() {
return "Employee{" +
"name='" + name + '\'' +
", address='" + address + '\'' +
", number=" + number +
'}';
}
}
抽象类可以包含非 final 的变量、抽象类的成员函数可以是 private,protecte或者是 public 。
抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。
既然不能实例化它,我们怎么获取它的成员变量,以及方法呢?
new一个类继承抽象类,通过该方法可以设置或获取抽象类成员变量,以及成员方法。
public class Salary extends Employee
public class Salary extends Employee{
private double salary;
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public Salary() {
}
@Override
public Integer num(Integer a, Integer b) {
return a+b;
}
// 该对象将从 Employee 类继承 其他成员方法
// 通过该方法可以设置或获取三个成员变量。
public Salary(String name, String address, int number, double salary) {
super(name, address, number);
this.salary = salary;
}
public static void main(String [] args)
{
Salary s = new Salary();
Employee e = new Salary("ac", "上海", 2, 2400.00);
System.out.println(s.num(1,2));
System.out.println(e);
}
}
类可以不实现抽象类声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。
抽象方法指一些只有方法声明,而没有具体方法体的方法。抽象方法一般存在于抽象类或接口中。
三、区别
1、接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。
比如你只能在接口这样写方法:
比如你只能在抽象类中写方法:
2、类可以实现很多个接口,但是只能继承一个抽象类。
3、类如果要实现一个接口,它必须要实现接口声明的所有方法。但是,类可以不实现
抽象类声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。
4、抽象类可以在不提供接口方法实现的情况下实现接口。
该Salary对象类 继承了 Employee 类 然后 抽象类Employee 实现 UserService接口 所以可以重写UserService接口中的方法
@Override
public Integer num(Integer NUMBER_ONE, Integer a, Integer b) {
return null;
}
5、Java 接口中声明的变量默认都是 final 的。抽象类可以包含非 final 的变量。
6、Java 接口中的成员函数默认是 public 的。抽象类的成员函数可以是 private,protecte
或者是 public 。
7、接口是绝对抽象的,不可以被实例化(java 8 已支持在接口中实现默认的方法)。抽象类
也不可以被实例化,但是,如果它包含 main 方法的话是可以被调用的。
最后
如果你觉得DT_小白文章写的还不错,请微信搜索并关注「 Java云社 」微信公众号,和DT_小白一起学习Java、分布式、微服务、大数据技术,并且「 Java云社 」收集了大量的大厂面试题目集,等你来挖掘,为了提升自己的能力,实现技术能力的飞跃,每天定时更新超硬核技术干货,我在「 Java云社 」等您的加入,让我们共同学习吧!