Java 抽象类和方法,为什么?
希望任何人都能提供帮助,我正在学习Java,与本论坛的其他人相比,我想我也是编程新手 我遇到过一个关于抽象类和方法的章节,但并不完全理解它们的用途和原因,我想我会从一个有经验的程序员那里得到一个解释 下面是我一直在编写的示例代码,在本书的帮助下,我不确定的是,为什么在类Dims中,当每个子类都使用area方法时,我必须使用抽象的double area(),或者它是从超类调用area方法,为什么必须使用重写的方法Java 抽象类和方法,为什么?,java,class,methods,overriding,abstract,Java,Class,Methods,Overriding,Abstract,希望任何人都能提供帮助,我正在学习Java,与本论坛的其他人相比,我想我也是编程新手 我遇到过一个关于抽象类和方法的章节,但并不完全理解它们的用途和原因,我想我会从一个有经验的程序员那里得到一个解释 下面是我一直在编写的示例代码,在本书的帮助下,我不确定的是,为什么在类Dims中,当每个子类都使用area方法时,我必须使用抽象的double area(),或者它是从超类调用area方法,为什么必须使用重写的方法 // Using abstract methods and classes
// 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
方法不知道给出的是三角形还是矩形,只是它是某种Dims
而如果Dims
没有定义区域
,doSomething
将无法编译。我们必须声明一个doSomething
接受一个三角形,另一个接受一个矩形,依此类推。我们无法获得在通用代码中操作所有DIM
事物的好处
在Java中,接口和抽象类之间有很多交叉。从根本上讲,您可以将抽象类视为具有部分实现的接口(需要注意的是,一个类可以实现多个接口,但只能从单个抽象类派生)。现在,接口可以定义方法的“默认”实现,这条线变得更加模糊。(有些人认为,现在接口可以有默认方法,它们是“新的”抽象类,使真正的抽象类作为一种语言功能过时,但主要是语法性的,有时会使用抽象类。)我们这样做是为了说“这个类有一个完整的(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
方法不知道给出的是三角形还是矩形,只是它是某种Dims
而如果Dims
没有定义区域
,doSomething
将无法编译。我们必须声明一个doSomething
接受一个三角形,另一个接受一个矩形,依此类推。我们无法获得在通用代码中操作所有DIM
事物的好处
在Java中,接口和抽象类之间有很多交叉。从根本上讲,您可以将抽象类视为具有部分实现的接口(需要注意的是,一个类可以实现多个接口,但只能从单个抽象类派生)。现在,接口可以定义方法的“默认”实现,这条线变得更加模糊。(有些人认为,现在接口可以有默认方法,它们是“新的”抽象类,使真正的抽象类作为一种语言功能过时,但主要是语法性的,有时会使用抽象类。)我们这样做是为了说“这个类有一个完整的(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
方法不知道给出的是三角形还是矩形,只是它是某种Dims
而如果Dims
没有定义区域
,doSomething
将无法编译。我们必须声明一个doSomething
接受一个三角形,另一个接受一个矩形,依此类推。我们无法获得在通用代码中操作所有DIM
事物的好处
在Java中,接口和抽象类之间有很多交叉。从根本上讲,您可以将抽象类视为具有部分实现的接口(需要注意的是,一个类可以实现多个接口,但只能从单个抽象类派生)。现在,接口可以定义方法的“默认”实现,这条线变得更加模糊。(一些人认为,现在接口可以有默认方法,它们是“新的”抽象类,并使ab成为现实。)