码云地址: https://gitee.com/forxiaoming/JavaBaseCode/tree/master/EasyCoding

第2章 面向对象

Object-Oriented Programming
软件工程3个主要目标: 可维护性、可重用性、可扩展性

2.1 OOP理念

  1. Object类中的三大哲学问题
  • 我是谁? getClass() toString()
  • 我从哪里来? Object() clone()
  • 我到那里去? finalize()

clone()方法: 分为浅拷贝, 一帮深拷贝, 和彻底深拷贝

  1. java4大特性: 抽象,封装,继承,多态

2.3.2. 抽象类与接口

  • 接口可以多重继承
  • 接口可以有default实现(jdk8)

2.3.4 访问权限控制

  • public,protected,无,private
  • 有的地方会将访问权限说成default, 注意jdk8的default

2.3.6 类的五种关系

  • extends (is-a)
  • implements(can-do)

  • 组合: 类是成员遍历(contains-a)
  • 聚合: 类是成员变量(has-a)
  • 依赖: import类(use-a)

2.3.7 序列化的三种方式

1. Java 原生序列化

Serializable接口类是实现该类对象的序列化, 该接口没有方法, 只有标记作用;
一定要显示设置serialVersionUID属性值

  • 兼容升级, 不要修改serialVersionUID
  • 不兼容升级, 需要修改

注意:

  • Java反序列化时不会调用类的无参构造方法, 而是调用native方法将成员变量赋值未
    对应类型的初始值;
    * 基于性能及兼容性考虑,不推荐使用

2. Hessian 序列化

  • 支持动态类型、跨语言、基于对象传输的网络协议;
  • 自描述序列化类型(不依赖外部描述文件或接口定义)
  • 语言无关, 支持脚本语言
  • 协议简单, 比Java原生序列化高效

3. JSON 序列化

  • 将数据对象转换未JSON字符串;
  • 序列化时抛弃类型信息, 所以反序列化时只有准确提供类型才能准确的反序列化;
  • 可读性好, 方便调试

序列化安全

  • 序列化通过网络传输对象时, 对象中友敏感数据, 会容易成为黑客的攻击点;
  • 反序列化漏洞

如何防范:

  • transient 关键字
  • 使用对称或非对称加密传输

2.4 方法

  • 方法签名: 方法名称 + 方法参数
  • 方法传参: 无论是基本数据类型, 还是引用变量, Java中的参数传递都是值传递
  • 可变参数: 需要对参数预处理(入参保护+参数校验)
  • 构造方法:
    • 必须与类名相同
    • 没有返回类型, void也没有 (返回对象的地址)
    • 不能被继承, 不能被覆写, 不能被直接调用 (1. new ,2. 子类构造中super, 3.反射)
    • 默认构造方法 (显示定义有参构造后默认构造会被覆盖)
    • 构造方法可以私有
    • 接口中不能定义构造(抽象类可以)
    • 静态代码块优先级最高, 在父子类之前执行, 并且只运行一次;
  • 覆写:
    • 访问权限不能变小
    • 返回类型能够向上转型成为父类的返回类型
    • 异常能向上转型成为父类异常
    • 方法名, 参数类型及个数一致
    • (一大两小两桶)
  • 向上转型:
Father f1 = new Son(); // 这就叫 upcasting (向上转型)
// 现在f1引用指向一个Son对象
Son s1 = (Son)f1; // 这就叫 downcasting (向下转型)
// 现在f1还是指向Son对象

Father father = new Son();
father.sonMethds(); // Son中的方法, 报错, 子类由于向上转型而失去丢失sonMethods()

2.5 重载

  • 方法签名= 方法名称+参数类型+参数个数
  • 在方法名称相同下, 一定要对参数进行操作, 才能算重载, 否则编译会失败
    问题思考: 比如两个参数顺序调换 SameMethodSinature.java
    public void methodForOverload(int i, String s) {   }
    public void methodForOverload(String s, int i) {   }

2.6 泛型

类型参数化

  • E Element 集合中的元素
  • T the Type of object 某个类
  • K Key
  • V Value

GenericDefinitionDemo.java

  1. 尖括号里的每个元素都指代一种未知类型(仅仅为一种代号)
  2. 尖括号的位置: 类名之后或方法返回值之前
  3. 泛型定义处只具备执行Object方法的能力
  4. 对于编译后的字节码指令, 其实没有这些花头花脑的方法签名, 充分说明了泛型只是一种编写代码时的语法检查

类型擦除

2.7 数据类型

基本类型 & 包装类型

包装类还是基本数据类型?

  1. 所有POJO类属性必须使用包装数据类型;
  2. RPC方法的返回值和参数必须使用包装;
  3. 所有的局部变量推荐使用基本数据类型;

