学习笔记之JAVA篇(0724)

p 方法

  • 方法声明格式:
[修饰符1 修饰符2 ...] 返回值类型 方法名(形式参数列表){
java语句;......;
} 
  • 方法调用方式
普通方法对象.方法名(实参列表)
静态方法类名.方法名(实参列表)
  • 方法的详细说明
    • 形式参数:在方法声明时用于接收外界传入的数据。(方法定义时)
    • 实参:调用方法时实际传给方法的数据。(方法调用时)
    • 返回值:执行完毕后,返还给调用它的环境的数据。
    • 返回值类型:事先约定的返回值的数据类型,如无返回值,则为void

p 重载

  • 重载:一个类中可以定义多个名称相同,但参数列表不同的方法。

重载的方法,实际是完全不同的方法,只是名称相同而已!

  • 构成方法重载的条件
    • 不同的含义:形参类型,形参个数,形参顺序不同;
    • 只有返回值不同不构成方法的重载
      • 如:int a(String str){ }与void a(String str){ }不构成方法重载
    • 只有形参的名称不同,不构成方法的重载。

p 递归

  1. 递归是一种常见的算法思路,在很多算法中都会用到,比如:深度优先搜索(DFS:Depth First Search)
  2. 递归的基本思想就是“自己调用自己”;
  3. 递归结构包括两个部分:
    1. 定义递归头:解决:什么时候不调用自身方法。如果没有头,将陷入死循环,也就是递归的结束条件
    2. 递归体:解决:什么时候需要调用自身方法。
  4. 递归的缺陷:算法简单是递归的优点之一,但是递归调用会占用大量的系统堆栈,内存好用多,在递归层次多时速度要比循环慢的多,所以在使用时要慎重。
public class factorial {public static long factorial(int n) {if(n == 1){return 1;}else {return n* factorial(n - 1);}}public static void main(String[] args) {
//    当前时间long startTime = System.currentTimeMillis();System.out.println(factorial(20));
//    结束时间long endTime = System.currentTimeMillis();System.out.println("递归耗时:"+(endTime - startTime)+"ms");}
}

p 面向对象 ——面向过程

  1. 面向过程和面向对象的区别
  • 面向过程(C语言)适合简单、不需要协作的事务,重点关注如何执行。
  • 面向对象可以帮助我们宏观上把握、从整体上分析整个系统。但是具体到实现部分的微观操作(就是一个个方法),仍然需要面向过程的思路区处理。
  • 二者不是对立的,是相辅相成的,面向对象离不开面向过程。
  1. 面向对象和面向过程思想总结:
  • 都是解决问题的思维方式,都是代码组织的方式。
  • 面向过程是一种“执行者思维”,解决简单问题可以使用面向过程;
  • 面向对象是一种“设计者思维”,解决复杂。需要协作的问题,可以使用面向对象;
  • 面向对象离不开面向过程:
    • 宏观上:通过面向对象进行整体设计
    • 微观上:执行和处理数据,仍然是面向过程。

p 类

  1. 类我们叫做class,对象:Object,instance(实例)
  2. 总结
    • 类可以看成一类对象的模版,对象可以看成该类的一个具体实例。
    • 类是用于描述同一类型的对象的一个抽象概念,类中定义这一类对象所应具有的共同属性、方法。
  3. 类的定义方式
//每一个源文件必须有且只有一个
public class{}
//并且类名和文件名保持一致!
public class Car {}
class Tyre {}
// 一个Java文件可以同时定义多个
classclass Engine {}
class Seat{}

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

  • 属性(field成员变量)

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

数据类型默认值
整型0
浮点型0.0
字符型"u0000’
布尔型false
所有引用类型null
  • 属性定义格式

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

  • 方法

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

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

p 简单内存分析请添加图片描述

/*** 一个学生类**/
public class Students {int id;int age;String name;public void study(){System.out.println("正在学习,勿扰!");}public void kickball(){System.out.println("踢球中,为我加油!");}public static void main(String[] args) {Students s1 = new Students();System.out.println(s1.id);System.out.println(s1.name);s1.id = 1001;s1.name = "msyy";System.out.println(s1.id);System.out.println(s1.name);s1.study();s1.kickball();}
}

P 构造方法(构造器 constructor)

  • 构造器用于对象的初始化,而不是创建对象。

  • 创建对象的四步:

    1. 分配对象空间,并将对象成员变量初始化为0或空(null)
    2. 执行属性值的显示初始化
    3. 执行构造方法
    4. 返回对象的地址给相关的变量
  • 声明格式

    • [修饰符] 类名(形参列表){
      // n条语句
      }
      
