• 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("不准吸烟");

        }

      }

    );

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

  • 相关阅读:
    sql server 去掉重复项
    mvc2.0与3.0 便利一行三个元素 便利多行代码
    新距离
    Android
    Java
    计算机文化基础期末考试复习
    立体的导航条
    腾讯微博
    1637
    私有变量
  • 原文地址:https://www.cnblogs.com/konglxblog/p/16456834.html
Copyright © 2020-2023  润新知