簡體   English   中英

Java中的抽象

[英]Abstraction in Java

我是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();
   }
}

我的問題是,我們甚至無法實例化一個抽象類。 因此,我們必須擴展它並覆蓋相同的方法? 當我們在子類中重寫抽象方法時,超級類(抽象類方法)沒有用。 同樣,我們甚至不能實例化,為什么我們不能只在一個類中編寫所有內容,而不擴展abtsrcat類?

在擴展抽象類並覆蓋同一件事時,這是否不是負面的,因為這些浪費的抽象類的空間會更多嗎?

我知道我不清楚,這就是我感到困惑的原因。 如果任何人都可以通過解釋來澄清這一點(沒有像我這樣的菜鳥沒有用的強硬定義),我將非常感謝您的寶貴時間。

除了使用錯誤的示例之外,您對Abstract類的理解也不對:

因此,我們必須擴展它並覆蓋相同的方法? 當我們在子類中重寫抽象方法時,超級類(抽象類方法)沒有用

第一:抽象類和接口都保留提供擴展或實現類所要覆蓋的抽象方法。

第二:對於所有擴展類,抽象類都可以使用通用方法實現-則無需一遍又一遍實現或覆蓋它們。 只需使用它們。 注意:從Java 8 Interface開始,方法的默認實現也可以)

第三:如果您需要除通用實現之外的其他方法-覆蓋超類中的所需方法。

第四:如果在另一個實現中,您需要運行super方法-在實現中的任何時候都可以通過調用super.methodName(...)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM