Java 向学生解释界面

Java 向学生解释界面,java,interface,Java,Interface,几年来,我一直是一年级本科生编程模块Java入门课程的助教 大多数情况下,它进行得很顺利,我们成功地让学生们很好地理解了面向对象编程,但学生们很少看到的一点是接口 我们给出的几乎所有解释要么过于做作,对学习毫无用处,要么与他们作为初学者的地位相去甚远。我们经常得到的反应是“我……明白了”,翻译成“我不明白,它们听起来没什么用处” 这里有没有人能成功地教给学生关于接口的知识?我不再是一名助教了,但它总是对我唠叨不休。在前面的问题中,有一些很好的场景可以解释为什么要使用接口 “在类是某种东西的地方,

几年来,我一直是一年级本科生编程模块Java入门课程的助教

大多数情况下,它进行得很顺利,我们成功地让学生们很好地理解了面向对象编程,但学生们很少看到的一点是接口

我们给出的几乎所有解释要么过于做作,对学习毫无用处,要么与他们作为初学者的地位相去甚远。我们经常得到的反应是“我……明白了”,翻译成“我不明白,它们听起来没什么用处”


这里有没有人能成功地教给学生关于接口的知识?我不再是一名助教了,但它总是对我唠叨不休。

在前面的问题中,有一些很好的场景可以解释为什么要使用接口

“在类是某种东西的地方,接口通常会做一些事情。所以我可能有一辆车,但我不会去“携带”,但我可能会去驾驶……所以我的车可能会实现“可驾驶”接口。”

编辑:

马克提出了一个好观点。接口根本不做任何事情,而是定义发生的行为。此外,他还提出了一个很好的观点,即不想让观众感到困惑。并不是说混淆经验丰富的开发人员是可以的,但混淆一个全新的学生绝对不是一个好主意。鉴于此,我正在将我的一行修改为多行


“类定义存在,接口定义行为。类定义事物是什么,接口定义事物做什么。所以我可能有一辆汽车,它有发动机,它有多少汽油,它的历史MPG是什么,等等,但我永远不会去”carring““.另一方面,我可能会去开车。。。我的车能开吗?如果我给它一个驱动方法,它可以。我也可以有一个“可驾驶”的界面,带有驾驶方法,由汽车决定驾驶的真正含义。现在,如果我只有车的话,有一个界面也没什么大不了的。但是卡车呢?如果它们都是可驱动的,我只需要一个
列表接口就可以查看一个类需要做什么。例如,你可以有一个动物接口,比如说有一个名为speak()的方法,每个动物都会说话,但它们的表达方式都不一样,但这允许你将任何实现动物对动物的东西进行转换,这样你就可以有一个动物列表,让它们都会说话,但使用它们自己的实现。接口只是这类东西的包装。你也教JDBC吗?以它为例。这是一个很好的真实世界的例子,说明了接口是多么强大。在JDBC中,您正在针对一个API编写代码,该API几乎只有几个接口。JDBC驱动程序是具体实现。您可以轻松地在许多数据库上重用JDBC代码,而无需重写代码。您只需切换JDBC驱动程序实现JAR文件和驱动程序类名,就可以让它在另一个DB上工作

至少,使用接口可以让您在某种程度上改变具体实现(负责行为的代码逻辑),而无需重写整个代码。试着用真实世界的例子来解释事情。这会更有意义。

这是最好的解释:(从这里引用)

在软件工程中,有许多情况下,不同的程序员群体必须同意一份“合同”,该合同详细说明了他们的软件是如何交互的。每个小组都应该能够编写自己的代码,而不知道另一组的代码是如何编写的。一般来说,接口就是这样的契约。 例如,想象一个未来社会,计算机控制的机器人汽车在没有人工操作的情况下运送乘客穿过城市街道。汽车制造商编写软件(当然是Java)来操作汽车的停止、启动、加速、左转等等。另一个工业集团,电子导航仪器制造商,制造计算机系统,接收GPS(全球定位系统)位置数据和交通状况的无线传输,并使用这些信息驾驶汽车

汽车制造商必须发布一个行业标准界面,详细说明可以调用哪些方法使汽车移动(任何汽车,来自任何制造商)。然后,导航制造商可以编写软件,调用界面中描述的方法来指挥汽车。两个工业集团都不需要知道另一个集团的软件是如何实现的。事实上,每个集团都认为其软件具有高度的专有性,并保留随时对其进行修改的权利,只要它继续遵守已发布的界面


更多链接:

如果你想向初学者解释,我会坚持界面可以促进代码重用和代码模块化的观点:

例如,假设我们要绘制一些对象:

public class Painter {
    private List<Paintable> paintableObjects;

    public Painter(){
       paintableObjects = new ArrayList<Paintable>();
    }

    public void paintAllObjects(){
        for(Paintable paintable : paintableObjects){
            paintable.paint();
        }
    }
}

