java - Java 中的抽象

标签 java abstract-class abstract

我是java新手,正在学习基本概念。我正在学习抽象,我发现的最基本的定义是:用于隐藏复杂性(隐藏流程将如何完成并显示我们可以做什么?)

很公平。我对什么是抽象有了基本的了解。但我在这里不清楚一些事情:

让我们看下面的例子:

/* File name : Employee.java */
public 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 double computePay() {
     System.out.println("Inside Employee computePay");
     return 0.0;
   }

   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;
   }

   public String getAddress() {
      return address;
   }

   public void setAddress(String newAddress) {
      address = newAddress;
   }

   public int getNumber() {
      return number;
   }
}

Salary.java

 /* File name : Salary.java */
public 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;
   }

 }

Main.java

    /* File name : AbstractDemo.java */
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();
   }
}

我的问题是,我们甚至无法实例化一个抽象类。那么我们必须扩展它并覆盖相同的方法吗?当我们在子类中重写抽象方法时,父类(super class)(抽象类方法)就没用了。另外,由于我们甚至无法实例化,为什么我们不能将所有内容都写在一个类中而不是扩展 abtsrcat 类呢?

虽然扩展抽象类并覆盖相同的东西,但这不是负面的,因为这些浪费的抽象类的空间会更多吗?

我知道我不清楚,这就是我感到困惑的原因。如果有人可以通过解释来澄清这一点(没有对像我这样的菜鸟没有用的直接定义),我将非常感谢您花时间这样做。

最佳答案

除了您使用的错误示例之外,您对抽象类的理解也不正确:

So we have to extend it and overide the same method? When we override the abstract methos in the child class, the super class(abstract class method) is of no use

第一:抽象类和接口(interface)都保留提供可通过扩展或实现类覆盖的抽象方法。

第二:抽象类可以为所有扩展类提供通用方法实现 - 那么您不需要一遍又一遍地实现或重写它们。只需使用它们即可。 (注意:从 Java 8 接口(interface)开始也可以有方法的默认实现)

第三:如果您需要通用实现以外的其他实现 - 从父类(super class)重写所需的方法。

第四:如果在另一个实现中您需要运行 super 方法 - 可以在实现中随时调用 super.methodName(...)

关于java - Java 中的抽象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47877477/

相关文章:

java - 从未使用分配的 boolean 值 - Java/Android Studio

Java:多重继承的替代方案

java - Java中的抽象类和接口(interface)

python - 如何在 Python 3.4+ 中写入抽象属性

java - 无法修复抽象方法错误 (Java)

python - 是否可以在 Python 中创建抽象类?

java - Struts2:全局结果配置错误

java - tomcat漏洞讨论

java - 使用 Java 正则表达式匹配器查找最后一个匹配项

Java错误=不是抽象的并且不重写抽象方法