“实现”在类上的作用是什么?
如果一个类实现了另一个类...那是什么意思?我发现这个代码示例:http://www.java2s.com/Code/Php/Class/extendsandimplement.htm
但不幸的是,它没有任何解释...
如果一个类实现了另一个类...那是什么意思?我发现这个代码示例:http://www.java2s.com/Code/Php/Class/extendsandimplement.htm
但不幸的是,它没有任何解释...
实现意味着它采用接口指定的指定行为。请考虑以下接口:
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!";
}
}
和 类都实现了接口。Cat
Dog
ISpeak
接口的优点在于,我们现在可以通过接口引用此类的实例。请考虑以下示例: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);
这段代码所做的是为类提供了自然的顺序。因为我们实现了接口,所以我们能够利用该方法按对象的自然排序(在本例中为按姓氏)对对象进行排序。Person
Comparable
Collections.sort()
List
Person
你应该研究Java的接口。快速的谷歌搜索显示这个页面,看起来相当不错。
我喜欢将 a 视为某种“承诺”:任何实现它的类都具有可以预期的某些行为,因此您可以将实现类的实例放入接口类型引用中。interface
一个简单的例子是接口。通过在您自己的类中实现此接口中的所有方法,您可以声称您的对象彼此“可比较”,并且可以部分排序。java.lang.Comparable
实现接口需要两个步骤:
接口中只有一个方法, .因此,您需要提供该方法。java.lang.Comparable
public 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中,拥有公共字段通常是不好的做法,但我打算这是一个非常简单的普通数据类型,所以我不关心公共字段!
如果我希望能够比较两个实例(也许是为了排序目的?),我可以通过实现接口来做到这一点。为此,需要做两件事:提供定义并声明接口已实现。RationalNumber
java.lang.Comparable
compareTo
以下是充实的类可能的外观:
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.Comparable
String
Integer
RationalNumber
注意:我在这个答案中使用了Java 1.4的实践。 现在是一个通用接口,但我没有时间解释泛型。java.lang.Comparable