启航-后端-Java-总结2

一眨眼时间就又过去了一周,同志们咱就是说这时间妥妥的就是不够用的节奏啊。本周对之前学习的面向对象的部分进行了巩固复习。毕竟先贤有言,温故而知新。面向对象是Java最大的特点,我觉得温几遍都不过分吼。时间比较紧凑,一些知识点的总结可能不是很全面,还是那个Flag:假期一有空就来把这挖的坑给填上。话不多说,开造。

一、该怎么理解“对象”?

(一)啥是对象

在这一块,大体思路其实跟C++差不多。学习这一块的时候,刚开始也不是很理解,但后来通过“表格思维”可以很快地了解到底什么是“对象”。

  1. 这一整个表结构对应:类结构
  2. 每一行数据对应:一个对象
  3. 表中所有数据对应:这个类的所有对象

(二)面向过程、面向对象是啥

面向过程和面向对象都是对软件分析、设计和开发的一种思想,它指导着人们以不同的方式去分析、设计和开发软件。C 语言是一种典型的面向过程语言,Java 是一种典型的面向对象语言。

面向过程思想适合简单、不需要协作的事务,重点关注如何执行。面向过程时,我们首先思考“怎么按步骤实现?”并将步骤对应成方法,一步一步,最终完成。这个适合简单任务,不需要过多协作的情况下。

比如,如何开车?我们很容易就列出实现步骤:

  1. 点火→挂挡→踩油门→走你
  2. 再比如,如何把大象装进冰箱?
  3. 打开冰箱→放入大象→关闭冰箱

相对来说,如果用面向对象问题来思考“如何把大象装进冰箱?”这个问题,首先我们要想的是:我们是不是该把大象切块之后放入冰箱?

面向对象思想更契合人的思维模式。我们首先思考的是“怎么设计这个事物?” 比如思考造车,我们就会先思考“车怎么设计?”,而不是“怎么按步骤造车的问题”。这就是思维方式的转变。因此,面向对象可以帮助我们从宏观上把握、从整体上分析整个系统。但是,具体到实现部分的微观操作(就是一个个方法),仍然需要面向过程的思路去处理。

二、对象和类

对于对象和类之间的关系,我在理解这个问题的时候,也花费了一些小小的功夫。

  • 二者之间关系的概念:类是对象的抽象,而对象是类的具体实例。类与对象的关系:抽象(该抽象是名词)与类的实例化就是对象,对象的共性特征抽象(该抽象是动词)出来就是类。

    但是这个概念非常的模糊、不好理解。这涉及到了一些比较抽象的概念,同时我们也很容易被我们自己在生活中的一些惯性思维给带偏,所以对于这个问题我是这样理解的:

  • 对于男人、女人、钢笔这三样东西。在生活中,我们很容易就可以认为:男人和女人是一类,而钢笔和男人、女人都不同属于一类。但在Java中,这种惯性思维应该摒弃。我们完全可以在Java当中定义一个类,这个类里面的都是“看得见的东西”,这样一来男人、女人、钢笔都是属于同一类。

(一)类的定义

对于一个类来说,有三种成员:属性field、方法method、构造器constructor。

  • 类的定义方式:
public class Car {}
class Tyre {
}
class Engine {}
class Seat {}

注意事项:

  • 每一个源文件必须有且只有一个public class,并且类名和文件名保持一致!
  • 一个Java文件可以同时定义多个class。

(二)属性(field 成员变量)

①定义

属性用于定义该类或该类对象包含的数据或者说静态特征。属性作用范围是整个类体。在定义成员变量时可以对其初始化,如果不对其初始化,Java 使用默认的值对其初始化。

②属性定义格式

[修饰符] 属性类型属性名= [默认值] ;

(三)方法

①定义

方法用于定义该类或该类实例的行为特征和功能实现。方法是类和对象行为特征的抽象。面向对象中,整个程序的基本单位是类,方法是从属于类和对象的。

②定义格式

[修饰符] 方法返回值类型方法名(形参列表) {
// n 条语句
}

三、面向对象的内存分析

危!!!这是一块让人头疼的地方

(一)简单内存分析

①概述

​ Java虚拟机的内存可以分为三个区域:栈(stack)、堆(heap)、方法区(method area)。

