背诵--1
Java语言的跨平台实现原理
JVM:Java虚拟机,是专门用来运行java程序的(JVM(Java Virtual Machine ):Java虚拟机,简称JVM,是运行所有Java程序的假想计算机,是Java程序的运行环境,是Java 最具吸引力的特性之一。我们编写的Java代码,都运行在 JVM 之上。)
跨平台:
我们编写一个程序,
可以在不同的操作系统上运行
一次编译(写),到处运行
说几个问题?
1.Java程序是跨平台的?正确的
Java程序只需要编写一次,就可以在不同的操作系统上运行
2.JVM是跨平台的?错误的
JVM是不跨平台的,java针对不同的操作系统,提供了不同的JVM
3.Java程序的跨平台,是通过JVM的不跨平台实现的
正确的
JDK_JRE_JVM的组成和作用
JVM:Java虚拟机,是专门用来运行java程序的,但是不能独立安装。
JRE:Java运行环境,包含JVM和核心类库(Java已经写好的功能) --普通用户,只需要运行程序
JDK:Java开发工具,包含JRE和开发工具(比如: javac命令,java命令) --程序开发人员
三者关系: JDK > JRE > JVM
环境变量JAVA_HOME的配置
配置环境变量的目的/作用: 让某些命令可以在任意路径下直接运行(java程序: javac命令,java命令)
比如jdk的安装路径: C:\develop\Java\jdk1.8.0_162
配置环境变量的步骤:
1.创建名称为JAVA_HOME的环境变量,值是 C:\develop\Java\jdk1.8.0_162
2.把名称为JAVA_HOME的环境变量添加到系统环境变量path中
path:%JAVA_HOME%\bin;...
Java程序开发的三个步骤
HelloWorld案例的编写编译运行
步骤:
1.创建HelloWorld.txt文本文件,把扩展名修改给.java,最终文件名称HelloWorld.java
2.用记事本软件打开HelloWorld.java文件,编写如下内容
public class HelloWorld {
public static void main(String[] args){
System.out.println("HelloWorld");
}
}
3.使用javac命令进行编译
格式: javac 文件名.java
javac HelloWorld.java
注意:
(1)保证该javac命令在当前路径下可以执行
(2)保证在当前路径下可以看到被编译的.java文件
(3)编译javac命令,后面要跟文件的扩展名.java
4.使用java命令执行
格式: java 文件名
java HelloWorld
注意:
(1)保证该java命令在当前路径下可以执行
(2)保证在当前路径下可以看到被执行的.class文件
(3)执行java命令,后面不要跟文件的扩展名.class
注释
1.注释概念:是用来解释说明程序的,是给程序员看的,不参与编译和运行,不影响程序的执行效率。
2.注释分类:
(1)单行注释: // 只能写一行内容
(2)多行注释: /* 可以写多行内容 */
(3)文档注释: /** 可以写多行内容 */
常量
1.常量的概念: 在程序的执行过程中,值不可以发生改变的量
2.常量的分类:
(1)整数常量: 100,-200
(2)小数常量: 6.6,-8.8
(3)字符常量:
java中规定,字符常量必须使用单引号''引起来,而且单引号''中只能有一个字符(不能没有字符,也不能有2个及以上的字符)
举例:
A: 'a' 正确的
B: '' 错误的,''中不能没有字符
C: 'ab' 错误的,''中不能有2个及以上的字符
D: '好' 正确的,一个汉字代表一个字符
E: '女子' 错误的,''中不能有2个及以上的字符(汉字)
(4)字符串常量:
java中规定,字符串常量必须使用双引号""引起来,而且双引号""中可以写多个字符(0个,1个,2个...)
举例:
A: "a" 正确的
B: "" 正确的
C: "ab" 正确的
D: "好" 正确的
E: "女子" 正确的
(5)布尔常量:只有两个取值
true: 理解为成立的,对的,正确的,肯定的,成功
false: 理解为不成立的,错的,错误的的,否定的,失败
(6)空常量: null 【了解】 不能直接打印null值
变量
变量的注意事项
定义long类型的变量时,需要在整数的后面加L(大小写均可,建议大写)。
定义float类型的变量时,需要在小数的后面加F(大小写均可,建议大写)。
标识符
命名规则: 硬性要求
(1)标识符可以包含 英文字母26个(区分大小写) 、 0-9数字 、 $(美元符号) 和 _(下划线) 。
(2)标识符不能以数字开头。
(3)标识符不能是关键字。
命名规范: 软性建议
(1)类名规范:首字母大写,后面每个单词首字母大写(大驼峰式)。
(2)方法名规范: 首字母小写,后面每个单词首字母大写(小驼峰式)。
(3)变量名规范:首字母小写,后面每个单词首字母大写(小驼峰式)。
自动类型转换
Java程序中要求参与的计算的数据,必须要保证数据类型的一致性,如果数据类型不一致将发生类型的转换。
1.自动类型转换概念:
取值范围小的数据或者变量可以直接赋值给取值范围大的变量(小萝卜可以直接放入大坑中)
2.特点:
(1)是自动完成的,不需要代码的特殊处理
(2)只要byte/short/char类型的数据参加运算,会自动转换为int类型
(3)转换规则: byte、short、char-->int-->long-->float-->double
举例:
有一个byte类型(1个字节)的数字5: 00000101
自动类型转换成short类型(2个字节): 前边(左边)补充1个字节的0,数字的大小没有发生改变,还是5
00000000 00000101
自动类型转换成int类型(4个字节): 前边(左边)补充3个字节的0,数字的大小没有发生改变,还是5
00000000 00000000 00000000 00000101
自动类型转换成long类型(8个字节): 前边(左边)补充7个字节的0,数字的大小没有发生改变,还是5
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000101
总结: 所谓的自动类型转换,其实就是根据需求在数字前面补充若干字节的0,但是数字大小没有影响(打肿脸充胖子)
强制类型转换
1.强制类型转换概念:
取值范围大的数据或者变量不能直接赋值给取值范围小的变量,必须进行强制类型转换(大萝卜不能直接放入小坑当中)
2.格式:
转后类型 变量名称 = (转后类型)转前数据或者变量;
3.问题: 会丢失数据或者损失精度
举例:
有一个long类型(8个字节)的数字5:
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000101
强制类型转换成int类型(4个字节): 砍掉左侧4个字节的数字,都是0,对数字没有影响,还是5
00000000 00000000 00000000 00000101
强制类型转换成short类型(2个字节): 砍掉左侧6个字节的数字,都是0,对数字没有影响,还是5
00000000 00000101
强制类型转换成byte类型(1个字节): 砍掉左侧7个字节的数字,都是0,对数字没有影响,还是5
00000101
总结: 所谓的强制类型转换,其实就是根据需求砍掉左侧若干字节的数据,如果被砍掉的都是0,对数字没有影响,被砍掉的内容只要包含1,
就会影响原数字的大小(缺点: 可能会损失精度)
6000000000L:
000000000 000000000 000000000 000000001 01100101 10100000 10111100 00000000
强制转换成int类型: 砍掉左侧的4个字节,包含了一个数字1(有个2的32次方)
01100101 10100000 10111100 00000000: 1705032704 = 6000000000L - 2^32 = 6000000000L - 4294967296
= 1705032704
逻辑运算符的短路效果
短路的逻辑运算符:
(1)&&: 左侧为false,右侧不进行计算
(2)||: 左侧为true,右侧不进行计算
switch
注意:
(1)break关键字是用来结束switch语句的,遇到break,直接跳出switch语句,执行后续代码
(2)default的作用: 如果所有的case中的常量值和switch后面的表达式的结果都不相同,执行default后面的代码
(3)如果default放在最后面,那么它break可以省略
(4)如果每个case后面有break,而且default后面也有break,那么case和default顺序可以任意调整
(5)switch后面()中表达式的数据类型只能是以下类型: ------------------------重要---------
基本类型: byte/short/char/int 引用类型: String和枚举
(6)case后面只能写常量,不能写变量,而且多个case中的常量值是不可以重复的 ------------------------重要---------
java中的内存分配
数组内存图
方法格式
修饰符 返回值类型 泛型 方法名称(参数列表){
功能代码;
return ;
}
方法重载
参数列表不同有哪些情况可以构成重载?
1.数量不同
2.类型不同
3.多个类型,顺序不同
方法重载与哪些因素无关?
1.与参数的名称无关
2.与返回值类型无关
3.与修饰符无关
方法重载只和方法名和参数有关,与方法的关键字和返回值无关。
面向对象思想
面向对象思想总结:
1.面向过程:当要实现一个功能时,需要亲力亲为,处理每个细节
2.面向对象:当要实现一个功能时,不关心具体的实现步骤,只关心结果,找一个具有该功能的类,帮我们做事
3.面向对象的思想
(1)面向对象是基于面向过程的编程思想
(2)面向过程:强调的是每一个功能的步骤
(3)面向对象:强调的是对象,然后由对象去调用功能
4.特点
(1)是一种更符合我们思考习惯的思想
(2)可以将复杂的事情简单化
(3)角色发生了转换,将我们从执行者变成了指挥者
面向对象思想举例:
洗衣服:
面向过程:把衣服脱下来-->找一个盆-->放点洗衣粉-->加点水-->浸泡10分钟-->揉一揉-->清洗衣服-->拧干--
>晾起来
面向对象:把衣服脱下来-->打开全自动洗衣机-->扔衣服-->按钮-->晾起来
吃烤鸭:
面向过程:是现有鸭还是现有蛋(还是先买只鸭蛋)-->小鸭子-->养大-->学技术-->买机器-->做烤鸭(前几次都不能)-->开吃
面向对象(面向全聚德烤鸭店) : 到全聚德烤鸭店-->点餐-->交钱-->服务员上餐-->开吃
类与对象的关系
什么是类?
类:是一组相关属性和行为的集合。可以看成是一类事物的模板,使用事物的属性特征和行为特征来描述该类事物。
现实中,描述一类事物:
属性:就是该事物的状态信息。
行为:就是该事物能够做什么。
什么是对象?
对象:是一类事物的具体体现。对象是类的一个实例(对象并不是找个女朋友),必然具备该类事物的属性和行为。
类与对象的关系
类:类是对现实生活中一类具有共同属性和行为的事物的抽象
类是对一类事物的描述,是抽象的。
对象:是能够看得到摸的着的真实存在的实体
对象是一类事物的实例,是具体的。
简单理解:类是对事物的一种描述,对象则为具体存在的事物
类是对象的模板,对象是类的实体。
对象的成员变量有默认初始化值
(1)基本类型
整数(byte/short/int/long) 0
小数(float/double) 0.0
字符(char) 空白字符
布尔(boolean) false
(2)引用类型 null
对象的内存图
String简介
"abc" 等效于 char[] data={ 'a' , 'b' , 'c' }
jdk8及以前: String内部使用的就是字符数组
jdk9及以后: String内部使用的就是字节数组
例如:
String str = "abc";
相当于:
char data[] = {'a', 'b', 'c'};
String str = new String(data);
// String底层是靠字符数组实现的。
StringBuilder简介
字符串缓冲区可以支持可变的字符串
java.lang.StringBuilder类:就是一个字符串缓冲区,内部的字符串内容是可以改变的
特点:内部字符串内容可以改变
底层是字符数组:默认初始化容量长度为16的字符数组(随着内容的添加,会变成更大的数组,内容也可以改变)
注意:
当向StringBuilder对象中添加内容时,其实就是向它内部的数组中添加内容
1.添加内容后,数组没有使用完毕;留着可以下次继续添加
2.如果添加内容后,发现数组剩余空间不够使用了
StringBuilder内部会实现数组的自动扩容
3.首先创建长度为原数组长度2倍+2的新数组
4.把原数组中的内容拷贝到新数组中
5.新数组中剩余空间,可以继续添加元素
扩容方式:
默认长度:16
第一扩容 16*2+2 34
第二扩容 34*2+2 70
第三扩容 70*2+2 142