public interface Paintable {
     public void paint();
}
公共类画师{
私有列表可绘制对象;
公共画家(){
paintableObjects=newarraylist();
}
公共空间paintAllObjects(){
用于(可绘制:可绘制对象){
paintable.paint();
}
}
}
公共界面可绘制{
公共空间涂料();
}
现在,您可以向学生解释,如果没有可绘制的界面,Painter对象将需要具有绘制特定类型对象的方法,例如名为
paintFences()
paintRocks()的方法
对于我们希望画家能够绘制的每种类型的对象,我们都需要一个新的
集合

但谢天谢地,我们有接口可以轻松绘制对象,而对象的绘制方式完全取决于实现可绘制接口的类

编辑

我忘了提到的另一个好处是
public interface Plumber
{ //silly code here }
public class Rick extends Person implements SoftwareDeveloper, Plumber
Plumber thePlumber = rick;
thePlumber.fixLeak(myHouse.bathroom.leak) // =(
abstract class Base {
  public void behavior() {};
};

class ClassA extends Base {
  public void behavior() {
    System.out.println("ClassA implementation of Base behavior");
  }
};

class ClassB {
  public void behavior() {
    System.out.println("ClassB's version of behavior");    
  }
}

public class InterfaceExample {

  public void processBase (Base i) {
    i.behavior();
  }

  public static void main (String args[]) {
      InterfaceExample example = new InterfaceExample();
      example.processBase(new ClassA());
  }   
}
public class Settings { String[] keys; int values; }
public class Car { Engine engine; int value; }
public class Surface { int power; int elseInt; }
// and maaany more (dozens...)
String[] toArrayString()
public class Settings { String[] keys; int values; public String[] toArrayString {...} }
public class Car { Engine engine; int value; } // THIS NOT
public class Surface { int power; int elseInt; public String[] toArrayString {...} }
// and maaany more (dozens...)
public void createTable() {
    for(Object obj : allObjects) {
       if(obj instanceof Settings) {
          Settings settings = (Settings)obj;
          table.add(settings.toArrayString());
       }
       if(obj instanceof Surface) {
          // cast...
       }
       // etc multiple times...
    }
}
public interface ISimpleInterface { String[] toArrayString; }

public class Settings implements ISimpleInterface { String[] keys; int values; public String[] toArrayString {...} }
public class Car { Engine engine; int value; } // THIS NOT
public class Surface implements ISimpleInterface { int power; int elseInt; public String[] toArrayString {...} }

public void createTable() {
    for(Object obj : allObjects) {
       if(obj instanceof ISimpleInterface) {
          ISimpleInterface simple = (ISimpleInterface)obj;
          table.add(simple.toArrayString());
       }
    }
}
public class Facebook {
    public void showFacebook() {
        // ...
    }
}
public class YouTube {
    public void showYouTube() {
        // ...
    }
}
public class StackOverflow {
    public void showStackOverflow() {
        // ...
    }
}
public class ClientWithoutInterface {
    public static void main(String... args) {
        String websiteRequested = args[0];
        if ("facebook".equals(websiteRequested)) {
            new Facebook().showFacebook();
        } else if ("youtube".equals(websiteRequested)) {
            new YouTube().showYouTube();
        } else if ("stackoverflow".equals(websiteRequested)) {
            new StackOverflow().showStackOverflow();
        }
    }
}
public interface Website {
    void showWebsite();
}
public class Facebook implements Website {
    public void showWebsite() {
        // ...
    }
}
public class YouTube implements Website {
    public void showWebsite() {
        // ...
    }
}
public class StackOverflow implements Website {
    public void showWebsite() {
        // ...
    }
}
public class ClientWithInterface {
    public static void main(String... args) {
        String websiteRequested = args[0];
        Website website;
        if ("facebook".equals(websiteRequested)) {
            website = new Facebook();
        } else if ("youtube".equals(websiteRequested)) {
            website = new YouTube();
        } else if ("stackoverflow".equals(websiteRequested)) {
            website = new StackOverflow();
        }
        website.showWebsite();
    }
}
public class ClientWithALittleHelpFromFriends {
    public static void main(String... args) {
        WebsiteFinder finder = new WebsiteFinder();
        WebsiteRenderer renderer = new WebsiteRenderer();
        renderer.render(finder.findWebsite(args[0]));
    }
}
public class WebsiteFinder {
    public Website findWebsite(String websiteRequested) {
        if ("facebook".equals(websiteRequested)) {
            return new Facebook();
        } else if ("youtube".equals(websiteRequested)) {
            return new YouTube();
        } else if ("stackoverflow".equals(websiteRequested)) {
            return new StackOverflow();
        }
    }
}
public class WebsiteRenderer {
    public void render(Website website) {
        website.showWebsite();
    }
}
public class Rick extends Person implements SoftwareDeveloper, Plumber
public class Zoe  extends Person implements SoftwareDeveloper, Chef
public class Paul extends Person implements Plumber, Chef
public class Lisa extends Person implements Plumber
public class Plane extends Vehicle implements Fly, PassengerTransport, Serviceable
public class Train extends Vehicle implements PassengerTransport, Serviceable
public class Bird  extends Animal  implements Fly