在Servie层创建Dao对象时,以及在Controller层创建Service对象时,发现与我之前了解的声明变量的方法不一样。具体关键代码如下:
其中EmpService和EmpDao都是接口类,EmpServiceA和EmpDaoA都是接口实现类
后来查询发现这是使用接口类型声明变量,而以前我仅仅了解使用具体实体类型声明变量、以及上转型对象。
在查询后发现Java中发现声明对象的类型有以下5中
- 使用接口类型声明对象(面向接口进行编程)
- 使用具体实体类声明(面向对象进行编程)
- 使用父类类型声明对象(上转型对象)
- 使用匿名类声明对象
- 使用数组声明对象
- 使用泛型声明对象
目前在学习过程中,只遇到1、2两种,就先解析这两种
假设我们有一个简单的接口 Shape,其中定义了一个计算面积的方法 calculateArea():
public interface Shape {
double calculateArea();
}
现在我们有两个实现类 Circle 和 Rectangle,分别实现了 Shape 接口:
public class Circle implements Shape {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public double calculateArea() {
return Math.PI * radius * radius;
}
}
public class Rectangle implements Shape {
private double length;
private double width;
public Rectangle(double length, double width) {
this.length = length;
this.width = width;
}
@Override
public double calculateArea() {
return length * width;
}
}
现在我们来看一下使用不同变量声明类型的例子:
使用接口类型声明变量:
Shape shape1 = new Circle(5.0);
System.out.println(shape1.calculateArea()); // 输出:78.53981633974483
Shape shape2 = new Rectangle(4.0, 6.0);
System.out.println(shape2.calculateArea()); // 输出:24.0
通过使用接口类型 Shape 声明变量,我们可以根据需要灵活地选择具体的实现类来创建对象。这样,我们可以统一对待不同类型的形状,只关注它们共同拥有的方法。
使用具体实现类类型声明变量:
Circle circle = new Circle(5.0);
System.out.println(circle.calculateArea()); // 输出:78.53981633974483
Rectangle rectangle = new Rectangle(4.0, 6.0);
System.out.println(rectangle.calculateArea()); // 输出:24.0
通过使用具体实现类类型声明变量,我们限定了变量只能引用相应的具体类型对象。这样会导致在代码中对具体类型进行硬编码,而不是针对接口进行编程。
总结:
使用接口类型声明变量可以实现多态性(实现不同类中的方法),提高代码的灵活性和可替换性。
使用具体实现类类型声明变量则限制了变量类型(只能是该类型的变量),增加了耦合性并降低了代码的扩展性。