一、Java简介
1、Java的特点
1、是一个行业内通用的技术实现标准
2、是一门面向对象的编程语言:这样就使得Java语言语法结构会更加方便开发
3、提供有方便的内存回收处理机制:Java可以提供自动的内存回收操作
4、避免复杂的指针问题,用引用代替指针
5、可以多线程编程
6、有更高效的网络处理能力,可以基于NIO实现更加高效的数据传输处理
7、Java具有可移植性
2、Java的运行机制
- Java是编译型和解释型两种语言的结合
- 编译命令:javac.exe
- 解释命令:java.exe
- Java程序组成:Java源文件、字节码文件、机器码指令
- Java编译器针对java虚拟机产生class文件,因此是独立于平台的;
- java解释器负责将java虚拟机的代码在特定的平台上运行:
3、JDK
JRE只提供程序的解释功能,不提供程序的开发功能,当我们的本机上配置好JDK后就会自动JRE的更新处理JDK负责把编写好的Java文件编译成class文件,JREA负责把class文件运行,JDK包含JRE。JVM是核心虚拟机,是JRE的重要组成部分,因为要运行class文件除了虚拟机之外还要字节码解释器等其他的工具。
4、Java的执行过程
- javac Hello.java :会出现一个Hello.class的字节码文件
- 利用JVM进行编译,编译出一套与平台无关的字节码文件
- java Hello :在JVM上进行程序的解释执行
- 解释的就是字节码文件,字节码文件的后缀是不需要编写的
二、Java编程起步
1、类
- “public class 类名称{}”:如果用了public定义类,那类名称必须和文件名相同
- 一个
java
文件只能有一个public类 - “class 类名称{}”:类名称可以与文件名称不一致,但是编译后的*.class名称是class定义的类名称
- 在一个
java
文件里可以有多个不同的class文件,而且编译之后会形成不同的*.class文件 - 所以一个.java文件里一般只定义一个public class就够了*
- 主方法是程序的起点有主方法的类叫做主类,所有的主类都将用public class来定义
注意:Java的类的命名每个单词都要大写字母开头
2、屏幕打印
- 输出之后追加换行:
System.out.println();
- 输出之后不追加换行:
System.out.print();
三、CLASSPATH的用处
因为只有在所在目录下存在字节码文件,才能使用java *.class,那我们就能得出一个结论,默认情况下所有解释的类都是从当前所在目录加载类文件。但如果我们需要在任何目录下都能解释某个目录下的class文件,就需要定义CLASSPASTH的环境属性。e.g.,在编写好的程序最后加上一句 :SET CLASSPATH = d:\mldnjava;
四、Java基础语法
1、注释
- 单行注释://
- 多行注释:/* … */
- 文档注释:/** … */
2、关键字
- JDK1.4出现assert,用于异常处理
- JDK1.5出现enum,用于枚举
- java到现在都未使用的关键字:goto、const;
3、数据类型
-
基本数据类型
-
数值型:整型 (默认类型为0)
浮点型 (默认类型为0.0)
-
布尔型:boolean (默认类型为false)
-
字符型:char (默认类型为‘\u0000’)
-
字节型:byte
-
-
引用数据类型(涉及到内存)
数组;类(包括String类); 接口 (默认类型都为null)
-
基本原则
- 数字最好用int(整数)、double(小数)
- 数据传输或者文字编码转换用byte
- 处理中文用char
- 描述内存或文件大小、表的主键列(自动增长)使用long
4、数据的定义和操作
定义的语句和C差不多, e.g., int x = 10; int y = 20;
-
所有的整数常量都是int型,但是如果怕运算溢出的话,可以直接在后面追加L或变量前(long)转换
int */ int --> int int + int --> int
超过最大值的范围会从最小值算起;超过最小值会回到最大值,是个循环过程,被称为数据溢出,要解决这个问题那么就扩大使用范围,也就是换个类型
long + int --> long
服从大的类型 -
一般来说不建议把大的数据类型直接赋值小的数据类型,但是常量(int)可以直接赋值给byte:byte=10,这个是java设定的,只要不超过byte的范围就行,但是超过了就需要进行强制转换。
这里有一个需要注意的点,下面的代码输出的不是报错,而是溢出变成-2147483647:int x = 2147483647; x += 2L
-
java里任意小数常量的数据类型都是double类型,所以定义以下语句是错误的:
float x = 20.2; double */ int --> double;
error:20.2是double类型,不能直接赋值给float类型
所以我们发现整型是不包含小数点的,浮点型是包含小数点的,所以整数和整数运算是不包含小数点的,e.g., 10/4 = 2,如果想得到正确的结果就需要转型处理,e.g., x = 10;y = 4; double(x)/y=2.5 -
字符型类型只用‘ ’定义
1、字符类型在任何编程语言中都可以与int类型转换,也就是说字符中所描述的内容可以通过int获取其内容对应的系统编码(ASCALL 码),代码如下:char c = 'A'; int a = c; >>>a = 65
2、字符串不需要用int强制类型转换,直接赋值给int类型的就可以了,由于字符串和整型之间可以强制类型转换,通过这一点可以进行大小写转换,代码如下:
char c = 'x'; int num = c; num = num - 32; d = char(num); >>>d = 'X'
3、char类型可以保存中文,而且中文也是有对应的编码的。因为java使用的是Unicode编码,这样可以保存任意类型的内容。
-
字符串可以通过"+"进行连接,因为字符串的字符范围是最大的,所以如果和其他类型的数据相加,结果会变成字符串。
public class first { public static void main(String[] args) { int a = 1; double b = 2; String c = "a + b的结果是:" + a + b; System.out.println(c); } } >>>>>a + b的结果是:12.0```
5、运算符
-
关系运算符:所有的关系运算返回的结果都是布尔类型,所以要定义一个布尔类型的变量去接收,如下:
boolean flag = x > y; //flag='true' or 'false'
-
数据类型之间提供自动转型的功能,所以下面的代码也是成立的:
char c = 'a'; boolean flag = c ==97; //输出的就是true
-
三目的操作可以嵌套,但是一般不建议下面这种写法:
int x = 10; int y = 20; int z = 30; int max = x > y ? (x > z ? x : z) : (y > z ? y : z);
-
移位操作:
int x = 2; z = x << 2; //z == 8,因为0010按位向左移了两位
6、逻辑控制
switch中可以判断的只能是数据(int,char,枚举,String),不能使用逻辑判断。
switch在设定的时候如果没有在case后面追加break,那他就会在执行第一个满足条件的语句之后,继续执行下面的语句直到所有的语句执行完毕
switch(数据){
case 数值:{
数值满足时执行;
break;
}
case 数值:{
数值满足时执行;
break;
}
default:{
所有判断的数值都不满足时执行;
break;
}
}
以下几种情况需要注意:
-
没有break,但是有符合条件的。从符合条件的开始执行,后面的case不会判断直接执行,default也会直接执行
public class first{ public static void main(String args[]) { int i=1; switch (i){ case 1: System.out.println("case1"); case 2: System.out.println("case2"); case 3: System.out.println("case3"); default: System.out.println("default"); } } } case1 case2 case3 default
-
符合条件的case里有break,只运行符合条件的那句话
public class first{ public static void main(String args[]) { int i=2; switch (i){ case 1: System.out.println("case1"); case 2: System.out.println("case2"); break; case 3: System.out.println("case3"); default: System.out.println("default"); } } } case2
-
符合条件的没有break,但是下一个条件有break,从符合条件的case开始运行
public class first{ public static void main(String args[]) { int i=2; switch (i){ case 1: System.out.println("case1"); case 2: System.out.println("case2"); case 3: System.out.println("case3"); break; default: System.out.println("default"); } } } case2 case3
-
没有符合条件的,不管有没有break,就只会执行default的内容,且与default的位置无关
-
default放在符合条件的case前面就不会执行
7、循环控制
continue可以做到部分goto的功能:
continue point;代码就会跑到point:后面的函数语句。但是这种代码不建议出现,太混乱。
注意:java中的1不是布尔类型,而java中的while(Boolean)的条件只能是布尔类型的值或表达式
8、方法的定义和使用
-
方法在主类中定义,并且由主方法直接调用
-
方法的定义语法形式:public static 返回值类型 方法名称([参数类型,变量,…]){ return [返回值];
} -
返回值可以使用基本数据类型和引用数据类型。
-
关于方法名称和变量的定义命名要求:
在进行方法名称定义的时候要求驼峰法(第一个单词的字母小写,而后每一个单词的首字母大写)
变量和方法同样的命名规则相同,Java的方法的用法和C一样。 -
方法重载:当方法名称相同,参数的类型或个数不同的时候就称为方法的重载,也就是说可以定义名字相同的多个方法,只不过在调用方法的时候可以根据输进去的参数的不同自动调用不同的方法。方法的重载和返回值的类型没有任何关系,只和参数有关,但是在实际的开发中最好让重载的方法的返回值类型相同。
public static 返回值类型 方法名称([参数类型,变量,...]){ //该方法执行的代码 return [返回值]; //如果返回值类型是void,可以直接写return ;结束方法 }
9、Java的输入输出
String str="Java";
double pi=3.14;
int i=100;
//"%"表示进行格式化输出,其后是格式的定义
System.out.printf("%f\n",pi);//"f"表示格式化输出浮点数
System.out.printf("%d\n",i);//"d"表示格式化输出十进制整数
System.out.printf("%o\n",i);//"o"表示格式化输出八进制整数
System.out.printf("%x\n",i);//"x"表示格式化输出十六进制整数
System.out.printf("%s\n",str);//"s"表示格式化输出字符串
System.out.printf("一个字符串:%s,一个浮点数:%f,一个整数:%d",str,pi,i);//可以一次输出多个变量,注意顺序即可