一、定义
1、接口:接口是一种抽象的类型,它定义了一组方法,但是没有实现这些方法。只有定义,没有具体实现,需要在具体的类中去实现。接口是Java世界中公认的一种标准,将接口作为主要的开发方式。可以通过接口来实现多态和解决相关问题,使代码的耦合度大大降低,扩展性和复用性增强。
<public interface InterfaceName>
{
//接口中的声明语句
}</public>
2、抽象类:抽象类是用来抽象化具有相似的属性和方法的类的一种机制,它本身不能实例化,但是可以被子类继承。抽象类中包含抽象方法,抽象方法必须在子类中实现,并且子类必须定义自己的一些特定方法。抽象类可以为具体子类提供一个通用的接口,可以避免代码的重复性。
<public abstract class ClassName>
{
//类中的声明语句
}</public>
二、使用
1、接口的使用:接口和类的继承相似,但是接口没有任何实现的方式,只是定义了一组规范。接口中的所有方法都是抽象的,必须由实现了接口的类来实现接口中的方法。
<interface Shape>
{
public void draw(); // 定义一个抽象方法
}</public>
// 实现接口
public class Rectangle implements Shape
{
public void draw()
{
System.out.println("Inside Rectangle::draw() method.");
}
}
// 调用实现的方法
public class Test
{
public static void main(String[] args)
{
Shape shape = new Rectangle(); // 多态
shape.draw();
}
}
2、抽象类的使用:抽象类不能实例化,必须被子类继承来使用。抽象类的抽象方法必须由子类来实现,否则子类也必须变成抽象类。可以用抽象类作为多个子类的共同类型,使代码更加灵活。
<abstract class Employee>
{
private String name;
private String address;
private int number;
// 构造函数
public Employee(String name, String address, int number)
{
System.out.println("Constructing an Employee");
this.name = name;
this.address = address;
this.number = number;
}
// 抽象方法
public abstract double computePay();
// 其他方法
public void mailCheck()
{
System.out.println("Mailing a check to " + this.name + " " + this.address);
}
// 其他方法
public String toString()
{
return name + " " + address + " " + number;
}
// 其他普通方法
public String getName()
{
return name;
}
}
// 子类Employee的实现
class Salary extends Employee
{
private double salary; // Annual salary
public Salary(String name, String address, int number, double salary)
{
super(name, address, number);
setSalary(salary);
}
public void mailCheck()
{
System.out.println("Within mailCheck of Salary class ");
System.out.println("Mailing check to " + getName()
+ " with salary " + salary);
}
public double getSalary()
{
return salary;
}
public void setSalary(double newSalary)
{
if(newSalary >= 0.0)
{
salary = newSalary;
}
}
public double computePay()
{
System.out.println("Computing salary pay for " + getName());
return salary/52;
}
}
public class AbstractDemo
{
public static void main(String [] args)
{
Salary s = new Salary("Mohd Mohtashim", "Ambehta, UP", 3, 3600.00);
Employee e = new Salary("John Adams", "Boston, MA", 2, 2400.00);
System.out.println("Call mailCheck using Salary reference --");
s.mailCheck();
System.out.println("\n Call mailCheck using Employee reference--");
e.mailCheck();
}
}
三、相同点
1、都是用来实现Java中的面向对象的概念,解决了代码中的封装、继承和多态问题。
2、都可以包含方法和变量,这些方法和变量都有访问权限控制。
3、都不能直接实例化,都需要在具体的类中被实现或继承。
四、不同点
1、接口中的所有方法都是抽象的,而抽象类中可以有部分方法是抽象的,也可以有非抽象的方法。
2、一个类可以实现多个接口,但是只能继承一个抽象类。
3、接口中可以有常量,但是抽象类中没有。
4、接口中方法的访问权限必须是public,而抽象类中可以有public、protected和默认访问权限。
5、抽象类中有构造函数,而接口中没有。
五、总结
Java接口和抽象类都是实现面向对象中的封装、多态、继承等概念的重要手段。虽然它们有很多相似点,但是也有不同的地方,因此开发人员在实际编程中需要灵活使用,根据需求选择适合的方式。在编写代码的时候,应该尽可能减少类之间的耦合,提高代码的扩展性和复用性,从而提高代码的维护性和可读性。