JAVA基础--db09_java继承-final-抽象类-接口

本文介绍了JAVA中的继承概念,强调子类构造函数会隐式调用父类的空参构造。同时,讲解了final关键字用于创建常量,并探讨了抽象类的特性,包括抽象函数、抽象类的实例化规则。此外,还阐述了接口的使用,包括类与接口的关系,以及如何实现接口,并指出一个类可以同时继承一个类并实现多个接口,接口间也能多继承。

子类的构造函数第一句都有一个隐式的super();

不管子类构造空不空参,调用的父类都是空参的。如果父类中没有空参的构造,子类中必须明确调用哪一个


final关键字


常量都是大写的

抽象类:

abstract classDemo{

      abstract void show();

}

抽象函数所在的类也必须是抽象的

抽象函数没有方法体,最后还是以分号结束

抽象类不能被实例化,即不能new对象。因为调用抽象方法没意义,因为没有方法体。

抽象类必须有子类覆盖了其所有的抽象方法,才能被实例化,否则还是抽象类

因为可能会有不同的子继承一个父,此时父类不能确定具体的相同的内容,所以搞成抽象的。


因为抽象要想使用需要new对象,抽象又一定是父类。所以private,final不行,static没意义,可以直接类名调用,但是抽象的没方法体。


接口:


一般类è抽象类(一般类中含有抽象方法)è接口(全是抽象方法,接口中还可以定义全局常量)

类与类之间是继承关系,类与接口之间是实现关系

class  DemoImpl implements Demo{
}

要实例化,必须覆盖接口中所有抽象方法。

一个类可以多实现,因为接口中的抽象方法没有方法体,所以不会出现不确定性

一个类在继承另一个类的同时,还可以去实现多个接口

接口与接口之间可以多继承

接口与抽象类:


 

 

 

 

