Answers:
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
我建议您对面向对象编程中的动态绑定,多态性和一般继承性进行更多研究
default
在接口中实现方法的行为,从而使这些方法的自定义实现成为可选项。因此,语句“您只能指定方法,而不能实现方法”仅对Java 7及以下版本完全正确。
public interface ListIterator<E> extends Iterator<E>
通常工具用于实现一个接口和延伸用于扩展的基类的行为或抽象类。
extend:派生类可以扩展基类。您可以重新定义已建立关系的行为。派生类“ 是 ”基类类型
实现:您正在执行合同。实现接口“的类具有 ”功能。
在Java 8发行版中,interface可以在interface中具有默认方法,该方法在interface本身中提供实现。
有关何时使用它们的信息,请参考此问题:
举例了解事物。
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;
}
public void remember(){
System.out.println("Define your own remember");
}
public void protectOwner(){
System.out.println("Define your own 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
要了解的重点:
remember
()和protectOwner
()name,lifeExpentency
Animal
Cat
并Dog
通过实施该功能。Think,Learn,Apply,Climb
通过查看这些示例,您可以了解
不相关的类可以通过接口具有功能,但是相关的类可以通过扩展基类来覆盖行为。
一个class
只能“实现”一个interface
。一个类仅“扩展” a class
。同样,interface
可以扩展另一个interface
。
A class
只能互相延伸class
。一个class
可以实现多个interface
。
相反,如果您更想知道何时使用abstract class
es和interface
s,请参考此线程:接口与抽象类(通用OO)
class
只能实现一个interface
。A class
可以扩展其他几个类。我相信您已经倒退了。
界面是对对象可以执行的操作的描述...例如,当您打开电灯开关时,电灯会亮着,您不在乎如何做,只是它确实在做。在面向对象的程序设计中,接口是对象成为“ X”必须具有的所有功能的描述。同样,作为示例,任何“像灯一样动作”的东西都应具有turn_on()方法和turn_off()方法。接口的目的是允许计算机强制执行这些属性,并知道TYPE T的对象(无论接口是什么)必须具有称为X,Y,Z等的函数。
接口是一种编程结构/语法,它允许计算机在对象(类)上强制某些属性。例如,假设我们有一个汽车班,一个踏板车班和一个卡车班。这三个类中的每个类都应具有一个start_engine()操作。每个车辆的“引擎启动”方式由每个特定类别决定,但是它们必须具有start_engine操作的事实是该接口的领域。
工具用于接口,扩展用于扩展类。
为了用更简单的术语使其更加清晰,界面就像声音-界面-模型,您需要对其进行应用,遵循以及构思。
Extend用于类,在这里,您可以通过添加更多功能来扩展已存在的内容。
一些注意事项:
一个接口可以扩展另一个接口。
当您需要在实现接口还是为特定场景扩展类之间进行选择时,请去实现接口。因为一个类可以实现多个接口,但只能扩展一个类。
当子类扩展类时,它允许子类继承(重用)并覆盖超类型中定义的代码。当类实现接口时,它允许从该类创建的对象用于任何需要该接口值的上下文中。
真正的收获是,当我们执行任何事情时,它仅意味着我们按原样使用这些方法。它们的值和返回类型没有变化的余地。
但是,当我们扩展任何内容时,它将成为您课程的扩展。您可以对其进行更改,使用,重复使用,并且它不一定需要返回与超类相同的值。
仅当子类要使用已在SuperClass中声明的某些功能(方法或实例变量)时,或者如果我想略微修改SuperClass的功能(方法重写)时,才使用SubClass扩展SuperClass。但是说,例如,我有一个Animal类(SuperClass)和Dog类(SubClass),而我在Animal类中定义的方法很少。doEat(); ,doSleep(); ... 还有很多。
现在,我的Dog类可以简单地扩展Animal类,如果我希望我的狗使用在Animal类中声明的任何方法,则可以通过简单地创建Dog对象来调用这些方法。因此,通过这种方式,我可以保证我有一只狗可以进食和睡觉,并且可以做我想让它做的其他事情。
现在,想象一下,有一天,有位爱猫人士进入我们的工作空间,她试图扩展Animal类(猫也吃饭和睡觉)。她制作了一个Cat对象,并开始调用方法。
但是,例如,有人试图使Animal类成为对象。您可以说出猫如何入睡,可以说出狗如何进食,也可以说出大象如何饮水。但这对于创建Animal类的对象没有任何意义。因为它是模板,所以我们不需要任何一般的饮食方式。
因此,我宁愿创建一个抽象类,该类没有人可以实例化,但可以用作其他类的模板。
综上所述,接口不过是一个抽象类(纯抽象类),它不包含任何方法实现,而仅包含定义(模板)。因此,只要实现接口的人都知道他们拥有doEat()的模板;和doSleep(); 但是他们必须定义自己的doEat(); 和doSleep(); 方法根据自己的需要。
仅当您想重用SuperClass的某些部分时才扩展(但请记住,您始终可以根据需要覆盖SuperClass的方法),并在需要模板并实现自己定义模板时实现(根据您的需要)。
我将与您分享一段代码:您可以使用不同的输入集尝试一下,然后查看结果。
class AnimalClass {
public void doEat() {
System.out.println("Animal Eating...");
}
public void sleep() {
System.out.println("Animal Sleeping...");
}
}
public class Dog extends AnimalClass implements AnimalInterface, Herbi{
public static void main(String[] args) {
AnimalInterface a = new Dog();
Dog obj = new Dog();
obj.doEat();
a.eating();
obj.eating();
obj.herbiEating();
}
public void doEat() {
System.out.println("Dog eating...");
}
@Override
public void eating() {
System.out.println("Eating through an interface...");
// TODO Auto-generated method stub
}
@Override
public void herbiEating() {
System.out.println("Herbi eating through an interface...");
// TODO Auto-generated method stub
}
}
定义的接口:
public interface AnimalInterface {
public void eating();
}
interface Herbi {
public void herbiEating();
}
用最简单的术语来说,extends用来从类中继承,而implements用来在您的类中应用接口
扩展:
public class Bicycle {
//properties and methods
}
public class MountainBike extends Bicycle {
//new properties and methods
}
实现:
public interface Relatable {
//stuff you want to put
}
public class RectanglePlus implements Relatable {
//your class code
}
如果您仍然有困惑,请阅读以下内容:https : //docs.oracle.com/javase/tutorial/java/IandI/subclasses.html https://docs.oracle.com/javase/tutorial/java/IandI/usinginterface.html
延伸
贯彻
抽象类也像类一样,具有扩展和实现
这两个关键字与继承直接附加在一起,它是OOP的核心概念。当我们将某个类继承到另一个类时,我们可以使用扩展,但是当我们要继承某些类的接口时,我们就不能使用扩展,而应该使用工具,并且可以使用extends关键字从另一个接口继承接口。