Java 抽象类和方法,为什么?

Java 抽象类和方法,为什么?,java,class,methods,overriding,abstract,Java,Class,Methods,Overriding,Abstract,希望任何人都能提供帮助,我正在学习Java,与本论坛的其他人相比,我想我也是编程新手 我遇到过一个关于抽象类和方法的章节,但并不完全理解它们的用途和原因,我想我会从一个有经验的程序员那里得到一个解释 下面是我一直在编写的示例代码,在本书的帮助下,我不确定的是,为什么在类Dims中,当每个子类都使用area方法时,我必须使用抽象的double area(),或者它是从超类调用area方法,为什么必须使用重写的方法 // Using abstract methods and classes

希望任何人都能提供帮助,我正在学习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
方法不知道给出的是
三角形还是
矩形,只是它是某种
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成为现实。)