请用易于理解的语言进行解释,或提供某篇文章的链接。
请用易于理解的语言进行解释,或提供某篇文章的链接。
extends
是用于扩展一个类。
implements
是用于实现一个接口。
接口和普通类的区别在于,在接口中你不能实现任何声明的方法。只有“实现”该接口的类可以实现这些方法。与接口相当的C++语言中的概念是抽象类(不完全相同但非常相似)。
另外,Java不支持类的多重继承。通过使用多个接口来解决这个问题。
public interface ExampleInterface {
public void doAction();
public String doThis(int number);
}
public class sub implements ExampleInterface {
public void doAction() {
//specify what must happen
}
public String doThis(int number) {
//specfiy what must happen
}
}
现在扩展一个类
public class SuperClass {
public int getNb() {
//specify what must happen
return 1;
}
public int getNb2() {
//specify what must happen
return 2;
}
}
public class SubClass extends SuperClass {
//you can override the implementation
@Override
public int getNb2() {
return 3;
}
}
在这种情况下
Subclass s = new SubClass();
s.getNb(); //returns 1
s.getNb2(); //returns 3
SuperClass sup = new SuperClass();
sup.getNb(); //returns 1
sup.getNb2(); //returns 2
请注意,实现一个接口不需要使用 @Override
标记,因为原始接口方法中没有可被覆盖的内容。
我建议你在面向对象编程中对动态绑定、多态和继承进行更多研究。
default
方法行为,使这些方法的自定义实现变成可选项。因此,关于“你只能指定方法但不能实现它们”的说法仅在Java 7及以下版本才完全正确。 - ADTCpublic interface ListIterator<E> extends Iterator<E>
。 - weiheng我注意到您的个人资料中有一些关于C++的问题。 如果您了解C++中的多继承概念(指从多个其他类继承特征的类),Java不允许这样,但它确实有关键字interface
,有点像C++中的纯虚拟类。正如许多人所提到的,您可以extend
一个类(您只能从一个类扩展),并且您可以implement
一个接口 - 但是您的类可以实现任意数量的接口。
也就是说,这些关键字及其使用规则界定了Java中多重继承的可能性(您只能有一个超类,但您可以实现多个接口)。
public class ExtendsAndImplementsDemo{
public static void main(String args[]){
Dog dog = new Dog("Tiger",16);
Cat cat = new Cat("July",20);
System.out.println("Dog:"+dog);
System.out.println("Cat:"+cat);
dog.remember();
dog.protectOwner();
Learn dl = dog;
dl.learn();
cat.remember();
cat.protectOwner();
Climb c = cat;
c.climb();
Man man = new Man("Ravindra",40);
System.out.println(man);
Climb cm = man;
cm.climb();
Think t = man;
t.think();
Learn l = man;
l.learn();
Apply a = man;
a.apply();
}
}
abstract class Animal{
String name;
int lifeExpentency;
public Animal(String name,int lifeExpentency ){
this.name = name;
this.lifeExpentency=lifeExpentency;
}
abstract public void remember();
abstract public void protectOwner();
public String toString(){
return this.getClass().getSimpleName()+":"+name+":"+lifeExpentency;
}
}
class Dog extends Animal implements Learn{
public Dog(String name,int age){
super(name,age);
}
public void remember(){
System.out.println(this.getClass().getSimpleName()+" can remember for 5 minutes");
}
public void protectOwner(){
System.out.println(this.getClass().getSimpleName()+ " will protect owner");
}
public void learn(){
System.out.println(this.getClass().getSimpleName()+ " can learn:");
}
}
class Cat extends Animal implements Climb {
public Cat(String name,int age){
super(name,age);
}
public void remember(){
System.out.println(this.getClass().getSimpleName() + " can remember for 16 hours");
}
public void protectOwner(){
System.out.println(this.getClass().getSimpleName()+ " won't protect owner");
}
public void climb(){
System.out.println(this.getClass().getSimpleName()+ " can climb");
}
}
interface Climb{
public void climb();
}
interface Think {
public void think();
}
interface Learn {
public void learn();
}
interface Apply{
public void apply();
}
class Man implements Think,Learn,Apply,Climb{
String name;
int age;
public Man(String name,int age){
this.name = name;
this.age = age;
}
public void think(){
System.out.println("I can think:"+this.getClass().getSimpleName());
}
public void learn(){
System.out.println("I can learn:"+this.getClass().getSimpleName());
}
public void apply(){
System.out.println("I can apply:"+this.getClass().getSimpleName());
}
public void climb(){
System.out.println("I can climb:"+this.getClass().getSimpleName());
}
public String toString(){
return "Man :"+name+":Age:"+age;
}
}
输出:
Dog:Dog:Tiger:16
Cat:Cat:July:20
Dog can remember for 5 minutes
Dog will protect owner
Dog can learn:
Cat can remember for 16 hours
Cat won't protect owner
Cat can climb
Man :Ravindra:Age:40
I can climb:Man
I can think:Man
I can learn:Man
I can apply:Man
理解的重点:
Animal
中的name,lifeExpentency
来扩展remember
()和protectOwner
()。Cat
和Dog
中的。Think,Learn,Apply,Climb
通过这些例子,您可以了解到:
无关的类可以通过接口具有能力,但相关的类通过扩展基类覆盖行为。
一个类只能"实现"一个接口。一个类只能"继承"一个类。同样,接口可以扩展另一个接口。
一个类只能继承一个其他的类。一个类可以实现多个接口。
如果你更关心何时使用抽象类和接口,请参考这个帖子:Interface vs Abstract Class (general OO)
这两个关键字都用于在Java语言中创建自己的新类。
区别: implements
表示您在类中使用了Java接口的元素。 extends
表示您正在创建一个基类的子类,您只能在子类中扩展一个类,但可以实现任意多个接口。
请参考oracle文档页面上有关接口的更多详细信息。
这有助于澄清接口是什么以及使用它们的约定。
Extends :该关键字用于将父类的属性引入到子类中,并且可以包含在子类中重写的已定义方法。
Implements :该关键字用于通过在子类中定义函数来实现接口(父类仅具有函数签名但没有定义)。
有一个特殊情况:“如果我想让一个新接口成为现有接口的子接口怎么办?” 在上述条件中,子接口extends父接口。
A extends B:
A和B都是类或接口
A implements B:
A是一个类,B是一个接口
在Java中不合法的情况是A是一个接口,B是一个类。