Java进阶

Java进阶

注解

最早使用的注解:方法重写@Override

什么是注解?

Java中的注解也称标注,可以对类、方法、属性、参数、包等进行标注,然后让编译器或运行时其他类进行解析,完成某个功能。

注解也可以编译到字节码文件中。

内置注解

Java中已经定义好的注解:

  • @Override-检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。
  • @Deprecated-标记过时方法。如果使用该方法,会报编译警告。
  • @SuppressWarnings-指示编译器去忽略注解中声明的警告。
  • @FunctionalInterface-用于指示被修饰的接口是函数式接口。

元注解

元注解是Java API提供的,用于修饰注解的注解。通常用在注解的定义上:

  • @Retention-标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问。
  • @Documented-标记这些注解是否包含在用户文档中。
  • @Target-标记这个注解是那种Java成员变量。
  • @Inherited-标记这些注解是继承于哪个注解类(默认注解并没有继承于任何子类)
  • @Repeatable-标识注解可以在同一个声明上使用多次。

自定义注解

对象克隆(对象复制)

为什么要克隆?new出来的对象的属性还是初始化时候的值,所以当需要一个新的对象来保存当前对象的"状态"就靠clone方法了。

将一个已经存在的对象以及对象数据克隆到另一个对象中。

如何实现克隆?

类实现Cloneable接口

重写Object类中clone()

在重写的clone方法中,调用父类clone方法返回一个新对象

克隆分为浅克隆,深克隆

浅克隆

克隆一个对象时,如果对象中有关联的对象,只将关联对象的地址复制过来,那么称为浅克隆

深克隆

克隆一个对象时,如果对象中有关联的对象,将关联对象也一同克隆(创建一个新对象),那么称为深克隆

如何做到深克隆?

方式一:在每一层类中都重写clone方法(类实现Cloneable接口),层级多了就比较麻烦;

方式二:以序列化方式实现深克隆。对象的输入和输出流

设计模式

设计模式最早诞生于建筑领域,后来被引入到软件设计领域。

设计模式:之前的程序员,在实际开发中,对于一些经常出现的问题,进行总结,这些被优化后的解决方案被称为设计模式。

为什么要学习设计模式?

  1. 首先学习设计模式是对面向对象设计的应用。
  2. 是对面向对象设计原则,封装、继承、多态以及类与类之间关系的应用
  3. 可以提高我们的设计能力,有助于阅读源码
  4. 提升程序可维护性、可复用性、可扩展性(在程序后期添加新功能时成本最低,尽量不影响之前的功能)
统一建模语言(UML)

UML:帮助开发人员进行设计的语言,使用各种图形符号,来表示各模块之间的关系。

Java语言基本单位:

接口
类之间的关系
  1. 依赖关系:在一个类中的方法中,使用到了另一个,具有临时性(依赖 use-a)
  2. 关联关系:把一个类当作对另一个类的属性(学生关联宿舍has-a)
    组合中还可以根据强弱分为聚合关系和组合关系
  • 聚合关系
  • 组合关系
  1. 继承关系
  2. 实现关系
面向对象设计原则
1. 单一职责

:最简单的面向对象设计原则,用于控制类的粒度大小。
优点:低耦合,高内聚。

2. 开闭原则

开闭原则即对扩展开放,对修改封闭。为了满足开闭原则,需要对系统进行抽象化设计,抽象化是开闭原则的关键。在进行软件设计时,一般先评估出最有可能发生变化的类,然后构造抽象来隔离那些变化。

3. 里氏替换原则

继承必须确保超类所拥有的性质在子类中仍然成立。
所有使用父类的地方必须能透明的使用其子类对象。

在使用继承关系时,在子类中重写父类方法时,不要在重写对子类运行结果产生影响。子类原来调用父类方法,重写父类方法后,调用的是子类自己方法,导致结果产生影响。

4. 依赖倒置

上层模块不应该依赖底层模块,它们都应该依赖于抽象。

如果有多个同类型事物时,我们可以抽取一个共同的抽象层,具体的实现细节应该依赖于抽象。

5. 接口隔离

接口隔离:使用多个接口,而不总使用单一的总接口,不强迫新功能实现不需要的方法。

可以根据不同的功能设计接口,不要将所有的功能设计到一个接口中,让子类可以根据自己的需要去实现不同的接口,不用实现一些不必要的功能。

6. 迪米特原则(最少知识原则,降低类之间的耦合)

迪米特原则:要求一个对象应该对其他对象有最少的了解。(只和你的直接朋友交谈,不跟"陌生人"说话)

7. 组合/聚合复用原则
相关推荐
松仔log38 分钟前
JetPack——Paging3+Room
android·java·zoom
㳺三才人子6 小时前
初探 Flask
后端·python·flask·html
星栈独行6 小时前
我在 Rust 全栈项目里用 JWT 做无状态认证
开发语言·后端·rust·前端框架·开源·github·web
Lei活在当下6 小时前
先用起来,再理解,关于协程Coroutine应该知道的事
android·java·jvm
Java爱好狂.6 小时前
Java程序员体系化学习路线(2026最新版)
java·后端·java面试·java架构师·java程序员·java八股文·java学习路线
陈随易6 小时前
Redis 8.8发布,一定要更新
前端·后端·程序员
tongluowan0077 小时前
以ReentrantLock为例解释AQS的工作流程
java·模板方法模式·aqs·reentrantlock
装不满的克莱因瓶7 小时前
SpringBoot 如何将 lib 目录中jar包打包进最终的jar包里面
spring boot·后端·maven·jar·mvn
Raink老师7 小时前
【AI面试临阵磨枪-62】设计基于 RAG 的内部知识库问答平台(多租户、权限、文件上传、实时更新)
人工智能·面试·职场和发展
ltl7 小时前
Transformer 原论文实验结果:为什么 28.4 BLEU 足以改写路线图
后端