Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的抽象_Java_Abstract Class_Abstract - Fatal编程技术网

Java中的抽象

Java中的抽象,java,abstract-class,abstract,Java,Abstract Class,Abstract,我是java新手,学习基本概念。我在学习抽象,我发现最基本的定义是:用来隐藏复杂性(隐藏一个过程将如何完成,并显示我们可以做什么?) 很公平。我对什么是抽象有了一个基本的概念。但我不清楚以下几点: 让我们看看下面的例子: /* File name : Employee.java */ public abstract class Employee { private String name; private String address; private int number;

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

 }
    /* 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();
   }
}
Main.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;
   }

 }
    /* 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类

当扩展抽象类并重写同样的东西时,这不是一个负面的结果,因为这些浪费的抽象类会占用更多的空间吗


我知道我不清楚,这就是我困惑的原因。如果有人能解释清楚这一点(没有对像我这样的noobs不有用的分层定义),我将非常感谢有时间来解释。

除了你使用的坏例子之外,你对抽象类的理解是不对的:

所以我们必须扩展它并超越相同的方法?当我们重写子类中的抽象方法时,超类(抽象类方法)是没有用的

首先:抽象类和接口都保留下来,以提供通过扩展或实现类重写的抽象方法

Second:抽象类可以为所有扩展类实现通用方法-这样您就不需要反复实现或重写它们。就用它们吧。(注意:从Java 8开始,接口也可以有方法的默认实现)

第三:如果您需要通用实现以外的实现,请从超类重写所需的方法


Forth:如果在另一个实现中需要运行super方法,请在实现中随时调用
super.methodName(…)

以执行此操作。薪资不是员工。你的课程层次结构不可能复制@SLaks,这是我正在关注的链接。如果网站中有错误,请告诉我。如果教程让员工加薪,那么放弃这些教程,从更好的来源学习。有几本关于OOPs和Java的不错的书。我看到了你的链接,我重申了我所说的。工资不符合is-a测试。工资不是一种更具体的员工类型。相反,雇员有——一份薪水——这里的构成,而不是遗产。