普通的一个普通猿 2024-04-11 15:39 采纳率: 84.4%
浏览 8

举例说明并对比Java中接口与抽象类的区别与使用场景?

举例说明并对比Java中接口与抽象类的区别与使用场景。 什么是依赖注入(DI),为什么在Java企业级应用中广泛采用?

  • 写回答

7条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-04-11 15:39
    关注

    引自免费微信小程序:皆我百晓生

    在Java编程语言中,接口(Interface)和抽象类(Abstract Class)都是实现多态性的机制,但它们之间存在一些关键区别。

    接口(Interface):

    1. 接口是一个完全抽象的类型,它只包含常量和抽象方法。
    2. 类可以实现多个接口,通过逗号分隔。
    3. 接口中所有的成员默认是public访问修饰符,常量默认为final并且必须初始化,方法默认为public abstract。
    4. 接口不能包含构造函数,也不能实例化。

    例如:

    interface Animal {
        default void sound() { // 默认方法
            System.out.println("Animal makes a sound");
        }
        void eat();
    }
    

    抽象类(Abstract Class):

    1. 抽象类也可以包含抽象方法和非抽象方法(包括构造函数、静态方法等)。
    2. 一个类只能继承一个抽象类,但是可以通过组合方式间接实现多重继承。
    3. 抽象类中的成员默认访问权限由其修饰符决定,如果没有指定,则默认为包内可见。
    4. 抽象类可以有构造函数,可以实例化子类对象。

    例如:

    abstract class Mammal implements Animal {
        protected String species;
    
        public Mammal(String species) {
            this.species = species;
        }
    
        @Override
        public void eat() {
            System.out.println(species + " eats.");
        }
    
        abstract void move(); // 抽象方法
    }
    

    使用场景:

    • 接口:当您想定义一组行为规范,而不想关心这些行为的具体实现时,应该使用接口。比如,Runnable接口表示线程可执行的任务,不同类可以实现这个接口来提供不同的任务执行逻辑。

    • 抽象类:当您有一个基类,其中包含所有子类共享的一些具体实现,并且有一些通用的行为需要被强制执行时,可以使用抽象类。例如,如果您正在创建一个图形库,可能会有一个抽象的Shape类,其中包含公共属性(如颜色和填充状态)和方法(如获取面积和绘制),然后派生出具体的形状类(如CircleRectangle)。

    依赖注入(Dependency Injection,DI): 依赖注入是一种设计模式,它允许外部对象将依赖项传递给其他对象,而不是让对象自己去创建或查找依赖项。这样做的好处包括降低耦合度、提高测试性和促进模块化。在Java企业级应用中,DI通常通过框架(如Spring)实现,通过配置文件或注解来声明依赖关系,框架会负责创建和管理对象的生命周期。

    例如,在Spring框架中,我们可以通过@Component和@Autowired注解实现依赖注入:

    // 定义一个服务接口
    @Service
    public interface UserService {
        User getUserById(int id);
    }
    
    // 实现UserService接口的类
    @Service
    public class UserDetailsServiceImpl implements UserService {
        //...
    }
    
    // 在需要使用UserService的地方,通过@Autowired注解自动注入
    @RestController
    public class UserController {
        @Autowired
        private UserService userService;
    
        @GetMapping("/users/{id}")
        public ResponseEntity<User> getUser(@PathVariable int id) {
            return new ResponseEntity<>(userService.getUserById(id), HttpStatus.OK);
        }
    }
    

    在这个例子中,UserController不需要知道如何创建UserDetailsService对象,Spring框架会根据注解自动创建并注入到UserController中。这就是依赖注入的概念。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月11日