Java SE:是Java的标准版,提供了完整的java核心API。
Java EE:是Java的企业版,主要用于开发企业级分布式网络程序系统,核心为EJB(企业Java组件模型)。
Java ME:主要用于嵌入式系统开发。
(1)简单性:语言省略所有难以理解和困惑的特点在C++语言,如头文件、指针、结构、单元、运算符重载、虚拟基础类,等它更简洁严谨;
(2)面向对象:两个基本概念“类”和“对象”;三大特征“封装”,“继承”,“多态”;
(3)跨平台性:自带解释器,在需要运行 java 应用程序的操作系统上,先安装一个Java虚拟机,在不同的系统平台上都可以运行;
(4)既是编译执行的语言,也是解释执行的语言:源文件通过编译,形成一个文件(不是二进制文件),而是“字节码的文件.class”,这个自节码文件是跨平台 的文件(java的内部会有自己的解释器(虚拟机)),使用自带的“解释器”解释执行.class。
(1)编写源文件:编写Java源文件,他的扩展名为.java;
(2)编译:通过编译器把源文件编译成字节码文件,字节码文件的扩展名为.class;
(3)运行:使用解释器来运行字节码文件
在e盘下新建一个文本文档,文件名为MyFirstCode.java,内容如下:
public class MyFirstCode { public static void main(String[] args) { System.out.println("This is my fisrt code"); } }编译操作需要使用编译器来完成,它属于JDK的一部分,在安装JDK的时候已经安装好了,位置位于JDK的bin目录 下的javac.exe,使用DOS命令来运行它,如下图。
在编译时控制台上不会有输出,如果有输出说明源代码有错误,所以大家一旦编译出错,就要去查看源文件中是否 存在错误,正确编译后会在源文件同目录下生成字节码文件,扩展名为.class。
运行字节码文件需要使用java.exe命令,它与javac.exe在同一目录下,运行字节码文件与编译不同的是需要进入到 字节码文件所在的目录,并且在运行字节码文件是不要加扩展名,运行如下图。
可以发现每次程序编译与运行都要输入E:\ProgramFiles\jdk-8u144\bin后,才能使用javac.exe与java.exe,这样的 方式很麻烦,通过通过配置Windows的PATH环境变量就可以在不同位置编译运行。
配置PATH环境变量:鼠标右键点击计算机 → 属性 → 高级系统设置 → 点击环境变量 → 找到系统变量中的 PATH → 点击编辑按钮。将JDK安装目录\bin路径(我的电脑上的E:\ProgramFiles\jdk-8u144\bin)配置到PATH变量中,用 英文分号与其他变量隔开。还可如下配置环境变量:
(1)创建变量:变量名为:JAVA_HOME 变量值:安装JDK的目录;
(2)修改Path变量:在末尾添加信息: ;%JAVA_HOME%\bin;
(3)配置classpath: .;%JAVA_HOME%\lib\tools.jar。
Java中提供了三种注释方式,分别是:
(1)单行注释 //注释内容
(2)多行注释 /*注释内容*/
(3)文档注释 /**注释内容*/
文档注释的使用:javadoc –d 生成目录 –version –author 类名
关键字是被Java语言赋予特殊含义,具有专门用途的单词,Java中的关键字均为小写关键字如下:
在Java程序中,其实标识符就是名称的意思,除了关键字以外基本上都是标识符了,在定义类、方法、变量时总 要给它们起名字,这些名字就是标识符。
(1)英文字母: a-zA-Z
(2)数字:0-9
(3)符号:_和$
(1)不能以数字开头;
(2)不可以使用关键字
(3)严格区分大小写
在程序运行过程中一直不会改变的的量称为常量,通常也被称为“final变量”,。常量在整个程序中只能被赋值 一 次。在Java中声明一个常量除了要指定数据类型外。还需要通过final关键字进行限定,语法如下:
final 数据类型 常量名 [ = 值 ]
常量名通常使用大写字母,但这并不是必须的,是为了清除的表名变量。
在程序运行过程中其值能被改变的量称为变量,可以看成是存储数据的“盒子”。定义变量就是要告诉编译器这个变 量的数据类型,这样编译器才知道要分配多少内存给它,以及它能存放什么样的数据。在程序运行过程中,空间内的值是 变化的,这个内存空间就称为变量。内存空间内的值就是变量值。语法如下:
变量类型 变量名 [ = 变量值] []中的叫做变量的初始化
内存分配方式:
(1)基本数据类型:占用一块内存,如局部变量int i=1;在内存里面只分配了一块内存,里面存放的就是值 1,储到栈内存中,使用i这个名字来访问这块内存。
(2)引用数据类型:占用两块内存,如 String s此时为引用变量s分配了一块内存,但是目前这个内存什么 也没有存,因为此时s不指向任何一个对象,所以是null。当s=new String(“hi”)使用new创建了一个对象后,又分配 一块内存(堆),这个对象的内容“hi”就存放在新分配的内存中。而之前给s分配的内存也有了内容,根据这 个内容就可以找到第二块内存,使用其中的内容(“hi”)
Java中的数据类型分为基本数据类型和引用数据类型。
引用数据类型(无限个数):类,接口,数组 ,String 等(它用双引号)
-3.403E38~3.403E38
double8-1.798E308~1.798E308
字符型char2表示一个字符
布尔型boolean1只有两个值true与false
2.2.1.高低的级别:
byte,short,char=>int=>long=>float=>double其中,boolean类型不能跟其他类型之间做转换。
2.2.2.自动类型转换(隐式转换,宽向型转换):
将第类型赋值给高类型,如:Short s=10;Int i=20;i=s;
2.2.3.强制类型转换:
将高类型赋值给低类型,需要强制装换,格式:低类型 变量=(低类型)变量。
注意:强制类型转换可能会丢失精度,代码如下
int i = 357; //4字节 32位的二进制数
byte b = (byte)i; //1字节 8位的二进制
System.out.println(b); // 结果为101
2.2.4.字符串和其它类型转换:
字符串和其它类型转换会提升成String类型
运算符运算规则范例结果+拼接字符串"拼" + "接"拼接+正号+11+加1+23-负号-1-1-减2-11*乘1*22/除5/22%取余3/21++自加
int a=1;
a++/++a
2--自减int b=3;
a--/--a
2
注意:%取余操作和取模操作的区别,在于商:取余操作:商向0取整;模操作:商向下取整
++:前置++ 后置++:无论是前置还是后置,都对原来的变量进行+1, 对于表达的结果不同,后置++(会缓 存变量之前的值)指向的是变量+1之前的结果。
运算符运算规则范例结果=赋值int i=2;2+=加后赋值int i= 2,i+=13-=减后赋值int i= 2,i-=11*=乘后赋值int i= 2,i*=12/=除后赋值int i= 2,i/=12%=取余后赋值int i= 2,i/=10
运算符运算规则范例结果==相等于2==2;True!=不等于2!=2;False<小于2<1False>大于2>1True<=小于等于2<=1False>=大于等于2>=1True
注意:==如果两侧都是基本数据类型,则比较的是值大小;如果两侧都是引用类型,则比较的是地址是否是同一个
运算符运算规则范例结果&与false&trueFalse|或false|trueTrue!非!trueFalse^异或false^trueTrue&&短路与false&&trueFalse||短路或false||trueTrue
短路现象:&& 第一个表达式为false,则后面的表达式不执行
|| 第一个表达式为true,则后面表达式不执行
符号
运算规则范例结果
>>
右位移12 >> 2
3
<<
左位移12 << 2
48
>>>
无符号右位移12>>> 2
3
&
按位与12 & 9
8
|
按位或12| 9
13
^
按位异或12^ 9
5
位运算符是对于补码进行的按位操作:
& :如果两个都是1,则返回1,否则返回0
| : 如果两个都是0,则返回0,否则返回1
^ : 如果两个相同,则返回0,否则 ,返回1
~ :一元运算符,对于某一个数的补码进行按位取反,包括符号位。
语法: 条件表达式?值1:值2
规则:如果条件表达式返回为真,取值1,否则取值2;值1表达式的类型和值2的表达式类型一致
1
括号
()、[]
2
正负号
+、-
3
自增自减,非
++、--、!
4
乘除,取余
*、/、%
5
加减
+、-
6
移位运算
<<、>>、>>>
7
大小关系
>、>=、<、<=
8
相等关系
==、!=
9
按位与
&
10
按位异或
^
11
按位或
|
12
逻辑与
&&
13
逻辑或
||
14
条件运算
?:
15
赋值运算
=、+=、-=、*=、/=、%=
16
位赋值运算
&=、|=、<<=、>>=、>>>=
优先级: ()调整优先级
大体遵循规则:
算术运算符> 比较运算符 > 位运算符> 逻辑运算符> 赋值运算符
!优先级别最高
程序从上到下,从左到右执行。
if结构语法,有3种如下:
(1) if(条件表达式){
//执行语句
}
int i = 2; if(i == 2) { System.out.println(i); }(2) if(条件表达式){
//执行成立语句1
}else {
//执行不成立语句2
}
int x = 5; int y = 2; if(x==3) { y = x + y; }else { y = x - y; } System.out.println(y);(3) if(条件表达式1){
//执行语句2
}else if(条件表达式2){
//执行语句2
}else {
//执行语句3
}
int x = 10; int y = 0; if(x>=3) { y = 2 * x + 1; }else if(-1<x && x<3){ y = 2 * x; }else if(x<=-1){ y = 2 * x - 1; } System.out.println(y); }注意:(1)分支语句中执行语句只有一个表达式可以省略大括号,否则不能省略。
(2)多分支语句中将条件范围小的放在最前面;如果前面的条件成立,后面的条件即使成立也不执行。
switch结构语法:
switch(变量/常量){
case 值1:
//执行1;
break;
case 值2:
//执行2;
break;
......
defualt:
//执行3;
break;
}
注意:(1)变量/常量的类型只能是:byte,short,int,char,String(jdk1.7后),枚举;
(2)当省略break时,顺序从满足条件的语句从上到下执行,与case无关;
(3)case块中的值是唯一的,并且是等值比较的。
int score = 99; switch (score / 10) { case 9: case 10: System.out.println("A"); break; case 8: System.out.println("B"); break; case 7: System.out.println("C"); break; case 6: System.out.println("D"); break; default: System.out.println("不及格"); break; }for循环
for(初始值表达式①,条件表达式②,迭代④){
//执行③
}
//水仙花树(100~500) 153=1*1*1+5*5*5+3*3*3 for(int i=100;i<500;i++) { int theUnit = i; int decade = i/10; int hundred = i/100; if(i==theUnit *theUnit *theUnit +decade *decade *decade +hundred *hundred *hundred ) { System.out.println(i); } }while循环
初始值①
while(条件表达式②){
//执行③
//迭代④
}
//100以内能被5整除的数的和 int sum = 0; int i=1; //初始值 1 while(i<=100) { if(i%5==0) { sum += sum; } i++; }do while循环
//初始值①
do{
//执行②
//迭代③
}while(条件表达式④);
//输入字母,如果为q则退出系统 Scanner in=new Scanner(System.in); System.out.println("请输入字母, 输入q则退出系统"); String letter =""; do { letter=in.nextLine(); } while (!letter.equals("q")); System.out.println("退出系统");foreach循环(增强for循环)
for(类型 对象 : 数组或集合){
//执行操作
}
注意:(1)按照①-④的循序执行;
(2)for循环和while循环的特点:先判断,后执行;do while先执行一次再判断;增强for循环用于变量数组 或集合。
//遍历数组 int[] array = new array[]{11,22,33,44,55,66}; for(int every : array){ System.out.println(every + " "); }在一个循环中又嵌套另一个循环结构。
嵌套循环特点:外层循环执行一次,内层循环执行全部。
for(int i=0;i<10;i++) { for(int j=0;j<=i;j++) { System.out.print("*"); } System.out.println(); }break(终止,打断):只能出现在switch语句和循环结构中;在循环中表示终止循环;后面不能跟输出语句;
continue(继续):只能出现在循环结构中;表示结束当前循环,进入下一次循环;
循环标号见如下代码:
label:for(int i=2;i<=100;i++) { for(int j=2;j<=Math.sqrt(i);j++) { if(i%j==0) { continue label; } } }break和continue都遵循就近原则。正常的break只退出一重循环,你可以用标号标出你想退出哪一个语句。