②虚拟机栈(简称栈)的特点

  1. 栈描述的是方法执行的内存模型。每个方法被调用都会创建一个栈帧(存储局部变
    量、操作数、方法出口等)
  2. JVM 为每个线程创建一个栈,用于存放该线程执行方法的信息(实际参数、局部变
    量等)
  3. 栈属于线程私有,不能实现线程间的共享!
  4. 栈的存储特性是“先进后出,后进先出”
  5. 栈是由系统自动分配,速度快!栈是一个连续的内存空间!

③堆的特点

  1. 堆用于存储创建好的对象和数组(数组也是对象)
  2. JVM 只有一个堆,被所有线程共享
  3. 堆是一个不连续的内存空间,分配灵活,速度慢!
  4. 堆被所有的线程所共享,在堆上的区域,会被垃圾回收器做进一步划分,例如新生代、老年代的划分。

④方法区(静态区)特点

  1. 方法区是JAVA 虚拟机规范,可以有不同的实现。
    i. JDK7 以前是“永久代”
    ii. JDK7 部分去除“永久代”,静态变量、字符串常量池都挪到了堆内存中
    iii. JDK8 是“元数据空间”和堆结合起来。
  2. JVM 只有一个方法区,被所有线程共享!
  3. 方法区实际也是堆,只是用于存储类、常量相关的信息!
  4. 用来存放程序中永远是不变或唯一的内容。(类信息【Class 对象,反射机制中会
    重点讲授】、静态变量、字符串常量等)
  5. 常量池主要存放常量:如文本字符串、final 常量值。

(二)参数传值机制

Java 中,方法中所有参数都是“值传递”,也就是“传递的是值的副本”。也就是说,我们得到的是“原参数的复印件,而不是原件”。

这点和C++里面的其实差不多。以下两个点需要稍加注意:

  • 基本数据类型参数的传值,传递的是值的副本。副本改变不会影响原件。
  • 引用类型参数的传值,传递的是值的副本。但是引用类型指的是“对象的地址”。因此,副本和原参数都指向了同一个“地址”,改变“副本指向地址对象的值,也意味着原参数指向对象的值也发生了“改变”。

(三)垃圾回收机制

与Java相比,C++有一个特别特别让人头疼的地方:内存管理问题。在学习C++的时候,老师就有提到,在我们当前学习阶段,可能还感受不出这个问题所带来的影响,一旦做比较大的项目之后,就会深刻地体验到内存回收的痛苦。而对于Java来说,它的自动垃圾回收机制就特别好地解决了这个问题,让程序员可以不用再将一部分精力放在内存管理上面了。

①垃圾回收原理和算法

内存管理

  1. Java 的内存管理很大程度就是:堆中对象的管理,其中包括对象空间的分配和释放。
  2. 对象空间的分配:使用new 关键字创建对象即可。
  3. 对象空间的释放:将对象赋值null 即可。

垃圾回收过程
任何一种垃圾回收算法一般要做两件基本事情:

  1. 发现无用的对象
  2. 回收无用对象占用的内存空间。

垃圾回收机制保证可以将“无用的对象”进行回收。无用的对象指的就是没有任何变量引用该对象。Java 的垃圾回收器通过相关算法发现无用对象,并进行清除和整理。

垃圾回收相关算法

  1. 引用计数法
    堆中的每个对象都对应一个引用计数器,当有引用指向这个对象时,引用计数器加1,而当指向该对象的引用失效时(引用变为null),引用计数器减1,最后如果该对象的引用计算器的值为0 时,则Java 垃圾回收器会认为该对象是无用对象并对其进行回收。优点是算法简单,缺点是“循环引用的无用对象”无法别识别。
  2. 引用可达法(根搜索算法)
    程序把所有的引用关系看作一张图,从一个节点GC ROOT 开始,寻找对应的引用节点,找到这个节点以后,继续寻找这个节点的引用节点,当所有的引用节点寻找完毕之后,剩余的节点则被认为是没有被引用到的节点,即无用的节点。

②通用的分代垃圾回收机制

分代垃圾回收机制,是基于这样一个事实:不同的对象的生命周期是不一样的。因此,不同生命周期的对象可以采取不同的回收算法,以便提高回收效率。我们将对象分为三种状态:年轻代、年老代、永久代。同时,将处于不同状态的对象放到堆中不同的区域。

大概意思就是,有按照“资历”把对象放在不同地方储存,然后再定期触发不同的清理机制对不同区域进行清理。

(四)开发中容易造成内存泄露的操作

