CodeGym /Java 博客 /随机的 /Java 抽象方法和类
John Squirrels
第 41 级
San Francisco

Java 抽象方法和类

已在 随机的 群组中发布
抽象方法是 Java 的一个强大工具,在多态性方面赋予这种面向对象的语言更多的能力。Java 抽象方法可以用来为整个程序创建一个基本框架,并使您可以根据需要进行调整。Java 抽象方法与你 - 1

什么是抽象方法?

抽象方法是没有实现的方法。也就是说,它只有一个声明,所以您知道名称、返回类型和它将接受的变量。下面是一个基本抽象方法的例子:

public abstract int example(int a1, int a2);
当您查看此方法时,您会发现它返回一个整数并且接受两个整数作为其参数。你不能说的是这个方法是如何实现的。那是因为要实现它,您必须覆盖它。在 java 中创建抽象方法时,您必须遵守一些准则,否则您的程序将无法正确编译。记住:
  • Java 抽象方法没有实现。也就是说,它们后面永远不应跟花括号和说明如何使用该方法的主体。它只是以分号结束。

  • 如果你创建了一个抽象方法,那只能放到一个抽象类中。也就是说,您不能拥有一个内部具有抽象方法的具体类。
    我。作为旁注,如果你有一个抽象类,它可以包含构造函数。但是,它不必具有抽象方法。

  • 当一个具体类扩展一个抽象类时,它还必须实现父类的所有抽象方法,否则它就不能是具体的,必须声明为抽象的。

最后两个可能有点令人困惑,所以让我们马上把它弄清楚。

扩展抽象 Java 类

假设我们要编写一个关于将返回周长和面积的基本形状的程序。所以我们创建一个父抽象类。但是因为每个形状都有自己的规则,每个形状都要计算不同,所以我们这样 写抽象的Shape类:

abstract class Shape {
  		String shapeName = " ";
  		Shape(String name) { 
    			this.shapeName = name; 
  		} 

abstract double area();
  		abstract double perimeter();
}
现在,如果我们想实际使用这些抽象方法,我们必须扩展抽象的 Java 父类Shape,然后实例化这些方法。所以每个具体类都必须实现area和perimeter抽象方法。

class Quadrilateral extends Shape  
{ 
    double length, width; 
      
    Quadrilateral(double l, double w, String name) 
    { 
        super(name); 
        this.length = l; 
        this.width = w; 
    } 
      
    @Override
    public double perimeter()  
    { 
        return ((2*length)+(2*width));
    } 
      
    @Override
    public double area()  
    { 
        return (length*width); 
    } 
}

Implementing the Quadrilateral class would then look like this
class Main
{ 
    public static void main (String[] args)  
    { 
      
        // creating a Quadrilateral object using Shape as reference 
        Shape rectangle = new Quadrilateral(3,4, "Rectangle"); 
        System.out.println("Area of rectangle is " + rectangle.area()); 
        System.out.println("Perimeter of rectangle is " + rectangle.perimeter());
  
    } 
} 
控制台的输出如下所示:

Area of rectangle is 12.0
Perimeter of rectangle is 14.0
请注意,类Quadrilateral不必从父类Shape实例化Shape(String name)构造函数。那是因为它不是抽象方法。但是,如果您只在一个类中实现了一个区域或周界,那么新类就必须是抽象的,因为它不包括这两者。您还可以在接口中使用抽象方法。

具有接口的抽象 Java 方法

让我们快速回顾一下接口是什么以及它与抽象类的区别。在接口中,在接口中声明的任何变量都是公共的、静态的和最终的。另一方面,抽象类只有非最终变量。默认情况下,接口中的所有内容都是公开的。一个抽象类可以有 private、protected、public 等。最后,一个类不扩展接口,它实现它。在 JDK 8 之前,接口中只能包含抽象方法。现在,接口可以有默认方法和静态方法。正因为如此,最佳实践已经不再使用抽象方法作为可扩展模板,而是专注于接口和实现它们。因此,如果您要将Shape创建为接口,然后将其实现为四边形, 它会是什么样子?首先,您必须取消Shape(String name)构造函数。只有两个抽象方法看起来像这样:

interface Shape {

  abstract double area();
  abstract double perimeter();
}


So the Quadrilateral class would then look like this:
class Quadrilateral implements Shape {  

  double length, width; 
      
    	  Quadrilateral(double l, double w) {
    
    	    this.length = l; 
    	    this.width = w; 
    	  } 
      
    	  @Override
    	  public double perimeter() {
     
    	    return ((2*length)+(2*width));
    	  } 
      
    	  @Override
    	  public double area() {
    
   	    return (length*width); 
    	  } 
}
最后,在实现Shape接口时 使用新的Quadrilateral将大同小异:

class Main
{ 
    public static void main (String[] args)  
    { 
      
        // creating a Quadrilateral object using Shape as reference 
        Shape rectangle = new Quadrilateral(3,4); 
        System.out.println("Area of rectangle is " + rectangle.area()); 
        System.out.println("Perimeter of rectangle is " + rectangle.perimeter());
  
    } 
}
控制台打印出来的是这样的:

Area of rectangle is 12.0
Perimeter of rectangle is 14.0
如果您想进一步了解接口和抽象类之间的差异,可以在此处找到更多信息。

但为什么要使用抽象 Java 方法?

使用 Java 中的抽象方法以及您应该习惯使用它们的原因有很多。以下是您应该在适当的时候使用它们的三个快速原因。
  1. 避免重复劳动——回顾一下我们的示例代码;假设您和您的团队需要为矩形以外的形状创建类。您可以想出多少种不同的方法来设计该课程?十?十五?这是一个简单的问题。想象一些更复杂的事情。您和您的团队可以想出一百种方法。然后你将面临将它们编织成一个连贯程序的艰巨任务。这将我们带到下一点:定义实现。

  2. Java 中的抽象方法允许定义使用和实现——当您使用抽象类或接口时,通过设计抽象方法,您正在定义其他人将如何与您的接口交互。这让他们知道他们应该使用哪些变量以及他们可以期望哪些返回类型。
    虽然他们可以覆盖它们并创建以独特方式实现您的接口的具体类,但您仍然为您的代码设定了核心用途。如果有人想实现 Shape,那么他们必须覆盖或实现周长和面积。

  3. 可读性和调试—​​—拥有抽象方法将增强代码的可读性。当您编写实现接口的类时,您知道要寻找什么。您知道接口中的每个抽象方法都将在实现中,这使得阅读和跟踪任何错误变得更加容易。抽象方法只是学习如何在 Java 和其他面向对象语言中正确使用多态性的开始。当您开始理解和使用它们时,您的编码之旅将开启全新的篇章。

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION