java中,某方法中含有接口做参数,为什么创建一个接口的实现类可以代替该接口作为该方法的参数?


抽象类是不能被实例化的,而接口比抽象类更加抽象,它不能有实现方法的,当接口或者抽象类作为一个参数传入时,会默认去找到子类作为对象参数传入进去;
同时
public interface CompareAble {//接口
public default Apple compare(Apple a1 , Apple a2){
return a1.getSize() > a2.getSize() ? a1 : a2;
}
}
这个没报错有点不现实吧,接口中是不能有具体的实现方法吧,接口中默认方法都是抽象方法,抽象方法是没有方法体的;

将类当成参数传入方法,其实就是将类的对象传入方法,如果是抽象类,其实就是将抽象类的子类的对象传入方法,如果是接口,其实就是将接口实现类的对象传入方法。

因为抽象类和接口是不能实例化成对象的,所以必须找它们的子类或实现类

将类当成参数传入方法,其实就是将类的对象传入方法,如果是抽象类,其实就是将抽象类的子类的对象传入方法,如果是接口,其实就是将接口实现类的对象传入方法。

因为抽象类和接口是不能实例化成对象的,所以必须找它们的子类或实现类

  1. 普通类对象当成方法参数传入

public class Person{

  public void eat(){

    System.out.println(“吃饭”);

  }

}

//方法

public static void operatePerson(Person p){ 

  p.eat();

}

//main调用方法,将person对象传入方法中

operatePerson(new person());

  1. 抽象类作为方法参数传入

//抽象类

public abstract class Animal{

  public abstratc void eat();

}

//Animal的子类

public class Cat extends Animal{

  //重写方法

  public void eat(){

    System.out.println(“猫吃鱼”);

  }

}

//main中的方法,这里要求传入Animal类,但Animal的类是一个抽象类,不能实例对象,所以只能传其子类。

function static void operateAnimal(Animal a){

  a.eat();

}

//方法的调用

Animal a = new Cat();

operateAnimal(new cat());或operateAnimal(a);

当然,还要以通过内部类一次性传参

operateAnimal(

  new Animal(){

    //重写animal抽象方法

    public void eat(){System.out.println(“猫还吃饭”);}

  }

);

要求传入父类对象,但可以传入任意子类对象,这样就使得扩展性得到提高

operateAnimal(new Cat());

operateAnimal(new Dog());

operateAnimal(new Bird());

……

传入什么类,就调用什么类的功能,这就是多态的实现。

  1. 接口实现类的对象当成方法参数传入

public interface Smoking{

  public abstract void smoking();

}

//实现类

public class Student implements Smoking{

  //实现接口方法

  public void smoking(){

    System.out.println(“抽烟中….”);

  }

}

//main中定义方法,将接口实现类当方法参数传入

public static void operateSmoking(Smoking s){

  s.smoking();

}

//方法的调用

Smoking s = new Student();

operateSmoking(s);或operateSmoking(new Student());

或用内部类传入

operateSmoking(

  new Smoking(){

    //重写接口方法

    public void smoking(){

      System.out.println(“不准吸烟”);

    }

  }

);

总结:类当成方法参数传入,其实就是传对象。抽象类和接口其实就是传其子类或实现类的对象。

原创文章,作者:745907710,如若转载,请注明出处:https://blog.ytso.com/272981.html

(0)
上一篇 2022年7月9日
下一篇 2022年7月9日

相关推荐

发表回复

登录后才能评论