我是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类?
虽然扩展抽象类并重写同样的东西,但它不是负面的,因为这些废弃抽象类的空间会更多吗?
我知道我没有清晰度,这就是我感到困惑的原因。如果有人能够通过解释澄清这一点(没有对我这样的新手没用的紧张定义),我会非常感谢你的时间。
答案 0 :(得分:1)
除了你使用的不好的例子之外,你对Abstract类的理解是不对的:
所以我们必须扩展它并覆盖相同的方法?当我们覆盖子类中的抽象方法时,超类(抽象类方法)是没有用的
第一:抽象类和接口都可以通过扩展或实现类来提供抽象方法。
第二:抽象类可以为所有扩展类实现通用方法 - 然后您不需要反复实现或覆盖它们。只需使用它们。 (注意:从Java 8接口开始也可以有方法的默认实现)
第三:如果你需要另一种常见的实现 - 从超类中覆盖所需的方法。
Forth:如果在您的另一个实现中您需要运行super方法 - 通过调用super.methodName(...)