gpt4 book ai didi

java - 抽象类和方法,为什么?

转载 作者:行者123 更新时间:2023-12-01 22:17:45 25 4
gpt4 key购买 nike

希望任何人都可以提供帮助,我正在学习 Java,与这个论坛中的其他人相比,我想我也是编程新手。

我读过关于抽象类和方法的一章,但并没有真正完全理解它们的用途和原因,并认为我会从经验丰富的程序员那里得到解释。

下面是我一直在研究的示例代码,在本书的帮助下,我不确定的是为什么在类 Dims 中,当每个子类使用一个区域时,我必须有抽象双区域()无论如何,或者它是从父类(super class)调用区域方法,为什么必须有重写的方法?

    // Using abstract methods and classes
package Training2;

abstract class Dims {
double dim1;
double dim2;

Dims(double a, double b) {
dim1 = a;
dim2 = b;
}
// area is now an abstract method
abstract double area();
}
class Rectangles extends Dims {
Rectangles(double a, double b) {
super(a, b);
}

// Override area for Rectangles
double area() {
System.out.println("Inside Area for Rectangle.");
return dim1 * dim2;
}
}
class Triangles extends Dims {
Triangles(double a, double b) {
super(a, b);
}

// Override area for right Triangles
double area() {
System.out.println("Inside Area for Triangle.");
return dim1 * dim2 /2;
}
}
public class AbstractAreas {
public static void main(String args[]) {
// Dims d = new Dims(10, 10); // Illegal now
Rectangles r = new Rectangles(9, 5);
Triangles t = new Triangles(10, 8);
Dims dimref; // This is OK, no object is created

dimref = r;
System.out.println("Area is " + dimref.area());

dimref = t;
System.out.println("Area is " + dimref.area());}

}

很抱歉胡言乱语,但我真的需要一些指导。

提前致谢。

最佳答案

我们这样做是为了表示“这个类有一个完整的(ish)API,但它没有完整的实现。”除此之外,这意味着您可以执行以下操作:

public void doSomething(Dims d) {
System.out.println("The area is " + d.area());
}

// ...using it somewhere:

doSomething(new Triangle(4.0, 6.0));

doSomething中,即使我们对对象的引用是Dims,而不是Triangle,我们也可以调用 area(我们最终调用 Triangle#area),因为它是在 Dims API 中定义的(有时称为“合约”)。只是 Dims实现推迟到子类。这就是为什么您无法创建抽象类的实例。 doSomething 方法不知道它所给的内容是 Triangle 还是 Rectangle,只是知道它是 some 有点Dim

如果 Dims 没有定义 areadoSomething 将无法编译。我们必须声明一个 doSomething 接受一个 Triangle ,另一个接受一个 Rectangle 等等。我们无法获得能够在通用代码中操作所有 Dims 事物的好处。

Java 中的接口(interface)和抽象类之间有很多交叉。从根本上讲,您可以将抽象类视为具有部分实现的接口(interface)(需要注意的是,一个类可以实现多个接口(interface),但只能从单个抽象类派生)。由于接口(interface)可以定义方法的“默认”实现,因此界限变得更加模糊。 (有些人认为,现在接口(interface)可以有默认方法,它们是"new"抽象类,并使真正的抽象类作为语言功能而过时,但 there are still arguments ,主要是语法上的,有时会使用抽象类。)

关于java - 抽象类和方法,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30648510/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com