如果一个方法的参数是一个接口,那么他本质上需要的是一个实现,也就是要具体化,针对这个主要有以下的几种:
1.如果这个接口有具体的实现,那么直接new A() ---->假如A是一个具体的实现
2.如果这个接口没有一个具体的实现,那么分为以下几种方式:
补充一个问题:
接口中有静态方法和默认方法的好处是:把实现这个接口的类的共性的代码放在接口中,避免了代码的冗余度和可读性
1.如果这个接口是一个函数式接口(什么是函数式接口:1.一个接口中只有一个抽象方法,2.用这个注解标注的
@FunctionalInterface 3.如果没有标注,那么如果只有一个抽象方法,jvm会自动的标识为函数式接口) 可以用下面的两种方法实现
1.匿名内部类的方法:
2.lamdba表达式实现
而这两个恒等的条件是:函数式接口.
3注意函数推导和lamdba表达式的替换使用;
3.参数行为化:策略设计模式的一种思想体现
下面是关于策略设计模式的代码以及java基础实质性应用的补充:
package com.zhoujianpeng.project.Head_First; /** * 什么是抽象类: * 为什么要用抽象类: * 把某一类事物的共性行为和特征抽取出来 * 记住:一定是有某个共性的特征的,才可以这样实现,如果没有共性的特征,一般不要这样去实现 * 所谓的组合的思想: * 就是将各个类作为成员变量,这样的一种引用关系,进行成员变量之间的组合 * <p> * 覆盖和重载之间的关系: * 具有相同的的行为,但是行为的体现关系不一样,如果子类和父类具有相同的关系 * 那么 super.fly(); 直接调用父类的方法,记住:继承是子类持有父类的特征,但是不能修改父类的特征 * 并且可以有自己的特性,但是他们的行为是一样的,而这个行为指的就是方法,而非具体的方法体; */ public abstract class Duck { protected FlyBehavior flyBehavior; protected QuackBehavior quackBehavior; public void swim() { System.out.println("All duck can swim!"); } public abstract void display(); /** * 动态改变飞行行为 */ public void setFlyBehavior(FlyBehavior flyBehavior) { this.flyBehavior = flyBehavior; } /** * 动态改变鸭叫行为 */ public void setQuackBehavior(QuackBehavior quackBehavior) { this.quackBehavior = quackBehavior; } public void performFly() { flyBehavior.fly(); } public void performQuack() { quackBehavior.quack(); } }
package com.zhoujianpeng.project.Head_First; public interface FlyBehavior { public void fly(); }
package com.zhoujianpeng.project.Head_First; public class FlyNoWay implements FlyBehavior { public void fly(){ System.out.println("我不能飞……"); } }
package com.zhoujianpeng.project.Head_First; public class FlyWithRocket implements FlyBehavior{ public void fly(){ System.out.println("带上火箭筒,飞~~~"); } }
package com.zhoujianpeng.project.Head_First; public class FlyWithWings implements FlyBehavior{ public void fly(){ System.out.println("飞~~~"); } }
package com.zhoujianpeng.project.Head_First; public class Main { public static void main(String[] args) { //组合模式---多态的进行数据的初始化 Duck mallarDuck = new MallarDuck(); Duck redHeadDuck = new RedHeadDuck(); Duck rubberDuck = new RubberDuck(); mallarDuck.display(); mallarDuck.performFly(); mallarDuck.performQuack(); System.out.println("========================"); redHeadDuck.display(); redHeadDuck.performFly(); redHeadDuck.performQuack(); System.out.println("========================"); rubberDuck.display(); rubberDuck.performFly(); rubberDuck.performQuack(); //改变行为特点 rubberDuck.setFlyBehavior(new FlyWithRocket()); rubberDuck.setQuackBehavior(new MuteQuack()); rubberDuck.performFly(); rubberDuck.performQuack(); } }
package com.zhoujianpeng.project.Head_First; public class MallarDuck extends Duck { //数据初始化,具体的行为在实例初始化的时候已近完成了; public MallarDuck() { //可飞 flyBehavior = new FlyWithWings(); //呱呱叫 quackBehavior = new Quack(); } @Override public void display() { System.out.println("看着像绿头鸭"); } }
package com.zhoujianpeng.project.Head_First; public class MuteQuack implements QuackBehavior{ public void quack(){ System.out.println("我不会叫……"); } }
package com.zhoujianpeng.project.Head_First; public class Quack implements QuackBehavior { public void quack(){ System.out.println("呱呱呱~"); } }
package com.zhoujianpeng.project.Head_First; public interface QuackBehavior { public void quack(); }
package com.zhoujianpeng.project.Head_First; public class RedHeadDuck extends Duck { public RedHeadDuck() { //可飞 flyBehavior = new FlyWithWings(); //呱呱叫 quackBehavior = new Quack(); } @Override public void display() { System.out.println("看着像红头鸭"); } }
package com.zhoujianpeng.project.Head_First; public class RubberDuck extends Duck { public RubberDuck() { //不会飞 flyBehavior = new FlyNoWay(); //吱吱叫 quackBehavior = new Squeak(); } @Override public void display() { System.out.println("看着像橡皮鸭"); } }
package com.zhoujianpeng.project.Head_First; public class Squeak implements QuackBehavior{ public void quack(){ System.out.println("吱吱吱~"); } }