  • 构造器的4个要点

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

定义一个“点(Point)类用来表示二维空间中的点(有两个坐标),要求如下:

可以生成具有特定坐标的点对象。

提供可以计算该“点”距另外一点距离的方法。

public class Point {private int x;private int y;public Point(int x, int y) {this.x = x;this.y = y;}public double distance(Point p) {return Math.sqrt(Math.pow(this.x - p.x, 2) + Math.pow(this.y - p.y, 2));}public static void main(String[] args) {Point p1 = new Point(1, 2);Point p2 = new Point(3, 4);System.out.println(p1.distance(p2));}
}

P 构造方法 —— 内存请添加图片描述

P JVM虚拟机内存模型

请添加图片描述
请添加图片描述
java虚拟机的内存可以分为三个区域:虚拟机栈(stack)、堆(heap)、方法区(method area)

虚拟机栈(简称:栈)的特点如下:

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

堆的特点如下:

  1. 堆用于存储创建好的对象和数组(数组也是对象)

  2. JVM只是一个堆,被所有线程共享。

  3. 堆是一个不连续的内存空间,分配灵活,速度慢!

  4. 堆被所有的线程所共享,在堆上的区域,会被垃圾回收器做进一步划分,例如新生代、老年代的划分。请添加图片描述
    方法区(也是堆)特点如下

  5. 方法区是JAVA虚拟机规范,可以有不同的实现。

    1. JDK7以前是“永久代”
    2. JDK7部分去除“永久代”,静态变量、字符串常量池都挪到堆内存中
    3. JDK8是“元数据空间”和堆结合起来。
  6. JVM只有一个方法区,被所有线程共享!

  7. 方法区实际也是堆,只是用于存储类、常量相关的信息!

  8. 用来存放程序中永远不变或唯一的内容。(类信息【Class对象】、静态变量、字符串常量等)

  9. 常量池主要存放常量:如文本字符串、final常量值。

p 程序执行过程的内存分析详解

*这里有个动图传不上来啦 >< *
参数传值机制

JAVA中,方法中所有参数都是“值传递”,也就是“传递的是值的副本”。也就是说,我们得到的是“原参数的复印件,而不是原件“。因此,复印件改变不会影响原件。

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

多个对象指向一个地址

public class Employee {private int id;private String name;private String job;private String baseSalary;private String salary2;private String hiredate;private String address;void Meeting(){System.out.println("1.8:30打卡");System.out.println("2.开会");System.out.println("3.9:00结束");System.out.println("4.集体喊加油");}public static void main(String[] args) {Employee e1 = new Employee();e1.id = 1;e1.name = "abc";Employee e2 = e1;System.out.println(e1.id);System.out.println(e1.name);e2.id = 2;e2.name = "def";System.out.println(e1.id);System.out.println(e1.name);}
}

请添加图片描述

垃圾回收机制(Garbage Colloction)

垃圾回收原理和算法

  • 内存管理
    • JAVA的内存管理很大程度就是堆中对象的管理,其中包括对象空间的分配和释放。
    • 对象空间的分配:使用new 关键字创建对象即可。
    • 对象空间的释放:将对象赋值Null即可。
  • 垃圾回收过程

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

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

垃圾回收机制保证可以将“无用的对象”进行回收。

无用的对象指的是没有任何变量引用该对象。JAVA的垃圾回收器通过相关算法法相无用对象,并进行清除和整理。

垃圾回收相关算法

1. 引用计数法

堆中的每个对象都对应一个引用计数器,当有引用指向这个对象时,引用计数器加1,而当指向该对象的引l用失效时(引l用变为null),引用计数器减1,最后如果该对象的引用计算器的值为0时,则Java垃圾回收器会认为该对象是无用对象并对其进行回收。优点是算法简单缺点是“循环引用的无用对象无法别识别。请添加图片描述

public class Student {String name;Student friend;public static void main(String[] args) {Student s1 = new Student();Student s2 = new Student();s1.friend = s2;s2.friend = s1;s1 = null;s2 = null;}
}

2.引用可达法(根搜索算法)

程序把所有引用关系看作一张图,从一个节点点GC ROOT开始,寻找对应的引用节点,找到这个节点以后,继续寻找这个节点的引用节点,当所有的引用节点寻找完毕之后,剩余的节点则被认为是没有被引I用到的节点,即无用的节点。

通用的分代垃圾回收机制

请添加图片描述
JVM调优和Full GC

在对JVM调优的过程中,很大一部分工作就是对于 Full GC 的调节。有如下原因可能导致Full GC

