抽象class和方法,为什么?
Abstract class and methods, Why?
希望任何人都可以提供帮助,我正在学习 Java 并且与这个论坛中的其他人相比,我想我也是编程的新手。
我看过关于抽象 class 和方法的一章,但并不真正完全理解它们的用途和原因,我想我会从经验丰富的程序员那里得到解释。
下面是我一直在使用的示例代码,在本书的帮助下,我不确定的是为什么在 class Dims 中我必须有 abstract double area() 时每个子 class 无论如何都使用一个区域方法,或者它是从超级 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());}
}
抱歉胡扯,但我真的需要一些指导。
提前致谢。
我们这样做是为了说 "This class has a complete (ish) API, but it does not have a complete implementation." 除其他外,这意味着您可以这样做:
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 中定义的(有时称为 "contract")。只是 Dims
将 实现 推迟到 subclasses。这就是为什么你不能创建抽象 classes 的实例。 doSomething
方法并不知道它给出的是 Triangle
还是 Rectangle
,只是它是 一些 类型的 Dims
.
而如果 Dims
没有定义 area
,doSomething
将不会编译。我们必须声明一个 doSomething
接受 Triangle
和另一个接受 Rectangle
等等。我们无法获得能够在公共代码中对所有 Dims
事物进行操作的好处。
在 Java 中接口和抽象 classes 之间有很多交叉。从根本上说,您可以将抽象 class 视为具有部分实现的接口(需要注意的是 class 可以实现多个接口,但只能从单个抽象 class).现在接口可以定义 "default" 方法的实现,这条线变得更加模糊。 (有些人认为现在接口可以有默认方法,它们是 "new" 抽象 classes 并使真正的抽象 classes 作为语言特性过时,但是 there are still arguments ,主要是句法,有时围绕使用抽象 classes。)
每个形状的展开Dims
需要不同的算法来计算面积,矩形的面积与三角形的面积不同。因此,我们在 Dims
中声明方法抽象,以强制每个形状实现自己的算法以正确计算面积。
在 Dims
中声明抽象方法强制形状覆盖它,否则它们本身将是抽象对象。这样我们就可以确保在任何 Dims
上调用 .area
都会得到正确的计算结果。
抽象class 强制您显示它作为抽象方法的行为。所以你必须在你的 subclasses 中覆盖抽象方法。
它作为一个界面。你必须执行。
在这里你不能从你的矩形中删除区域方法class
参考 Java™ 来自 Oracle 的教程;深入理解的好例子。
抽象 class 是声明为抽象的 class——它可能包含也可能不包含抽象方法。 Abstract classes不能被实例化,但是可以被subclassed.
当抽象 class 被子class 时,子class 通常为其父class 中的所有抽象方法提供实现。但是,如果不是,则 subclass 也必须声明为抽象的。
https://docs.oracle.com/javase/tutorial/java/IandI/abstract.html
希望任何人都可以提供帮助,我正在学习 Java 并且与这个论坛中的其他人相比,我想我也是编程的新手。
我看过关于抽象 class 和方法的一章,但并不真正完全理解它们的用途和原因,我想我会从经验丰富的程序员那里得到解释。
下面是我一直在使用的示例代码,在本书的帮助下,我不确定的是为什么在 class Dims 中我必须有 abstract double area() 时每个子 class 无论如何都使用一个区域方法,或者它是从超级 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());}
}
抱歉胡扯,但我真的需要一些指导。
提前致谢。
我们这样做是为了说 "This class has a complete (ish) API, but it does not have a complete implementation." 除其他外,这意味着您可以这样做:
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 中定义的(有时称为 "contract")。只是 Dims
将 实现 推迟到 subclasses。这就是为什么你不能创建抽象 classes 的实例。 doSomething
方法并不知道它给出的是 Triangle
还是 Rectangle
,只是它是 一些 类型的 Dims
.
而如果 Dims
没有定义 area
,doSomething
将不会编译。我们必须声明一个 doSomething
接受 Triangle
和另一个接受 Rectangle
等等。我们无法获得能够在公共代码中对所有 Dims
事物进行操作的好处。
在 Java 中接口和抽象 classes 之间有很多交叉。从根本上说,您可以将抽象 class 视为具有部分实现的接口(需要注意的是 class 可以实现多个接口,但只能从单个抽象 class).现在接口可以定义 "default" 方法的实现,这条线变得更加模糊。 (有些人认为现在接口可以有默认方法,它们是 "new" 抽象 classes 并使真正的抽象 classes 作为语言特性过时,但是 there are still arguments ,主要是句法,有时围绕使用抽象 classes。)
每个形状的展开Dims
需要不同的算法来计算面积,矩形的面积与三角形的面积不同。因此,我们在 Dims
中声明方法抽象,以强制每个形状实现自己的算法以正确计算面积。
在 Dims
中声明抽象方法强制形状覆盖它,否则它们本身将是抽象对象。这样我们就可以确保在任何 Dims
上调用 .area
都会得到正确的计算结果。
抽象class 强制您显示它作为抽象方法的行为。所以你必须在你的 subclasses 中覆盖抽象方法。
它作为一个界面。你必须执行。
在这里你不能从你的矩形中删除区域方法class
参考 Java™ 来自 Oracle 的教程;深入理解的好例子。
抽象 class 是声明为抽象的 class——它可能包含也可能不包含抽象方法。 Abstract classes不能被实例化,但是可以被subclassed.
当抽象 class 被子class 时,子class 通常为其父class 中的所有抽象方法提供实现。但是,如果不是,则 subclass 也必须声明为抽象的。
https://docs.oracle.com/javase/tutorial/java/IandI/abstract.html