我是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/