  1. 年老代(Tenured)被写满
  2. 永久代(perm)被写满
  3. System.gc()被显示调用
  4. 上一次GC之后Heap的各域分配策略动态变换。

内存泄露

含义:指堆内存由于某种原因程序未被释放,造成内存浪费,导致运行速度减慢甚至系统崩溃等。
请添加图片描述
四种场景

  1. 创建大量无用对象:

比如:大量拼接字符串时,使用了String而不是StringBuilder.

String str ="";
for(int i = 0 ; i < 10000 ;i++){str += i; //相当于产生了10000个String对象
}
  1. 静态集合类的使用

HashMap、Vector、List等的使用最容易出现内存泄露,这些静态变量的生命周期和应用程序一致,所有的对象也不能被释放。

  1. 各种连接对象(IO对象、数据库连接对象、网络连接对象)未关闭

IO流、数据库连接对象、网络连接对象等连接对象属于物理连接,和硬盘或者网络连接,不使用的时候一定要关闭。

  1. 监听器的使用不当

释放对象时,没有删除相应的监听器。

  1. 其他要点
    1. 程序员无权调用垃圾回收器。
    2. 程序员类可以调用System.gc(),该方法只是通知JVM,并不是运行拦击回收器。尽量少用,会申请Full GC,成本高,影响系统性能。
    3. Object对象的finalize方法,是JAVA提供给程序员用来释放对象或资源的方法,但是尽量少用。
  2. 本节作业(答案会在下一期或者评论区哟)
    1. 垃圾回收过程一般分为两步,是哪两步?
    2. 垃圾回收常见的两种算法是什么?
    3. 堆内存划分成:年轻代、年老代、永久代。垃圾回收器划分成:Minor GC、Major GC、Full GC。这三种垃圾收回器都对应哪些区域?
    4. 对JVM 调优的过程中,很大一部分工作就是对于FuIl GC 的调节。这句话对吗?
    5. System.gcO的作用是什么?
      今天就学到这里吧!~~~
      保护眼睛吧

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1488079.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Java之泛型基础

泛型 1 问题引入 在前面学习集合时&#xff0c;我们都知道集合中是可以存放任意对象的&#xff0c;只要把对象存储集合后&#xff0c;那么这时他们都会被提升成Object类型。当我们在取出每一个对象&#xff0c;并且进行相应的操作&#xff0c;这时必须采用类型转换。 观察下…

视频去水印免费电脑版 pdf压缩在线免费网页版 pdf压缩在线免费 简单工具软件详细方法步骤分享

消除视频中的恼人水印&#xff0c;是许多视频编辑爱好者的常见需求。在这篇文章中&#xff0c;我们将探讨几种视频去水印的技巧&#xff0c;在数字化时代&#xff0c;视频和图片的传播越来越方便&#xff0c;但随之而来的水印问题也让人头疼。本文将为您详细介绍视频剪辑去水印…

vue环境安装

安装node.js 网址&#xff1a;https://nodejs.org/en/download/ 直接点击下载就ok 一路next&#xff0c;这里可以改一下保存路径 选第一个 安装后&#xff0c;找到node.js的安装目录&#xff0c;创建这两个文件夹 之后打开命令提示符&#xff0c;右键以管理员身份运行 将新创…

智能猫砂盆买开放式还是封闭式?四年养猫老手实用测评三个品牌!

有没有人跟我一样&#xff0c;买过封闭式的智能猫砂盆回来&#xff0c;结果猫咪不爱用&#xff0c;死活不肯进去&#xff0c;搞得智能猫砂盆白买了&#xff0c;但是平时上班太忙碌&#xff0c;真的很需要一个可以帮自己铲屎的智能猫砂盆&#xff0c;后面恶补了一下知识&#xf…

通信原理-思科实验四:静态路由项配置实验

实验四 静态路由项配置实验 一&#xff1a;实验内容 二&#xff1a;实验目的 三、实验原理 四、实验步骤 选择三个2811型号的路由器 R1、R2、R3 路由器默认只有两个快速以太网接口&#xff0c;为路由器R1和R3增加快速以太网接口模块NM-1FE-TX&#xff0c;安装后检查路由器的接…

JavaSE--基础语法--继承和多态(第三期)

一.继承 1.1我们为什么需要继承? 首先&#xff0c;Java中使用类对现实世界中实体来进行描述&#xff0c;类经过实例化之后的产物对象&#xff0c;则可以用来表示现实中的实体&#xff0c;但是 现实世界错综复杂&#xff0c;事物之间可能会存在一些关联&#xff0c;那在设计程…

麦歌恩MT6521-第三代汽车磁性角度传感器芯片

磁性编码芯片 -在线编程角度位置IC 描述&#xff1a; MT6521是麦歌恩微电子推出的新一代基于水平霍尔及聚磁片(IMC)技术原理的磁性角度和位置检测传感器芯片。该芯片内部包含了两对互成90放置的水平霍尔阵列及聚磁片&#xff0c;能够根据不同的型号配置来实现对XY&#xff0…

android前台服务

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 未经允许不得转载 目录 一、导读二、使用2.1 添加权限2.2 新建…

MT2142 逆序(树状数组)

思路&#xff1a; 开始完全没有思路&#xff0c;还是想问题的方法不对&#xff08;应该先暴力模拟&#xff0c;然后再想可以优化的方法&#xff09;。 后来看了解析&#xff0c;用chang[]来存储每个元素删除后&#xff08;或者是该元素前面的元素删除后&#xff09;对record造成…

肿瘤演变指标预测局部晚期前列腺癌10年以上的复发| 文献速递-基于人工智能(AI base)的医学影像研究与疾病诊断

Title 题目 Tumor evolution metrics predict recurrence beyond 10 years in locally advanced prostate cancer 肿瘤演变指标预测局部晚期前列腺癌10年以上的复发 01 文献速递介绍 癌症演变为预测肿瘤学奠定了基础。测试进化指标需要在控制临床试验中进行定量测量。我们…

STM32---HAL库基础配置记录之基础配置

一&#xff1a;第一步是时钟RCC的使能配置 时钟配置界面如下&#xff0c;当我们选定好芯片型号时&#xff0c;首先需要配置的是RCC&#xff0c;如下图&#xff1a; 其中第一个HSE代表的是时钟树的高速外部时钟对应下图中的1&#xff0c;LSE代表的是下图中的2 如下图&#xff0c…

GIS场景升级:支持多种影像协议与天气效果

在GIS场景编辑领域&#xff0c;升级视效的需求日益增加。有一款名为山海鲸可视化的免费工具&#xff0c;本人亲测能够完美满足这一需求。山海鲸可视化不仅支持多种GIS影像协议&#xff08;如TMS、WMS、WMTS等&#xff09;&#xff0c;还能一键添加天气效果&#xff0c;瞬间提升…

本地电脑连接阿里云

系列文章目录 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、方法1二、使用步骤1.引入库 前言 一、方法1 本地连接远程服务器的时候提示出现身份验证错误的几种解决方法 二、使用步骤 …

算法——滑动窗口(day8)

30.串联所有单词的子串 30. 串联所有单词的子串 - 力扣&#xff08;LeetCode&#xff09; 必看&#xff01;&#xff01;&#xff01;本题是我们上次写的438.异位词的进阶版&#xff0c;可参考本篇文章&#xff1a;算法——滑动窗口&#xff08;day7&#xff09;-CSDN博客来…

MySQL数据库安装使用

我们都知道数据库又分为关系型数据库和非关系型数据库&#xff1b; 关系型数据库指采用了关系模型来组织数据的数据库&#xff0c;指的就是二维表格模型。可以先初步理解为Excel表格。非关系型数据库又被称为NoSQL&#xff0c;对NoSQL 最普遍的定义是“非关联型的”&#xff0…

Android平台RTSP|RTMP直播播放器技术接入说明

技术背景 大牛直播SDK自2015年发布RTSP、RTMP直播播放模块&#xff0c;迭代从未停止&#xff0c;SmartPlayer功能强大、性能强劲、高稳定、超低延迟、超低资源占用。无需赘述&#xff0c;全自研内核&#xff0c;行业内一致认可的跨平台RTSP、RTMP直播播放器。本文以Android平台…

免费【2024】springboot 编程语言在线学习平台的设计与实现

博主介绍&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

数据库处理表

首先先创建库&#xff0c;然后创建需要的这三个表 用dese表名查看 然后题目要求对表进行修改 用alter table这个语法来对表进行修改 modify为修改字段 需要修改的字段的属性类型改变为的属性 最后用descStudent查看 第二题需要创建索引 创建索引createindex索引名称 cre…

C#开发的全屏图片切换效果应用 - 开源研究系列文章 - 个人小作品

这天无聊&#xff0c;想到上次开发的图片显示软件《 PhotoNet看图软件 》&#xff0c;然后想到开发一个全屏图片切换效果的应用&#xff0c;类似于屏幕保护程序&#xff0c;于是就写了此博文。这个应用比较简单&#xff0c;主要是全屏切换换图片效果的问题。 1、 项目目录&…

JS基础知识学习笔记全

JS基础知识学习笔记全 一、引入方式 1、内部脚本 &#xff08;一般定义在body下面会改善执行速度&#xff09; <body></body><!-- 内部脚本 --><script>/* 打开页面警告框显示的内容 */alert(helloJS);</script>2、外部脚本 外部专门新建一…