Java中的抽象– OOPS概念
在这篇文章中,我们将看到OOPS概念抽象在Java中的用法。
什么是抽象
与继承,多态性和封装一样,抽象是面向对象编程的四个基本原理之一。
抽象意味着隐藏实现的复杂性,仅向用户公开基本功能。例如,我们可以将与电子产品互动的任何电子产品都使用按钮和开关打开或者关闭,或者增大或者减小音量或者速度。真正的复杂性,如何实现该功能对我们来说是隐藏的。
Java中有许多API可以作为Java中的抽象示例来显示。 JDBC是一种非常著名的API,它用于连接数据库,执行查询和获取结果。作为开发人员,我们只知道API的方法是统一的,这些方法如何为不同的DB实现是从我们这里抽象出来的。我们只需为使用的数据库添加所需的驱动程序,然后使用相同的方法。
Java中的抽象
如果我们必须向用户隐藏真正的实现,则可以通过接口和抽象类来实现Java中的那种抽象。通过使用接口,实现是完全隐藏的,仅定义了预期的行为。使用抽象类,可以提供部分实现。
Java中的抽象-接口示例
考虑以下接口
public interface User { int processFee(int numOfMonths); }
通过此接口中的方法仅定义了预期的行为,并对其实现方式进行了抽象。
根据用户类型,有两个类实现此接口并提供方法实现。
public class PlatinumUser implements User { final static int PLATINUM_PACKAGE = 1200; @Override public int processFee(int numOfMonths) { return PLATINUM_PACKAGE * numOfMonths; } }
public class GoldUser implements User { final static int GOLD_PACKAGE = 700; @Override public int processFee(int numOfMonths) { return GOLD_PACKAGE * numOfMonths; } }
我们可以使用以下类运行实现。
public class UserTest { public static void main(String[] args) { User user = new PlatinumUser(); System.out.println("12 month fee for platinum user- " + user.processFee(12)); user = new GoldUser(); System.out.println("6 month fee for gold user- " + user.processFee(6)); } }
输出:
12 month fee for platinum user- 14400 6 month fee for gold user- 4200
在使用User实例的类中,我们只需切换引用即可运行所需的实现。那些用户实现类的实现方式是抽象的。
下图显示了如何从实际实现中抽象出用户。
Java中的抽象–抽象类示例
如果我们以前面的示例为例,那么不管用户的类型如何,都会有一些通用的方法,例如获取用户的姓名,获取用户的生日,费用的计算可能会有所不同。
在这种情况下,我们可以使用Abstract类,在其中保留通用实现,并抽象出不同的部分。
public abstract class User { private String name; private String designation; private int numOfMonths; public User(String name, String designation, int numOfMonths){ this.name = name; this.designation = designation; this.numOfMonths = numOfMonths; } // abstract method public abstract int processFee(); public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDesignation() { return designation; } public void setDesignation(String designation) { this.designation = designation; } public int getNumOfMonths() { return numOfMonths; } public void setNumOfMonths(int numOfMonths) { this.numOfMonths = numOfMonths; } }
在抽象类中,processFee()方法是抽象的,因此它将由扩展User类的类实现。
PlatinumUser.java
public class PlatinumUser extends User { final static int PLATINUM_PACKAGE = 1200; public PlatinumUser(String name, String designation, int numOfMonths){ super(name, designation, numOfMonths); } public int processFee() { return PLATINUM_PACKAGE * getNumOfMonths(); } }
GoldUser.java
public class GoldUser extends User { final static int GOLD_PACKAGE = 700; public GoldUser(String name, String designation, int numOfMonths){ super(name, designation, numOfMonths); } @Override public int processFee() { return GOLD_PACKAGE * getNumOfMonths(); } }
我们可以使用以下类运行实现。
public class UserTest { public static void main(String[] args) { User user = new PlatinumUser("Robbie", "CEO", 12); System.out.println("12 month fee " + user.processFee() + " for platinum user " + user.getName() + "("+user.getDesignation()+")" ); user = new GoldUser("Alex", "Manager", 6); System.out.println("6 month fee " + user.processFee() + " for gold user " + user.getName() + "("+user.getDesignation()+")" ); } }
输出:
12 month fee 14400 for platinum user Robbie(CEO) 6 month fee 4200 for gold user Alex(Manager)
在使用User实例的类中,我们只需切换引用即可运行所需的实现。对于方法getDesignation()和getName(),使用User类的通用实现。对于抽象的processFee()方法,使用扩展类的实现。