JAVA种用一个类去调用一个接口的多个实现类

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA种用一个类去调用一个接口的多个实现类相关的知识,希望对你有一定的参考价值。

我建了Carinterface这个接口,包含2个属性(name,price),我又建了3个这个接口的实现类(Car1,Car2,Car3),现在。我建了Car这个类,用来输出3个实现类的属性值;部分代码如下:

//接口代码
public interface Carinterface
public String getName();
public int getPrice();



//Car1代码(Car2、Car3和Car1代码相同,但是值不同,这里不写了)
public class Car1 implements Carinterface

String name = "A6";
int price = 123456;

public String getName()
return name;

public int getPrice()
return price;


现在,我要让Car这个类来输出3个实现类的输出值我要怎么写Car的代码?如果接口的实现类有很多怎么办,有什么方法能够遍历这个接口的所有实现类,输出所有的返回值。
如果这个接口的实现类有100个或更多呢?难道一定要一个一个添加吗。那用接口不是更麻烦吗?

如果接口的实现类有很多,那么你可以像下面这样,把所有实现类的类名在一个地方定义。可以是一个property文件, 可以是数据库,也可以直接写在代码里。也可以用工厂模式,也可以用代理,spring等等,方法很多,就不一一列举了。。。
public class Car
public static void main(String[] args) throws Exception
List<String> classList = new ArrayList<String>();
classList.add("Car1");
classList.add("Car2");
for(String className : classList)
Carinterface car = (Carinterface) Class.forName(className).newInstance();
System.out.println(car.getName() + " : " + car.getPrice());


参考技术A public class Car

Carinterface a,b,c;

void set(Car1 a,Car2 b,Car3 c,)

this.a=(Carinterface)a; //做类型转换,说是强转也可以
this.b=(Carinterface)b;
this.c=(Carinterface)c;


void getPrice()

System.out.println(a.getPrice()); //输出Car1类的实现
System.out.println(b.getPrice()); //输出Car2类的实现
System.out.println(c.getPrice()); //输出Car3类的实现



//因为a,b,c是Carinterface类型的。
但是传入的是Car1,Car2,Car3类型的,会被自动转换为Carinterface类型
通过接口函数调用的时候,虽然都是Carinterface类型
但是会自动调用到Car1,Car2,Car3类型的个子的 getPrice实现方法。

Java复习_4 接口多态和内部类

△abstract不可以修饰成员变量
△一个类可以没有抽象方法,可以定义为抽象类,这样的目的是不能让其他类建立本类对象,交给子类完成.
△abstract和static(可以被类名调用方法,但是抽象方法调用没有意义)final(不能被覆盖方法)private(私有方法无法覆盖)
△接口只能被实现.被用接口去继承或者用类或者抽象类去实现
△接口中定义的变量全部是常量.关键修饰符为Public static final.接口中没有构造方法,实现接口的类构造方法访问的是object,接口中的方法是Public,因此实现需要注意一定是public
△接口可以没有需要实现的方法.
△接口与类是实现关系,接口与接口之间是继承关系,可以多继承.
△抽象类:被继承体现的是is a关系.定义了共性的功能
 接口是like a关系,定义的是扩展功能
△  javac-d<my_dir> Myprogram.java:就是将Myprogram.java程序里产生的  .class  文件放在 my_dir  目录里,用于生成类文件的包..可以javac -d .Myprogram.java.(当前路径下生成类文件的包)
△import导入*,代表代表通配符,它会在包下挨个匹配,找到后就导入.
访问权限:
            本类              同一包内的子类和无关类     不同包下的子类      不同包下的无关类
private      Y                        N                          N               N
default      Y                        Y                          N               N
protected    Y                        Y                          Y               N
public       Y                        Y                          Y               Y 
△内部类:
      Outer.Inner oi=new Outer().new Inner();
  内部类可以直接访问外部类的私有成员.
静态内部类:
     Outer.Inner oi=new Outer.Inner();
方法中的局部内部类访问局部变量局部变量必须要加final修饰.因为当调用这个方法的时候,局部变量如果没有被final所修饰的话,他的生命周期应当和方法的生命周期是一样的,方法弹栈的时候,局部变量将会消失,这时候如果局部内部类没有被回收走,想要去使用这个方法的时候,就会产生问题.
△匿名内部类只有重写单个方法的时候使用.
△当内部类是成员的时候,要再主函数中访问它,必须要加static
△当重写equals方法时,注意参数是Object,否则就不是重写而是重载了.
△equals与==的区别:equal只能对于引用数据类型进行比较,但是==号能对引用数据类型和基本数据类型都进行比较,equals底层依赖的就是==,一般需要重写equals方法.
△Scanner hasnextInt()判断接下来的数是否是整数,判断后,在调用nextInt():获取输入的整数,.标准格式如下:
 if(i.hasnextInt()) {
     int x=i.nextInt();
}
  当nextInt()和nextLine()作组合的时候,nextInt()在前面的时候,nextInt()获取整数后,不会再获取回车符,因此会被nextLine()所获取而得知该行已结束,因此不会再输出其他内容.
  解决方案1:创建两次Scanner对象2.都用nextLine()方法,随后在转换为整数.

以上是关于JAVA种用一个类去调用一个接口的多个实现类的主要内容,如果未能解决你的问题,请参考以下文章

Java使用Hutool调用WebService接口详解

创建一个类去实现javax.servlet.servlet接口,为啥报错

Java复习_4 接口多态和内部类

Java中的接口怎么实现?

java设计模式---代理模式(案例解析)

Java之多线程方式二(实现Runnable接口)