1
java编译运行过程
程序员编写的java源文件(.java)先经过编译生成字节码文件(.class)
java程序的运行需要JVM的支持,JVM是一个软件,安装在操作系统中,为字节码提供运行环境.
只要是标准的.class文件就可以"到处运行"
JDK-java开发工具包
JRE-java运行环境
JVM-java虚拟机
运行一个java程序所需要的最小环境为JRE,开发一个java程序所需要的最小环境为JDk.
JDK包括JRE和 编译\运行等开发工具,JRE包括java系统类库和JVE
Eclipse是目前主流的IDE开发环境(集成开发环境)
所谓集成开发环境(IDE\Integrated Development Environment)是专门为程序员提供的应用软件,这些软件具备有强大的图形界面.在IDE的辅助下程序员可以更好的完成编译调试提交重构的工作
Eclipse比其他IDE成功的最大原因在于它是基于"插件"的特性.
由于Eclipse本身也是java语言编写的,他的运行需要有JRE环境,因此必须先安装JDK(或JRE)
java:美国Sun公司的,Sun已经被Oracle收购了
纯手写、不借助于开发工具时----------必须要配置环境变量
借助于开发工具(eclipse+idea)--------环境变量可配可不配
(一些东西工具自动帮咱们设置好了)
2
什么是变量?
变量就是指代在内存中开辟的存储空间,用于存放运算过程中需要用到的数据.
变量的声明:用特定的语法声明一个变量,让运行环境为其分配空间;
变量的初始化:变量声明后,要为其赋一个确定的初值后在使用;
变量的命名:变量需要有个见名知意,而且要符合java语言规范
变量必须指明其类型 必须指明变量名称 JVM会根据不同的变量类型开辟不同的存储空间(结构).
如果变量类型一样可以用逗号分隔声明多个
可以在变量声明时初始化; 在第一次使用变量前初始化
可以对变量的值进行存取\操作:变量是存放数据在空间,可以对其赋值\更改和操作;要把对变量的操作理解为是对其所存储的数据的操作.
变量的操作必须与其类型匹配:变量在声明时指定了类型,java编译器会检测对该变量的操作是否与其类型匹配,如果对其变量的赋值或者操作与其类型不匹配,会产生编译错误.
java语言语法规定,变量使用之前必须声明,否则会有编译错误:变量没有声明有时候是拼写错误造成的.
java语言规定变量在使用之前必须初始化,即必须给变量赋予特定的值.
变量的命名:
命名需要符合标识符语法要求:
1只能由字母\数字\"_"和"$"符组成;2不能以数字开头3严格区分大小写4不能使用java关键字(一些java语言规定好的,有特殊含义的字符),如:int\if\for/break等;5中文可以作为变量名,但不提倡用.
见名知意的同时变量的命名需要采用"驼峰命名法"即如果变量的名字由多个单词组成,除第一个单词外,其他单词的首字母大写,其余字母小写如:selary\javaScore\studentName\等.
八种基本数据类型分别用于存储整数 浮点数 字符数据 和 布尔类型数据.
整数类型 byte: 1字节8位 -128到127;short:两个字节16位 -32768到32767
int: 4字节32位 -21亿多到21亿多; long:8字节64位 很大;
浮点型:float 4字节32位 比long的范围大 double:8字节64位 比float大
如何存储? 指数部分是一个整数 float类型分配8位专门来存储指数 ,剩下23位用来存储尾数 ,大概可以表示小数点后的6到7位;double分配了11位剩下的52位用来存尾数 可以表示小数点后的15到16位
首字母表示正负 float后七位表示的128次幂 大约为3.4e+38
double 大约为1.7e+308
char字符型 存储1字符 两字节16位 0到65535
boolean 1字节8位 存储逻辑变量(true false)
byte存储字节数据 short (兼容性考虑很少用) int存储普通整数
long存储长整形 float存储浮点型 double 存储双精度浮点型 char存储一个字符
boolean存储逻辑变量
整数直接量是int类型:所为整数直接量就是直接写出的整数;整数的直接量默认为int类型,如果字节写出的整数超过了int的表达范围,将会出现编译错误. 除了通常的十进制书写形式,整数直接量也经常写16进制的形式(以OX或Ox开头)或8进制的形式(以0开头).
整型数据相除,会舍弃小数部分(不是四舍五入),结果也是整数.
long类型 在表示整数时,如果int类型的范围不够,可以使用long型需要以L或l结尾.
JDK提供System.currentTimeMillis()方法,返回1970年1月1日零点到现在的毫秒数,其基本类型为long,该方法经常用于计时操作.
浮点数就是小数,包括:float和double double类型的精度值是float类型的两倍,这正是其名称(双精度)的来由.大多数场合使用double表示浮点数.
浮点数的直接量如:3.14\3.0\0.1\.5等(写3也对输出为3.0)
默认的浮点直接量为double型,如果需要表示float类型的直接量需要加"f"或"F"后缀.
2进制系统中无法精确的表示1/10,就好像十进制系统无法精确的表示1/3一样.所以2进制表示10进制会有一些舍入误差,对于一些精确运算的场合会导致代码的缺陷.(如果需要精确的运算可以考虑放弃使用double或float而采用BigDecimal类实现)
char类型 字符型事实上是一个16位的无符号整数,这个值是对应字符的编码,java字符类型采用Unicode字符集编码,Unicode是世界通用的定长字符集,所有的字符都是16位
字符直接量可以采用诸如:'中'的形式,也可以采用16进制的表示形式如:'\u4e2d'其中'4e2d'为'中'所对应的16位Unicode编译的16进制表示形式.'\u'表示转义为Unicode编码
在对char型变量赋值时,可以用三种形式:字符直接量 如'A'变量中实际存储的是该字符的Unicode编码(无符号整数值),一个char型变量只能存储一个字节.整数直接量:范围在0到65535之间的整数,变量中实际存储的即该整数值,但表示的是该整数值所对应的Unicode字符;Unicode形式:形如'\u0041'Unicode字符的16进制形式
char c1=65;
char c2='A';
char c3='\u0041';
转义字符:对于不方便输出的字符采用转义字符表示,例如:'\n'表示换行符 new line '\r'表示回车符 return
'\\'表示反斜杠(\) '\''表示单引号(') '\'''表示双引号('')
基本类型间的转换:不同的基本类型直接可以相互转换:1自动类型转换(隐式类型转换):从小类型到大类型可以自动完成.类型的大小关系如下:byte->short->int ->long->float->double char->int
强制转换:从大类型到小类型需要强制转换符:但是这样有可能会造成精度的损失或者溢出.
数值运算时的自动转换:在基本类型参与的表达式运算中,运算结果会自动的向较大的类型进行转换
byte char short三种类型实际存储的数据都是整数,在实际使用中遵循如下规则:1 int直接量可以直接赋值给byte char short只要不超过其表示范围
byte char short三种类型参与运算时,先一律转换成int类型再进行运算.
3
算数运算
使用%运算符 java算数运算符通常的加减乘除之外还包括取模运算和自增及自减运算. 取模运算%意味取余数,可适用于整数 char类型以及浮点数.
使用++和-- java的自增和自减继承自C++ 如果写在变量前表示在使用这个变量之前加1或减1 如果写在变量之后表示这个变量使用完之后再加1或减1
关系运算 使用关系运算符用于判断数据之间的大小关系,包括大于(>) 小于(<) 大于等于(>=) 小于等于(<=) 等于(==) 不等于(!=)六个运算符.关系运算符的结果为boolean类型 成立为true 否则为false
逻辑运算
逻辑运算符建立在关系运算符的基础上&& || !(短路逻辑)
赋值运算
使用=进行赋值运算 用于对变量赋值.关于赋值运算符除了将右边的表达式计算出来赋给左边以外还具有如下特点:赋值表达式本身也有值,其本身之值即为所赋之值.
扩展赋值运算符 在赋值运算符前面加上其他的运算符,即为扩展赋值运算符 += 表达式 X += 5 计算X= X+5 结果15 -= *= /= %=
字符串连接运算
使用+实现字符串的连接,同时可以实现字符串与其他数据类型"相连"
使用条件(三目)运算符
其结构为boolean表达式?表达式1:表达式2
分支结构 if语句 ifelse语句 else if语句 switch-case语句和break联合使用
swith-case的优势 1常常和break语句结合使用实现分支的功能 2在实现分支功能时if-else的主要区别在于switch-case结构的效率要高 结构更清晰. 3从JDK7开始switch-case支持字符串表达式.
default其他不走才走这个
循环一定要分析出需要解决业务的3个部分 1 循环的初始状态 2 循环的条件 3 循环变量的改变
while语句使用break语句跳出循环 do-while先执行在判断
循环中使用continue语句其作用为跳过循环体中剩余语句而执行下一次循环
循环问题
循环问题定义-"当"循环 循环语句的选择 1如果业务转换为"当"这样的语句时,优先选择while语句来实现 2如果业务可以转换为"直到.."这样的句式时,优先选择do-while语句来实现 3如果业务中可以获取到一个确切的循环次数考虑for循环
4
什么是数组?
程序=算法+数据结构 前面学习的if if-else switch 循环解决的都是流程问题即算法问题 所谓数据结构,简单说就是把数据按照特定的某种结构来保存,设计合理的数据结构是解决问题的前提.
数组是相同数据类型的元素的组成的集合
数组的定义
定义基本类型数组 声明语法:数据类型[] 数组名=new 数据类型[大小];例:int[] arr=new int [10];
int[] arr与int arr[]两种写法均可 声明数组时不规定数组长度,new关键字分配空间时需要指定分配的空间大小. 执行new语句才使得数组分配到了指定大小的空间
初始化数组 基本类型的数组创建后,其元素的初始值:byte short char int long 为0;float和double为0.0;boolean为false
可以在数组声明的同时对数组的元素进行初始化,例如: int[] arr={10,20,30,-10,21};元素个数即为数组的长度 此种写法只能用于声明时的初始化,不能用于赋值.
可以通过下面的方式给已经声明的数组类型变量进行初始化: int[] arr; arr=new int[]{10,20,30,-10,96};注意[]中不可以写长度,元素的个数就是数组的长度.
获取数组的长度 用.length()来实现
数组中的元素通过下标的方式进行访问
遍历数组元素,通常选择for循环语句,循环变量作为访问数组元素的下标,即可访问数组中的每一个元素
int[] arr=new int[10];
for(int i=0;i<arr.length;i++)
{arr[i]=100;}
注意:循环的计数器的变化范围从0到length-1
遍历数组元素,正序输出
int[] arr=new int[]{10,20,30,40,50};
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]);}
遍历数组元素,倒序输出
int[] arr=new int[] {10,20,30,40,50}
for(int i=(arr.length-1);i>=0;i--{
System.out.println(arr[i]);}
数组的复制
System.arraycopy复制数组: 使用System.arraycopy()方法用于数组复制 参数(源数组,源数组的起始位置,目标数组,目标数组的起始位置,要复制的数组元素的数量
Arrays.copyOf复制数组: 类型[] newArray =Arrays.copyOf( 类型[] original,int new Length); 特点:生成的新数组是原数组的副本 newLength小于源数组,则进行截取
newLength大于源数组,则用0或null填充所以产生的新数组可以大于源数组的长度
int[] a={10,20,30,40,50};
int[] a1=Arrays.copyOf(a,6);
a1数组元素为:10 20 30 40 50 0
数组的扩容:数组的长度在创建后是不可改变的,所谓扩容是指创建一个更大的新数组并将原有数组的内容复制到其中。
int[] a={10,20,30,40,50};
a=Arrays.copyOf(a,a.length+1);
扩展后的数组 源数组 扩展后的长度
输出a数组元素:10,20,30,40,50,0
数组的排序
排序的算法有:插入排序、冒泡排序、快速排序等。
对于元素多的数组,排序算法的优劣至关重要;一般情况下,通过排序过程中数组元素的交换次数来衡量排序算法的优劣。
JDK提供了Arrays.sort()方法封装了数组的排序算法:
int[] arr={19,4,6,777,3};
Arrays.sort(arr);
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}
方法(函数,过程)
各种语言都有方法的概念(有的语言称为函数或过程)方法用于封装一段特定的逻辑功能 如:执行计算或操作;方法可以在程序中反复被调用;方法可减少代码复用,便于程序的维护。
定义方法(函数,过程)的功能 :方法用于封装一个特定的功能;定义方法的五个要素:修饰词、返回值类型、方法名、参数列表、方法体;
方法的参数是指:在调用时传递给方法,需要被方法处理的数据;
方法可有参数也可有没有参数,有参可以使方法处理更加灵活;
在方法定义时,需要声明该方法所需要的参数变量。
在方法调用时,会将实际的参数值传递给方法的参数变量。必须保证传递参数的类型和个数符合方法的声明。
定义调用结束后哭返回一个数据,称为返回值;方法在声明时必须指定返回值的类型。 若方法不需要返回数据,将返回值类型声明为void。 若方法需要返回数据,将返回值类型声明为特定数据类型。
方法的调用:
可通过return语句返回,return语句的作用在与结束方法与数据返回给调用方。