❝Java程序员必备基础随笔记
❞
JVM、JRE、JDK的概述
什么是跨平台
平台:指操作系统(Window,Linux,Mac)
跨平台:Java程序可以在任意系统运行,一次编写到处运行
原理:实现平台需要依赖Java的虚拟机JVM
什么是JVM
JVM是java虚拟机(Java Virtual Machine),java程序需要运行在虚拟机上,不同平台有自己的虚拟机,因此java语言可以跨平台
什么是JRE
包括Java虚拟机(JVM Java Virtual Machine)和Java程序所需的核心类库等,如果想要运行一个开发好的Java程序,计算机中只需要安装JRE即可。
因此JRE包括JVM和类库。
什么是JDK
JDK是提供给Java开发人员使用的,其中包含了java的开发工具,也包括了JRE。所以安装了JDK,就不用在单独安装JRE了。
其中的开发工具:编译工具(javac.exe)、打包工具(jar.exe)等
因此JDK包括JRE和JAVA的开发工具。
为什么JDK包含一个JRE
开发完的程序,需要运行下看看效果
JVM、JRE、JDK的作用与关系
JDK:JRE+开发工具包
JRE:JVM+核心类库
常用dos命令
打开控制台
win+R,输入cmd回车
常用命令
盘符切换:d:回车
列举文件:dir(对应Linux中的ls)
进入目录:cd 目录/多级目录
回退:cd..或者cd\
清屏:cls(对应Linux中的clear)
数据类型概述和分类
为什么有数据类型
Java语言是强类型语言,对于每一种数据都定义了明确的具体数据类型,在内存中分配了不同大小的内存空间
Java中数据类型的分类
基础数据类型:数值型(整型+浮点)、字符型、布尔型
引用数据类型:类、接口、数组
标识符
标识符概述
作用:给包、类、方法、变量等起名字
组成规则:由字符、下划线、美元符$组成(其中字符采用的是unicode字符集,所以包括英文大小写字母、中文字符、数字字符等)
注意事项:不以数字开头、不能是Java中的关键字
命名原则:见名知意
包:最好是域名倒过来,(由于域名是不会重复的,这就保证了唯一性,便于管理;为什么倒过来写呢,一种规范吧),所有字母要求小写
类或者接口:如果是一个单词首字母大写!如果是多个单词每个字母大写(驼峰原则)
方法或者变量:如果是一个单词全部小写!如果是多个单词,从第二个单词首字母大写
常量:如果是一个单词,所有字母大写!如果是多个单词,所有的单词大写,用下划线区分每一个单词
数组
数组概述
数组是存储多个变量(元素)的东西(容器)
这多个变量的变量类型要一致
数组的定义格式
格式1:数据类型[] 数组名;
格式2:数据类型 数组名[];
注意:这两种定义做完了,数组中是没有元素值的。
数组的初始化
Java中的数组必须初始化,然后才可以使用
初始化:就是将数组中的元素分配内存空间,并为每个数组元素赋值
数组的初始化方式
动态初始化
动态初始化:初始化时只指定数组长度,由系统为数组分配初始值
格式:数据类型[] 数组名 = new 数组类型[数组长度]
例:int arr[] = new int[100];定义一个int类型的数组,这个数组可以存放100个int类型的值
数组长度:即为数组中的元素个数
静态初始化
静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度
格式:数据类型[] 数组名 = new 数据类型[]{元素1,元素2,...};
简化格式:数据类型[] 数组名 = {元素1,元素2,...};
例:int[] arr = new int[]{1,2,3};
简化后:int[] arr = {1,2,3};
数组两个常见的问题
java.lang.ArrayIndexOutOfBoundsException 数组越界异常
产生的原因:就是你访问了不存在的索引元素。
java.lang.NullPointerException 空指针异常
产生的原因:数组已经不指向堆内存的数据了,你还使用数组名去访问元素。
获取数组元素个数
数组就提供了一个属性:length
格式:数组名.length
方法
方法概述
方法概述:简单来说,方法就是完成特定功能的代码块
在很多语言中都有函数的定义,函数在Java中被称为方法
方法格式
修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2…) {
方法体;
return 返回值;
}
方法格式解释
修饰符:常见的public static
返回值类型:用于限定返回值的数据类型,其中void类型的方法没有明确的返回值
方法名:一个名字,为了方便我们调用方法
参数类型:用于接收调用方法时传入的数据的类型
参数名:用于接收调用方法时传入的数据的变量
方法体:完成功能的代码
return:结束方法,把返回值带给调用者
断点调试
断点调试概述
断点调试可以查看程序的执行流程和解决程序中的bug
断点调试常用操作
什么是断点
就是一个标记,为什么叫断点,因为程序运行到断点的位置就断开不执行了
如何设置断点
你想看哪里的程序,你就在那个有效的程序的左边双击就即可
在哪里设置断点
哪里不会点哪里,常见的就是在每个方法的第一条有效语句设置断点
如何运行设置断点后的程序
一般开发工具都有爬虫的图标,点击选择运行方式即可
看那些地方
Debug:断点测试的地方,在这个地方,记住F6,或者使用点击向下也就可以。每按一次F6,程序就往下执行一步;F5是进入到当前的方法;F7是退出当前的方法,返回调用层;F8表示当前实现继续运行直到下一个断点
Variables:查看程序运行过程中变量值的变化
ForDemo:被查看的源文件
Console:控制台,用于查看日志,便于发现问题
如何去断点
再次双击即可取消断点
找到Debug视图,找到Breakpoints,可以看到所有的断点,取消即可
面向对象
面向过程特点与面向对象特点
面向过程
强调的是过程,所有的事情都自己完成
面向对象
一种更符合我们习惯的思想,事情自己不做,交给别人去做,懒人思想,可以将复杂的事情简单化,对于使用者来说变简单了,但是对象里面还是很复杂的
将我们从执行者变成指挥者,怎么理解呢,举两常见的栗子:买电脑/洗衣服
面型过程和面向对象的区别
面向过程:我要买电脑-->上网查对应的参数信息-->去京东买电脑-->讨价还价-->买回电脑/把衣服脱下来-->找一个盆-->放点洗衣粉-->加点水-->浸泡10分钟-->揉一揉-->清洗衣服-->拧干-->晾起来
面向对象:我要买电脑-->拖懂行的朋友去给我买电脑-->买回电脑/把衣服脱下来-->打开全自动洗衣机-->扔衣服-->按钮-->晾起来
类与对象概述
学习编程是为了什么
为了把我们日常生活中实物用语言描述出来
如何描述现实世界事物
属性:该事物的描述信息,事物身上的名词
行为:该事物能做什么
Java中最基本的单位是类,Java中用class描述事物也是如此
成员变量:就是事物的属性
成员方法:就是事物的行为
定义类其实就是定义类的成员:成员变量+成员方法
成员变量:和定义变量是一样的,只不过位置是在类中,方法外
成员方法:和定义方法是一样的,只不过要把static去掉,在类中除了变量外都是成员方法。方法中有一种是对成员变量进行初始化的,称为构造方法,构造方法之外的属于一般方法。成员方法分为构造方法和一般方法
类和对象的概念
类:是一组相关的属性和行为的集合(我们班所有的同学都具备相同的属性和行为,比如:姓名,年龄,学习,这样就把所有的学生成为学生类)
对象:是该类事物的具体体现(说某个同学时,他都具备自己特有的属性和行为)
成员变量与局部变量的区别
位置上的不同
成员变量在类中方法外;局部变量在方法中或者方法声明上
内存中的位置不同
成员变量是在堆内存;局部变量是在栈内存
生命周期不同
成员变量随着对象的创建而存在,随着对象的消失;局部变量随着方法的调用而存在,随着方法的调用完毕而消失
值初始化的问题
成员变量有默认值;局部没有默认值。必须先定义,后赋值,最后使用
private最常见应用
把成员变量用private修饰
提供对应的getXxx( )方法/setXxx( )方法用于获取和设置成员变量的值,方法用public修饰
this关键字
this代表所在类的对象引用
方法被哪个对象调用,this就代表那个对象
什么时候用this
常见应用:当局部变量和成员变量重名的时候,我们有没有办法把局部变量的name值赋给成员变量的name值呢?这时候this就解决了这个问题
构造方法
主要用来给对象的数据进行初始化
构造方法格式
方法名和类名相同
没有返回值类型,连void都没有
没有具体的返回值
构造方法注意事项
如果不提供构造方法,系统会给出默认构造方法
如果你提供了构造方法,系统将不再提供
构造方法也是可以重载的,重载条件和普通方法相同
含private、无参、有参构造的标准学生类
如果是无参的构造方法,要赋值给使用private修饰的成员变量,需要写成员方法getXxx( )和setXxx( )
如果是有参的构造方法,可以直接通过传参赋值给使用private修饰的成员变量,就不需要写成员方法getXxx( )和setXxx( )了
常用API
Scanner类
用Scanner类的方法可以完成接收键盘录入的数据
String类
"abc"是String类的一个实例,或者成为String类的一个对象
字符串字面值"abc"也可以看成是一个字符串对象
字符串是常量,一旦被赋值,就不能被改变
字符串本质是一个字符数组
创建字符串对象两种方式的区别
通过构造方法创建字符串对象是在堆内存
直接赋值方式创建对象是在方法区的常量池,是为了方便字符串的重复使用
StringBuilder类
StringBuilder是一个可变的字符串,字符串缓冲类
String、StringBuilder、StringBuffer的区别
可变与不可变
通过查看String的源码我们知道String是通过字符数组来保存一个对象的,且在这个字符数组前面加了final修饰符,说明String对象是不可变的。这就导致每次String的操作就会生成新的对象,导致效率低下且浪费空间。
是否线程安全
String对象不可变,可理解为它是线程安全的;StringBuffer 是线程安全的,而 StringBuider 是非线程安全的。从源码可以看出, StringBuffer 在方法或调用方法前面加上了Synchronized 同步锁,所以是线程安全的。
每个字符串缓冲区都有一定的容量。只要字符串缓冲区所包含的字符序列的长度没有超出此容量(通常是16个字节),就无需分配新的内部缓冲区数组。如果内部缓冲区溢出,则此容量自动增大。从 JDK 5 开始,为StringBuffer类补充了一个单个线程使用的等价类,即StringBuilder。与该类相比,通常应该优先使用StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。
共同点
StringBuffer 和 StingBuilder 都继承自 AbstractStringBuilder(抽象类) 抽象类和接口的区别是:抽象类可以定义一些子类公共的方法,子类只需要增加新的功能,而不需要重复写已经存在的功能。接口只是定义一些常量和对方法的声明。 String转其他基本数据的方式。
+=拼接字符串消耗内存原因
每次拼接会产生新的字符串对象,而利用StringBuilder来拼接字符串使用的是同一个StringBuilder容器