希望任何人都可以提供帮助,我正在学习Java,并且与本论坛中的其他任何人相比,我想我也是编程的新手。
我遇到过关于抽象类和方法的章节,但是并没有真正完全理解它们的用途和原因,并且认为我会从经验丰富的程序员那里得到解释。
下面我有一些我一直在研究的示例代码,在本书的帮助下,我不确定为什么在Dims类中我必须使用抽象双区域()当每个子类使用一个区域时无论如何,或者是从超类调用area方法,为什么你必须有覆盖的方法?
// 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());}
}
为胡言乱语道歉,但我真的需要一些指导。
提前致谢。
答案 0 :(得分:2)
我们这样做是为了说“此类有一个完整的(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
(我们最终会调用{ {1}})因为它是在Triangle#area
API(有时称为“合同”)中定义的。只是Dims
将实现推迟到子类。这就是为什么你不能创建抽象类的实例。 Dims
方法不知道它的内容是doSomething
还是Triangle
,只是它是某些类Rectangle
如果Dims
未定义Dims
,area
将无法编译。我们必须声明doSomething
接受doSomething
而另一个接受Triangle
等等。我们无法获得能够在公共代码中操作所有Rectangle
事物的好处。
Java中的接口和抽象类之间存在很多交叉。从根本上说,您可以将抽象类视为具有部分实现的接口(需要注意的是,类可以实现多个接口,但只能从单个抽象类派生)。由于接口可以定义方法的“默认”实现,因此该行甚至变得更加模糊。 (有些人认为,现在接口可以有默认方法,它们是“新”抽象类,并使真正的抽象类作为语言特征过时,但there are still arguments,主要是语法,有时使用抽象类。)< / p>
答案 1 :(得分:1)
消耗Dims
的每个形状需要不同的算法来计算面积,矩形的面积与三角形的面积不同。因此,我们在Dims
中声明方法abstract,强制每个形状实现自己的算法,以正确计算面积。
在Dims
中声明方法abstract会强制形状覆盖它,否则它们将成为抽象对象。这样,我们确信在任何.area
上调用Dims
都会导致正确的计算。
答案 2 :(得分:0)
Abstract类强制您显示它作为抽象方法的行为。因此,您必须覆盖子类中的抽象方法。
它作为一个界面。你必须要实施。
这里你不能从你的Rectangles类中删除区域方法
答案 3 :(得分:0)
参考Oracle的Java™教程;深入理解的好例子。
抽象类是一个声明为abstract的类 - 它可能包含也可能不包含抽象方法。抽象类不能被实例化,但它们可以被子类化。
当抽象类被子类化时,子类通常为其父类中的所有抽象方法提供实现。但是,如果没有,那么子类也必须声明为abstract。
https://docs.oracle.com/javase/tutorial/java/IandI/abstract.html