“实现”在类上的作用是什么?

2022-08-30 13:46:00

如果一个类实现了另一个类...那是什么意思?我发现这个代码示例:http://www.java2s.com/Code/Php/Class/extendsandimplement.htm

但不幸的是,它没有任何解释...


答案 1

实现意味着它采用接口指定的指定行为。请考虑以下接口:

public interface ISpeak
{
   public String talk();
}

public class Dog implements ISpeak
{
   public String talk()
   {
        return "bark!";
   }
}

public class Cat implements ISpeak
{
    public String talk()
    {
        return "meow!";
    }
}

和 类都实现了接口。CatDogISpeak

接口的优点在于,我们现在可以通过接口引用此类的实例。请考虑以下示例:ISpeak

  Dog dog = new Dog();
  Cat cat = new Cat();

  List<ISpeak> animalsThatTalk = new ArrayList<ISpeak>();

  animalsThatTalk.add(dog);
  animalsThatTalk.add(cat);

  for (ISpeak ispeak : animalsThatTalk)
  {
      System.out.println(ispeak.talk());
  }

此循环的输出为:

树皮!
猫叫声!

接口提供了一种基于类执行的操作以通用方式与类交互的方法,而无需公开实现类是什么。

例如,Java中最常用的接口之一是Compeable。如果您的对象实现了此接口,则可以编写一个使用者可用于对对象进行排序的实现。

例如:

public class Person implements Comparable<Person>
{
  private String firstName;
  private String lastName;

  // Getters/Setters

  public int compareTo(Person p)
  {
    return this.lastName.compareTo(p.getLastName());  
  }
}

现在考虑以下代码:

//  Some code in other class

List<Person> people = getPeopleList();

Collections.sort(people);

这段代码所做的是为类提供了自然的顺序。因为我们实现了接口,所以我们能够利用该方法按对象的自然排序(在本例中为按姓氏)对对象进行排序。PersonComparableCollections.sort()ListPerson


答案 2

你应该研究Java的接口。快速的谷歌搜索显示这个页面,看起来相当不错。

我喜欢将 a 视为某种“承诺”:任何实现它的类都具有可以预期的某些行为,因此您可以将实现类的实例放入接口类型引用中。interface

一个简单的例子是接口。通过在您自己的类中实现此接口中的所有方法,您可以声称您的对象彼此“可比较”,并且可以部分排序。java.lang.Comparable

实现接口需要两个步骤:

  1. 声明接口在类声明中实现
  2. 为作为接口一部分的所有方法提供定义。

接口中只有一个方法, .因此,您需要提供该方法。java.lang.Comparablepublic int compareTo(Object other)

下面是一个示例。给定此类:RationalNumber

public class RationalNumber
{
    public int numerator;
    public int denominator;

    public RationalNumber(int num, int den)
    {
        this.numerator = num;
        this.denominator = den;
    }
}

(注意:在Java中,拥有公共字段通常是不好的做法,但我打算这是一个非常简单的普通数据类型,所以我不关心公共字段!

如果我希望能够比较两个实例(也许是为了排序目的?),我可以通过实现接口来做到这一点。为此,需要做两件事:提供定义并声明接口已实现。RationalNumberjava.lang.ComparablecompareTo

以下是充实的类可能的外观:

public class RationalNumber implements java.lang.Comparable
{
    public int numerator;
    public int denominator;

    public RationalNumber(int num, int den)
    {
        this.numerator = num;
        this.denominator = den;
    }

    public int compareTo(Object other)
    {
        if (other == null || !(other instanceof RationalNumber))
        {
            return -1; // Put this object before non-RationalNumber objects
        }

        RationalNumber r = (RationalNumber)other;

        // Do the calculations by cross-multiplying. This isn't really important to
        // the answer, but the point is we're comparing the two rational numbers.
        // And no, I don't care if it's mathematically inaccurate.

        int myTotal = this.numerator * other.denominator;
        int theirTotal = other.numerator * this.denominator;

        if (myTotal < theirTotal) return -1;
        if (myTotal > theirTotal) return 1;
        return 0;
    }
}

你可能会想,这一切的意义是什么?答案是当你看到这样的方法时:排序算法只期望“某种可比较的对象”。(请注意所有对象都必须实现的要求!该方法可以获取任何类型的可比较对象的列表,无论是s还是s或s。java.lang.ComparableStringIntegerRationalNumber

注意:我在这个答案中使用了Java 1.4的实践。 现在是一个通用接口,但我没有时间解释泛型。java.lang.Comparable


推荐