在Servie层创建Dao对象时,以及在Controller层创建Service对象时,发现与我之前了解的声明变量的方法不一样。具体关键代码如下:

java interface 中声明的变量 java声明变量类型_类类型

java interface 中声明的变量 java声明变量类型_开发语言_02

 

 其中EmpService和EmpDao都是接口类,EmpServiceA和EmpDaoA都是接口实现类

后来查询发现这是使用接口类型声明变量,而以前我仅仅了解使用具体实体类型声明变量、以及上转型对象

在查询后发现Java中发现声明对象的类型有以下5中

  1. 使用接口类型声明对象(面向接口进行编程)
  2. 使用具体实体类声明(面向对象进行编程)
  3. 使用父类类型声明对象(上转型对象)
  4. 使用匿名类声明对象
  5. 使用数组声明对象
  6. 使用泛型声明对象

目前在学习过程中,只遇到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

通过使用具体实现类类型声明变量,我们限定了变量只能引用相应的具体类型对象。这样会导致在代码中对具体类型进行硬编码,而不是针对接口进行编程。

总结:

使用接口类型声明变量可以实现多态性(实现不同类中的方法),提高代码的灵活性和可替换性。
使用具体实现类类型声明变量则限制了变量类型(只能是该类型的变量),增加了耦合性并降低了代码的扩展性。