[英]Abstract class and methods, Why?
希望任何人都可以提供帮助,我正在学习Java,并且与本论坛的其他人一样,我想我也是编程的新手。
我遇到了有关抽象类和方法的一章,但是并没有真正完全理解它们的用途以及原因,并认为我会从经验丰富的程序员那里得到解释。
在本书的帮助下,我下面一直在研究示例代码,我不确定的是为什么在Dims类中,当每个子类仍然使用area方法时,我必须具有抽象double area(),还是从超类中调用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());}
}
抱歉,但我确实需要一些指导。
提前致谢。
我们这样说是:“此类具有完整的(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
,只是它的某种 Dims
。
如果Dims
没有定义area
,则doSomething
不会编译。 我们必须声明一个doSomething
接受一个Triangle
,另一个接受Rectangle
,依此类推。 我们无法获得能够在通用代码中对所有Dims
进行操作的好处。
Java中的接口和抽象类之间有很多交叉。 从根本上讲,您可以将抽象类视为具有部分实现的接口(要注意的是,一个类可以实现多个接口,但只能从单个抽象类派生)。 现在,接口可以定义方法的“默认”实现,这条线变得更加模糊。 (现在有人争论说接口可以具有默认方法,它们是“新”抽象类,并且使真正的抽象类作为一种语言功能而过时了,但是仍然有一些参数 ,主要是句法,有时会使用抽象类。)
消耗Dims
每种形状都需要不同的算法来计算面积,矩形的面积与三角形的面积不同。 因此,我们以Dims
声明了abstract方法,以强制每种形状实施自己的算法以正确计算面积。
在Dims
声明抽象方法会强制形状覆盖它,否则它们本身将成为抽象对象。 这样,我们可以确保在任何Dims
上调用.area
都将导致正确的计算。
抽象类迫使您显示它具有的行为作为抽象方法。 因此,您必须在子类中覆盖抽象方法。
它用作接口。 而且您必须执行。
在这里,您不能从矩形类中删除Areas方法
请参阅Oracle的Java™教程。 深入了解的好例子。
抽象类是被声明为抽象的类-它可能包含也可能不包含抽象方法。 抽象类不能实例化,但是可以被子类化。
当抽象类被子类化时,该子类通常为其父类中的所有抽象方法提供实现。 但是,如果没有,则子类也必须声明为抽象。
https://docs.oracle.com/javase/tutorial/java/IandI/abstract.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.