《码出高效 Java开发手册》第二章 面向对象的更多相关文章

  1. 《码出高效 Java开发手册》第七章 并发与多线程

    码云: https://gitee.com/forxiaoming/JavaBaseCode/blob/master/EasyCoding/src/concurrency/multithreading ...

  2. 《码出高效 Java开发手册》第六章 数据结构与集合

    码云: https://gitee.com/forxiaoming/JavaBaseCode/blob/master/EasyCoding/src/collection/index.md 6.1 数据 ...

  3. 《码出高效 Java开发手册》第五章 异常与日志

    码云: https://gitee.com/forxiaoming/JavaBaseCode/blob/master/EasyCoding/src/exception/index.md 5.2 try ...

  4. 《码出高效 Java开发手册》第三章 代码风格

    第3章 代码风格 3.1 命名 符合语言特性 体现代码元素特征: Abstract xxx. Basexxxx.xxException.xxxTest等; 包名统一使用小写, 完整单词+点分隔符; 枚 ...

  5. 《码出高效 Java开发手册》第四章 走进JVM(未整理)

    码云地址: https://gitee.com/forxiaoming/JavaBaseCode/tree/master/EasyCoding

  6. 《码出高效 Java开发手册》第一章计算机基础(未整理)

    码云地址: https://gitee.com/forxiaoming/JavaBaseCode/tree/master/EasyCoding

  7. 《码出高效:Java开发手册》第四章学习记录,内容想当的多,前后花了几天的时间才整理好。

    <码出高效:Java开发手册>第四章学习记录,内容想当的多,前后花了几天的时间才整理好. https://naotu.baidu.com/file/e667435a4638cbaa15eb ...

  8. 码出高效,阿里巴巴JAVA开发手册1.4.0

    码出高效,阿里巴巴JAVA开发手册1.4.0阅读笔记 一.编程规约(三) 代码格式// 关键词if与括号之间必须有一个空格,括号内的f与左括号,0与右括号不需要空格 if (flag == 0) { ...

  9. 《阿里巴巴Java开发手册》码出高效详解(一)- 为什么要学习阿里编码手册

    <Java 开发手册>(以下简称<手册>)是每个 Java 工程师人手必备的一本参考指南.该手册包括 编程规约.异常日志.单元测试.安全规约.MySQL 数据库.工程结构.设计 ...

随机推荐

  1. C#操作数据表中XML格式的数据

    以前还真没有见过数据表中存储XML格式的数据,刚开始听说的时候,还以为是数据表中有XML的字段类型, 再了解,其实也就是字符串类型的,只不过字符串的格式是XML格式的.确实孤陋寡闻!汗... (可添加 ...

  2. 定时任务 Wpf.Quartz.Demo.4

    本文继续介绍定时任务 Wpf.Quartz.Demo.3的一些小细节, 代码也请前往第3节下载. 1.RichTextBox右键菜单 <RichTextBox.ContextMenu>   ...

  3. 自定义WPF窗体形状

    介绍 你好WPF爱好者. 随着WPF等统一API语言的发明,丰富用户界面变得非常容易. 创建丰富的用户界面只是一个想法. 您需要拥有的是创造性思维和最新技术融合. WPF和Expression Ble ...

  4. 背水一战 Windows 10 (47) - 控件(ScrollViewer 特性): Chaining, Rail, Inertia, Snap, Zoom

    [源码下载] 背水一战 Windows 10 (47) - 控件(ScrollViewer 特性): Chaining, Rail, Inertia, Snap, Zoom 作者:webabcd 介绍 ...

  5. mac终端常用命令

    1.du #查看文件目录大小 示例:查看DataCenter目录下所有文件/文件夹的大小 everSeeker:DataCenter pingping$ -h .9G ./Books 1.2M ./C ...

  6. Synchronzied与ReentrantLock

  7. spring cloud 学习(6) - zuul 微服务网关

    微服务架构体系中,通常一个业务系统会有很多的微服务,比如:OrderService.ProductService.UserService...,为了让调用更简单,一般会在这些服务前端再封装一层,类似下 ...

  8. 为什么学习linux

      目录                                                          为什么学习linux Linux简介 开源共享精神 红帽认证 为什么学习li ...

  9. 【xsy2506】 bipartite 并查集+线段树

    题目大意:有$n$个点,你需要操作$m$次.每次操作为加入/删除一条边. 问你每次操作后,这$n$个点构成的图是否是二分图. 数据范围:$n,m≤10^5$. 此题并没有强制在线,考虑离线做法. 一条 ...

  10. MVC3学习:基于ObjectContext的数据增删改查操作

    数据库里面的表格,映射为对应的实体类.实体类的编写,可以自己手动编写,也可以使用工具或插件自动生成.在MVC3里面,我们可以使用VS的POCO插件自动生成实体类.如下图: 关于POCO插件的安装与使用 ...