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. 组合/聚合复用原则
相关推荐
Asthenia0412几秒前
Java 类加载规则深度解析:从双亲委派到 JDBC 与 Tomcat 的突破
后端
方圆想当图灵11 分钟前
从 Java 到 Go:面向对象的巨人与云原生的轻骑兵
后端·代码规范
Moment12 分钟前
一份没有项目展示的简历,是怎样在面试里输掉的?开源项目或许是你的救命稻草 😭😭😭
前端·后端·面试
Asthenia041222 分钟前
JavaSE Stream 是否线程安全?并行流又是什么?
后端
半部论语32 分钟前
SpringMVC 中的DispatcherServlet生命周期是否受Spring IOC 容器管理
java·后端·spring
Asthenia04121 小时前
JavaSE-常见排序:Arrays/Collections/List/StreamAPI
后端
IT瘾君1 小时前
Windows中IDEA2024.1的安装和使用
java·intellij-idea·idea
Asthenia04121 小时前
深入浅出分析JDK动态代理与CGLIB动态代理的区别
后端
孤客网络科技工作室1 小时前
每天学一个 Linux 命令(7):cd
java·linux·前端
努力的搬砖人.1 小时前
Vue 2 和 Vue 3 有什么区别
前端·vue.js·经验分享·面试