内存泄漏:指堆内存由于某种原因程序未释放,造成内存浪费,导致运行速度减慢甚至系统崩溃等。

如下四种情况时最容易造成内存泄露:

  1. 创建大量无用对象
    比如:大量拼接字符串时,使用了String 而不是StringBuilder。
  2. 静态集合类的使用
    像HashMap、Vector、List 等的使用最容易出现内存泄露,这些静态变量的生命周期和应用程序一致,所有的对象也不能被释放。
  3. 各种连接对象(IO 流对象、数据库连接对象、网络连接对象)未关闭
    IO 流对象、数据库连接对象、网络连接对象等连接对象属于物理连接,和硬盘或者网
    络连接,不使用的时候一定要关闭。
  4. 监听器的使用不当
    释放对象时,没有删除相应的监听器

四、构造方法

(一)构造方法(构造器)

①定义

构造器也叫构造方法(constructor),用于对象的初始化。构造器是一个创建对象时被自动调用的特殊方法,目的是对象的初始化。构造器的名称应与类的名称一致。Java通过new关键字来调用构造器,从而返回该类的实例,是一种特殊的方法。

构造器用于对象的初始化,而不是创建对象!这其实就像C++里面的析构函数。

②声明格式

[修饰符] 类名(形参列表){
//n 条语句
}

③注意事项

  1. 构造器通过new 关键字调用!!
  2. 构造器虽然有返回值,但是不能定义返回值类型(返回值的类型肯定是本类),不能在构造器里使用return 返回某个值。
  3. 如果我们没有定义构造器,则编译器会自动定义一个无参的构造方法。如果已定义则编译器不会自动添加!
  4. 构造器的方法名必须和类名一致!

(二)构造方法的重载

作用大概就是创建不同用户对象。

public class User {int id; // id
String name; // 账户名
String pwd; // 密码
public User() {}
public User(int id, String name) {this.id = id;
this.name = name;
}
public User(int id, String name, String pwd) {this.id = id;
this.name = name;
this.pwd = pwd;
}
public static void main(String[ ] args) {User u1 = new User();
User u2 = new User(101, "潘周耽");
User u3 = new User(100, "潘周耽二号", "123456");
}
}

五、this关键字

①使用方法

public class TestThis {int a, b, c;
TestThis() {System.out.println("初始化一个Hello对象");
}
TestThis(int a, int b) {this();
a = a;
this.a = a;
this.b = b;
}
TestThis(int a, int b, int c) {this(a, b);
this.c = c;
}
void sing() {}
void eat() {this.sing();
System.out.println("666");
}

注意事项:

  1. 普通方法中,this 总是指向调用该方法的对象。
  2. 构造方法中,this 总是指向正要初始化的对象。
  3. this()调用重载的构造方法,避免相同的初始化代码。但只能在构造方法中用,并且
  4. 必须位于构造方法的第一句。
  5. this 不能用于static 方法中。
  6. this 是作为普通方法的“隐式参数”,由系统传入到方法中。

六、本周总结

本周学习了Java面向对象的基础部分、以及一部分面向对象进阶部分,但疲于学生工作、一些科目的结课考试总结有些疏漏以及不全面之处。

下周将会将面向对象部分全部学习完成,并对知识点重新梳理一遍。

(当场累死.java)

PS:用markdown写CSDN的博客真滴好用,软件方面推荐Typora用着特别轻便顺手。

(有图有真相.java)

附Typora科学使用方法:typora 1.2.5最新版免费使用教程_哔哩哔哩_bilibili

会将面向对象部分全部学习完成,并对知识点重新梳理一遍。

(当场累死.java)

PS:用markdown写CSDN的博客真滴好用,软件方面推荐Typora用着特别轻便顺手。

(有图有真相.java)
但是在这个时候出现了一个问题,直接导入md文件时,文件内的图片显示:外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传,人都麻了,上网搜了解决方法:Typora上传CSDN图片问题
附Typora科学使用方法:typora 1.2.5最新版免费使用教程_哔哩哔哩_bilibili

启航-后端-Java-总结2相关推荐

  1. 「实战篇」开源项目docker化运维部署-后端java部署(七)

    原创文章,欢迎转载.转载请注明:转载自IT人故事会,谢谢! 原文链接地址:「实战篇」开源项目docker化运维部署-后端java部署(七) 本节主要说说后端的部署需要注意的点,本身renren-fas ...

  2. 后端 java ee_刷新器-Java EE 7后端十大功能

