启航-后端-Java-总结2

本文回顾了Java的面向对象特性,包括对象、类的理解,面向过程与面向对象的区别,以及对象和类的关系。详细介绍了类的定义、属性、方法,特别是构造器的使用。此外,探讨了Java内存管理,包括栈、堆和方法区的特性,参数传递机制,垃圾回收原理和分代回收。最后提到了构造方法重载和this关键字的应用。文章以实例辅助讲解,帮助深化理解。
摘要由CSDN通过智能技术生成

启航-后端-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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值