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 等(它用双引号)
四类 | 八种 | 字节数 | 范围 |
整型 | byte | 1 | -2^7~2^7-1 |
short | 2 | -2^15~2^15-1 | |
int | 4 | -2^31~2^31-1 | |
long | 8 | -2^63~2^63-1 | |
浮点型 | float | 4 | -3.403E38~3.403E38 |
double | 8 | -1.798E308~1.798E308 |
|
字符型 | char | 2 | 表示一个字符 |
布尔型 | boolean | 1 | 只有两个值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类型
运算符 | 运算规则 | 范例 | 结果 |
+ | 拼接字符串 | "拼" + "接" | 拼接 |
+ | 正号 | +1 | 1 |
+ | 加 | 1+2 | 3 |
- | 负号 | -1 | -1 |
- | 减 | 2-1 | 1 |
* | 乘 | 1*2 | 2 |
/ | 除 | 5/2 | 2 |
% | 取余 | 3/2 | 1 |
++ | 自加 | int a=1; a++/++a |
2 |
-- | 自减 | int b=3; a--/--a |
2 |
注意:%取余操作和取模操作的区别,在于商:取余操作:商向0取整;模操作:商向下取整
++:前置++ 后置++:无论是前置还是后置,都对原来的变量进行+1, 对于表达的结果不同,后置++(会缓 存变量之前的值)指向的是变量+1之前的结果。
运算符 | 运算规则 | 范例 | 结果 |
= | 赋值 | int i=2; | 2 |
+= | 加后赋值 | int i= 2,i+=1 | 3 |
-= | 减后赋值 | int i= 2,i-=1 | 1 |
*= | 乘后赋值 | int i= 2,i*=1 | 2 |
/= | 除后赋值 | int i= 2,i/=1 | 2 |
%= | 取余后赋值 | int i= 2,i/=1 | 0 |
运算符 | 运算规则 | 范例 | 结果 |
== | 相等于 | 2==2; | True |
!= | 不等于 | 2!=2; | False |
< | 小于 | 2<1 | False |
> | 大于 | 2>1 | True |
<= | 小于等于 | 2<=1 | False |
>= | 大于等于 | 2>=1 | True |
注意:==如果两侧都是基本数据类型,则比较的是值大小;如果两侧都是引用类型,则比较的是地址是否是同一个
运算符 | 运算规则 | 范例 | 结果 |
& | 与 | false&true | False |
| | 或 | false|true | True |
! | 非 | !true | False |
^ | 异或 | false^true | True |
&& | 短路与 | false&&true | False |
|| | 短路或 | false||true | True |
短路现象:&& 第一个表达式为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
注意:(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%10;
int decade = i/10%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只退出一重循环,你可以用标号标出你想退出哪一个语句。