    后端 java ee 这是我的小型Java EE 7复习系列的第二部分. 在进行了简要概述的第一篇介绍之后,我决定请Arjan Tijms撰写有关Java EE 7中他最喜欢的后端新功能的信息.如果您 ...

  3. 前端vue后端java,Vue调用后端java接口的实例代码_亦心_前端开发者

    前段时间 做了个学校的春萌项目,其中用到 先上后端接口代码: package controller; import net.sf.json.JSONObject; import util.DBUtil ...

  4. 前端使用 CryptoJS(v3.1.2) 进行des解密,后端java

    后端Java使用JDK的API进行des加密, 需要前端解析 JavaScript解密 注意key和iv(向量)都应该是utf8格式的 Java使用byte数组加密的,前端需要先转换为字符串,然后再转 ...

  5. beecloud支付后端java

    因公司业务需求,支付选用第三方beecloud作为支付平台,一下是移动端APP支付流程和后台java代码,其他方式类同: 下图为整个支付的流程: 其中需要开发者开发的只有: 步骤①(在App端)发送订 ...

  6. 微信小程序后端java服务商分账实现

    微信小程序后端java服务商分账实现 最近公司申请微信服务商,需要给第三方提供支付.分账功能. 商户调用服务商统一支付 首先,服务商小程序支付,基本与普通商户小程序支付一致 支付使用服务商统一下单接口 ...

  7. 腾讯有数后端Java对接

    腾讯有数后端Java对接 腾讯有数后端Java对接 腾讯有数链接 代码 使用方法 腾讯有数后端Java对接 最近电商项目需要数据统计分析,自研一套分析系统比较耗时间,还需要不断的摸索和踩坑,最后公司开 ...

  8. JavaScript实现前端rsa公钥加密,后端Java私钥进行解密

    JavaScript实现前端rsa公钥加密,后端Java私钥进行解密 rsa进行前端js加密,后端java解密时需要注意,由后端先生成一对公私密钥对,然后将公钥传给前端,私钥后端保存,待下次前端请求后 ...

  9. 点击某个物体人机验证码java,captcha: 行为验证码(滑动拼图、点选文字),前后端(java)交互,包含h5/flutter/uni-app的源码和实现...

    uni-app在线体验(微信小程序,请使用微信扫一扫) uni-app H5页面在线体验(扫一扫)        微信小程序                  uni-app H5 如果图片未能正常展 ...

最新文章

  1. 【软件测试培训】了解jmeter分布式测试
  2. [转]使用设计模式改善程序结构(二)
  3. 舒服了,微信支持多设备同时在线!
  4. 结合video.js播放rtmp格式、flv格式、mp4等格式的视频
  5. 原来历史人物的英文名竟然叫这些,太好笑了吧哈哈哈哈哈
  6. HEVC/H265 解码图表,请对照代码看。
  7. python搭建web服务
  8. Oracle之Union与Union all的区别
  9. 8.1 Ext JS应用测试概览
  10. IntelliJ IDEA 面板、菜单介绍
  11. Win7环境下,用VHD安装Win8,实现双系统!
  12. Julia: 如何转换PyPlot的X轴的日期格式?
  13. C语言· 实现各进制间的相互转换
  14. 数据挖掘导论课后习题答案 第二章(一)
  15. [动态规划]ACM预选赛F题 侠客行
  16. linux c语言math lm pow,C语言pow()函数实现求x的y次方的值
  17. ASP.NET 有哪些web服务器-
  18. Android 11 状态栏电池图标的定制
  19. 王者荣耀android加ios好友,王者荣耀安卓和苹果能加好友吗 安卓和ios怎么加好友...
  20. Java8日期/时间使用

热门文章

  1. Flink跟着问题读源码 - SlidingEventTimeWindows接reduce结果数据倍增
  2. 根因分析-oracle数据库突发性能问题,谁来背这个锅
  3. 羊驼alpaca php,今天,我们来聊聊羊驼
  4. ESP8266接入阿里云物联网平台上传温湿度数据
  5. 领域驱动设计——MDD
  6. cmake编译参数重写(正在重写‘/MTd‘用‘/MDd‘)问题
  7. 拼命加班撸Excel,准点下班的新人却被升职
  8. 2016.11.29遇到的问题
  9. 计算机应用应届生自我评价,计算机应用专业应届生自我评价
  10. 琼瑶琨琚 中国古代佛教陶瓷塑像赏读