Java基础知识点备忘录

552 阅读12分钟

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容器