JavaRush /Java 博客 /Random-ZH /接口中的默认方法

接口中的默认方法

已在 Random-ZH 群组中发布
Java 的每个新版本都与以前的版本不同。下面是我们介绍的材料中的更改示例: 在 Java 5 之前,该enum语言中没有 '。
接口中的默认方法 - 1
同样,Java 8 与 Java 7 也有明显不同。我们的大部分讲座都是用该语言的第 7 版编写的,但是,我们当然不会忽视重要的创新。由于我们在本次讲座中讨论的是接口,因此让我们看一下接口中的一个更新 - 默认方法。您已经知道接口不实现. 它的任务是描述实现它的所有对象应该具有什么行为。但开发人员经常遇到这样的情况:所有类中方法的实现都是相同的。让我们看一下旧车的例子:
public interface Car {

   public void gas();

   public void brake();
}
public class Sedan implements Car {

   @Override
   public void gas() {
       System.out.println("Газ!");
   }

   @Override
   public void brake() {
       System.out.println("Тормоз!");
   }
}


public class Truck implements Car {

   @Override
   public void gas() {
       System.out.println("Газ!");
   }

   @Override
   public void brake() {
       System.out.println("Тормоз!");
   }
}


public class F1Car implements Car {
   @Override
   public void gas() {
       System.out.println("Газ!");
   }

   @Override
   public void brake() {
       System.out.println("Тормоз!");
   }
}
您认为这段代码的主要问题是什么?您可能注意到我们写了一堆相同的代码!这个问题在编程中很常见,应该避免。另一件事是,在 Java 8 发布之前,没有特殊的解决方案选项。当这个版本发布时,可以定义默认方法并在接口内实现它们!其操作方法如下:
public interface Car {

   public default void gas() {
       System.out.println("Газ!");
   }

   public default void brake() {
       System.out.println("Тормоз!");
   }
}

public class Sedan implements Car {

}

public class Truck implements Car {

}

public class F1Car implements Car {

}
现在,对于所有机器都相同的方法gas()brake()已包含在界面中,并且不需要重复的代码。而且,每个类中都提供了这些方法!
public class Main {

   public static void main(String[] args) {

       F1Car f1Car = new F1Car();
       Sedan sedan = new Sedan();
       Truck truck = new Truck();
       truck.gas();
       sedan.gas();
       f1Car.brake();
   }
}
如果有 100 个类都有一个方法gas(),但其中只有 99 个具有相同的行为怎么办?这会毁了一切,默认方法在这种情况下不起作用?当然不是:) 接口的默认方法可以被覆盖。
public class UnusualCar implements Car {
   @Override
   public void gas() {
       System.out.println("Эта машина газует по-другому!");
   }

   @Override
   public void brake() {
       System.out.println("Эта машина тормозит по-другому!");
   }
}
所有其他 99 种类型的机器都将实现默认方法,并且该类UnusualCar(例外)不会破坏整体情况,并将冷静地确定其行为。接口中的多重继承 正如您所知,Java 中不存在多重继承。造成这种情况的原因有很多;我们将在单独的讲座中详细讨论它们。在其他语言中,例如在 C++ 中,情况正好相反。如果没有多重继承,就会出现一个严重的问题:同一个对象可以有许多不同的特征和“行为”。生活中的例子:对于父母来说我们是孩子,对于老师来说我们是学生,对于医生来说我们是病人。在生活中,我们扮演不同的角色,相应地表现也不同:我们与老师的交谈显然不同于与亲密朋友的交谈。让我们尝试将这种情况转化为代码。假设我们有两个类:Pond 和 Aviary。对于池塘来说,你需要游泳的鸟,而对于鸟舍来说,你需要飞翔的鸟。为此,我们创建了两个基类 -FlyingBirdWaterfowl
public class Waterfowl {
}

public class FlyingBird {
}
因此,我们将把类别继承于 的鸟送到鸟舍FlyingBird,将继承自 的鸟送到池塘Waterfowl。一切看起来都很简单。但是如果我们需要在某个地方识别鸭子,我们该怎么办呢?她既会游泳又会飞。但我们没有多重继承。幸运的是,Java 提供了多种接口实现。如果一个类不能从多个父类继承,那么实现多个接口就很容易了!我们的鸭子既可以飞也可以游泳:)使用接口FlyingBird而不是Waterfowl类就足以达到预期的结果。
public class Duck implements FlyingBird, Waterfowl {

   //методы обоих интерфейсов легко объединяются в одном классе

   @Override
   public void fly() {
       System.out.println("Летим!");
   }

   @Override
   public void swim() {

       System.out.println("Плывем!");
   }
}
因此,我们的程序保留了灵活的类管理,并且结合默认方法的实现,我们定义对象行为的能力几乎变得无限!:)
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION