【JAVA基础&高级】 面向对象篇
写在前面
由于近期需要用到基础以及底层的一些知识点,所以借此机会找来了一些学习的资料,用于对 JAVA
面向对象相关的知识点进行复盘、巩固,并且在此将一些重点的知识点做相关的记录,在后续的实际开发工作中遇到这些知识点相关的内容都会在本篇笔记中进行记录、迭代。
“ 温故而知新 ”
- 写在前面
- 学习主线
- 知识点复习
- 阶段一
- 0x01:编程思想:面向过程&面向对象
- 0x02:经典案例:把大象装进冰箱
- 0x03:理解 “万事万物皆对象”
- 0x04:内存解析的说明
- 0x05:匿名对象
- 0x06:巧记 “方法的重载”
- 一个例子
- 0x07:可变个数的形参
- 一个例子
- 0x08:值传递机制
- 阶段二
- 阶段三
- 总结
- 阶段一
- 闲谈
学习主线
对于 “面向对象” 章节的学习,划分为以下三个阶段
- 1、
Java
类及类的成员:属性、方法、构造器:代码块、内部类 - 2、面向对象的三大特征:封装性、继承性、多态性
- 3、其他关键字的使用:
-
this
、super
、static
、final
、abstract
、interface
、package
、import
等
-
核心:掌握上述的概念、思想、关键字等如何在代码中进行具体实现与应用。
技巧:“大处着眼,小处着手”
具体涉及到的代码的需要特别细致的去写,否则一不小心就会出错,导致花费大量的时间去排错, 但也不能埋头去写,要关注前面以及后续的需要学习的一些知识点,区分哪些是重要的,哪些是不重要的,且如果遇到一些 "问题" 时,先花一些时间去考量这个问题的价值,如果需要花费大量的时间去完成,而到最后却不怎么用得上的话,那大可不必。
总结:抓重点去学习,将自己的时间和精力的价值最大化。
知识点复习
查阅资料的过程中发现的重点
阶段一
完善中
0x01:编程思想:面向过程&面向对象
面向过程(POP
)与面向对象的区别(OOP
)
两者都是一种编程思想,面向对象是由面向过程延伸而来的。
- 面向过程,强调的是功能的行为,以函数为最小的单位,重点考虑的是怎么做。
- 面向对象,将功能封装进对象,强调具备了功能的某个对象, 以类或者对象为最小的单位,考虑的是谁来做。
面向对象更加强调运用人类在日常生活中的思维逻辑所采用的思想方法以及原则,如抽象、分类、继承、聚合、多态等。
聚合: 多态:
0x02:经典案例:把大象装进冰箱
面向过程:强调的是功能行为,以函数为最小单位,考虑怎么做。
- ① 把冰箱门打开
- ② 抬起大象,塞进冰箱
- ② 把冰箱门关闭
面向对象:强调具备了功能的对象,以类/对象为最小单位,考虑谁来做,以下面的伪代码来举例
人{
打开(冰箱){
冰箱.开开();
}
抬起(大象){
大象.进入(冰箱);
}
关闭(冰箱){
冰箱.闭合();
}
}
//实体对象
冰箱{
//对象拥有的功能
开开(){}
闭合(){}
}
大象{
进入(冰箱){}
}
0x03:理解 “万事万物皆对象”
在 Java
语言范畴中,我们都将功能、结构等封装到类中,通过类的实例化来使用类的具体功能。
- 例如
Scanner
、String
、File
等
涉及到 Java
语言与前端提交的数据或者后端的数据库交互时,在 Java
层面都体现为类、对象,例如在数据库中的每一个表都被看作为一个个的类,而每个表里面的字段都是这个类的属性。
0x04:内存解析的说明
引用类型的变量,只可能储存两类值:
null
- 内存地址值,包含变量(对象)的类型
例如,直接打印一个实例化后对象的值
Phone p = new Phone();
System.out.println(p)
得到的结果为
下图为对象数组在 JVM
的栈和堆中的内存的解析图
图片来源自宋红康老师课程的课件
0x05:匿名对象
创建两个匿名的对象,他们的内存空间是独立的,运行结束后地址会在内存中销毁(适合一次性使用的场景,无需在栈中储存该对象的内存地址)
new Phone().price = 1999;
new Phone().getPrice(); //0.0
匿名对象的使用
public class InstanceTest {
public static void main(String[] args) {
PhoneMall mall = new PhoneMall();
//匿名对象的使用
mall.show(new Phone());
}
}
class PhoneMall{
public void show(Phone phone){
//匿名对象通过形参的赋值,实现在方法中被多次调用
phone.sendEmail();
phone.playGame();
}
}
0x06:巧记 “方法的重载”
” 两同一不同 “
- 同一个类、相同的方法名
- 参数的列表不同:个数不同、类型不同
一个例子
判断与 void show(int a,char b,double c){}
构成重载的有哪些?
void show(int x,char y,double z){} // no,参数的数量和类型相同
int show(int a,double c,char b){} // yes
void show(int a,double c,char b){} // yes
boolean show(int c,char b){} // yes
void show(double c){} // yes
double show(int x,char y,double z){} // 参数的数量和类型相同
void shows(){double c} // no ,方法名不同
总结:方法的重载需要重点关注相同方法名的参数的数量以及参数的类型
0x07:可变个数的形参
jdk 5.0 中新增的内容
使用过程中需要注意的:
- 可变形参的格式:数据类型 ... 变量名
- 当调用可变个数形参的方法时,传入的参数个数可以是:0个,1个, X个
- 可变形参的方法与本类中方法名相同时,形参不同的方法之间构成重载
- 可变形参的方法与本类中方法名相同时,形参类型也相同的数组之间不构成重载。换句话说,二者不能共存。
- 可变形参中必须声明在末尾
- 在方法的最多只能声明一个可变形参。
一个例子
public class MethodArgsTest {
public static void main(String[] args) {
MethodArgsTest test = new MethodArgsTest();
test.show(new String[]{"AA","BB","CC"});
// 可变形参也可以接收一个数组
test.show(new String[]{"AA","BB","CC"});
}
public void show(String ... strs){
for(int i = 0;i < strs.length;i++){
System.out.println(strs[i]);
}
}
}
0x08:值传递机制
形参:方法定义时,声明在小括号内的参数
实参:方法调用时,实际传递给形参的数据
- 如果参数是基本的数据类型(例如
int
、float
、double
等)此时实参赋给形参的是真是储存的数据值。
- 当参数的类型为引用数据类型时,传递的是数据(对象)在栈指向堆中的内存地址,所以此时对该形参进行改动,实参也会发生改变
阶段二
完善中
阶段三
完善中
总结
完善中
闲谈
记录在学习过程中受到的一些启发
“比较少的人是真的把知识读通了,把知识是为他所用,而有一部分的人是学得越多越陷入进了知识的深渊,最终没办法走出来。”
- springboot scheduled并发配置
- RabbitMQ高可用集群配置
- zookeeper curator处理会话过期session expired
- redis事务
- 数据库表反向生成(一) MyBatis-generator与IDEA的集成
- 数据库表反向生成(二) Django ORM inspectdb
- RabbitMQ与AMQP协议
- 大数据算法设计模式(2) - 左外链接(leftOuterJoin) spark实现
- hs_err_pid
- django celery的分布式异步之路(二) 高并发
- django celery的分布式异步之路(一) 起步
- SpringMVC拦截器Interceptor
- 元宵快乐:看SQL大师们用SQL绘制的团圆
- Python Redis pipeline操作
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释