先看效果: https://pan.quark.cn/s/c7070e7537b1 [!NOTE] 每到答辩季我就会喜获stars,谢谢大家的支持! 欢迎推广传播本repo(https://.com/atomiechen/THU-PPT-Theme),也欢迎贡献变体,提供更多选择 清华简约主题PPT模板 Repo stars 2020年春夏之交,答辩期间很多同学都在寻找清华主题的答辩模板。 一方面有使用LaTeX制作Beamer的模板(见Overleaf上的模板THU Beamer Theme),另一方面民间也存在着一些PPT模板。 很多人可能不适应Beamer的使用(主要是内容和排版设计不是可见即所得,定制有门槛),以及我找到的PPT模板也都不太好使(要么图案设计太复杂、不好看,要么没有制作成PPT母版导致每次使用都要复制粘贴+微调,不方便)。 我制作了清华简约主题的PPT模板,后续有新的设计我会逐渐加入,也欢迎有兴趣有想法的朋友们添砖加瓦! 内容 所有模板均为 文件。 此外也提供转换脚本用于 Pandoc自动生成PPTX。 各个版本的修改历史见 CHANGELOG.md。 下载 推荐直接从 Releases 下载最新发布版。 也可以在 仓库 单独下载所需文件。 效果 16:9比例,v1留边、v1顶边、v3留边白底、v3顶边白底: demo 16:9比例,其他风格模板:v1扁平、v2扁平、v1暗光 demo2 其他变体设计参见 variants/README.md。 使用方式 可以基于所提供的文件自行修改内容,也可以在新建的PPT文稿中应用该模板。 后者在 MS Office 2019 For Mac 的 PowerPoint 里的具体使用方式为:首先选择幻灯片尺...
<think> 嗯,用户这次问的是Java抽象类能否被Spring容器管理,这个问题涉及Spring框架的核心机制。从对话历史看,用户之前还问过MinIO端口的问题,突然转向Spring技术细节,可能是正在开发一个综合项目,需要整合存储服务和后台逻辑。 用户提供的三个引用很有价值。引用[1]明确提到抽象类不能被实例化但能被Spring管理,这和我掌握的知识一致。引用[2]解释了普通对象获取SpringBean的问题,引用[3]则给出了具体解决方案。用户应该已经查阅过资料,但需要权威确认。 需要重点澄清几个技术点:第一,Spring管理的是抽象类的具体子类实例;第二,抽象类本身确实不会被实例化;第三,@Component等注解标注抽象类时,实际注册的是其子类。用户可能混淆了“管理”和“实例化”的概念。 考虑到用户可能是中级Java开发者,解释时要避免过于理论化。应该用代码示例说明继承关系,比如抽象类加@Component、子类继承后自动注册的案例。同时要强调抽象类中@Autowired字段的注入原理——实际注入的是子类实例的依赖。 安全方面提醒:在抽象类中定义过多依赖可能导致设计问题,这点需要提及但不必过度强调。用户更关心技术可行性而非设计优劣。 相关扩展问题考虑:用户可能会追问懒加载对抽象类的影响,或者抽象类定义@Bean方法的可行性。但当前回答聚焦核心问题即可,扩展问题留到后续讨论。 </think> ### Java抽象类能否被Spring容器管理的技术解析 #### 📌 核心结论 1. **抽象类本身不能被实例化** - 抽象类无法直接创建对象实例(Java语言规范限制)[^1] - Spring容器**不会为抽象类生成Bean实例** 2. **抽象类可以被Spring管理** - 通过`@Component`/`@Service`等注解声明 - **实际管理的是其具体子类**(关键机制) ```java @Component // ✅ 合法声明 public abstract class AbstractService { @Autowired private Dependency commonDep; // 可被注入 public abstract void process(); } ``` #### 🔧 实现原理(Spring处理流程) ```mermaid graph TD A[抽象类标注@Component] --> B[Spring扫描类路径] B --> C[发现抽象类跳过实例化] C --> D[等待具体子类继承] D --> E[子类标注@Component] E --> F[Spring创建子类Bean] F --> G[注入抽象类中定义的依赖] ``` #### 💡 使用场景与示例 1. **公共依赖注入** ```java public abstract class BaseRepository { @Autowired // ✅ 子类继承时自动注入 protected JdbcTemplate jdbcTemplate; } @Repository public class UserRepository extends BaseRepository { public List<User> findUsers() { // 直接使用父类的jdbcTemplate return jdbcTemplate.query(...); } } ``` 2. **模板方法模式实现** ```java @Service public abstract class PaymentProcessor { @Autowired private AuditService auditService; // 公共依赖 public final void process() { preProcess(); doPayment(); // 抽象方法 auditService.log(); // 公共逻辑 } protected abstract void doPayment(); } @Service public class AlipayProcessor extends PaymentProcessor { @Override protected void doPayment() { // 支付宝支付实现 } } ``` #### ⚠️ 关键注意事项 1. **直接依赖注入限制** ```java // ❌ 错误用法:尝试直接注入抽象类 @Autowired private AbstractService service; // 启动报Bean创建错误 ``` - 必须通过**具体子类**使用抽象类功能 2. **抽象方法的处理规则** | 注解位置 | 是否生效 | 说明 | |---------------|---------|--------------------------| | 抽象类@Autowired | ✅ | 子类继承时自动注入 | | 抽象方法@Bean | ❌ | Spring不支持抽象@Bean方法 | 3. **代理机制冲突** - 当使用**CGLIB代理**时(如@Transactional) - 抽象类**不能是final**类(Spring需生成子类代理) #### 🌰 实践案例:抽象工具类 ```java @Component public abstract class FileUtils { @Value("${file.storage.path}") // 注入配置 protected String storagePath; public abstract void convertFormat(File file); protected void backupFile(File file) { // 公共方法 // 使用storagePath实现备份逻辑 } } @Service public class PdfConverter extends FileUtils { @Override public void convertFormat(File file) { backupFile(file); // 复用父类方法 // PDF转换实现... } } ``` #### 💎 最佳实践建议 1. **适用场景** - 多个实现类**共享依赖注入**(如DB连接、配置参数) - 需要**强制子类实现**特定方法(模板方法模式) - 跨模块**公共行为抽象**(如日志、审计) 2. **替代方案** ```java // 组合模式替代继承 @Component public class ImageProcessor { @Autowired // 依赖工具类实例 private FileOperation fileOp; public void process() { fileOp.backupFile(...); } } ``` > **本质总结**:Spring通过管理**具体子类的实例**,间接实现了对抽象类中依赖项的注入和能力复用。抽象类成为Spring容器管理边界的延伸而非直接管理对象[^1][^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值