目录
一、JAVA概述
1.Java发展史
在1991年时候,James Gosling(詹姆斯•高斯林)所在sun公司的工程师小组, 需要设计一种小型计算机语言,该语言主要用于像电视机顶盒,家用电器等这样的消 费类电子产品,这些电子产品有一个共同的特点:计算处理能力和内存都非常有限, 所以要求:语言必须非常小且能够生成非常紧凑的代码,这样才能在这样的环境中执 行,另外,由于不同的厂商选择不同的CPU,因此,要求该语言不能和特定的体系结 构绑在一起,要求语言本身是中立的,也就是在不同的平台上运行(即跨平台)。 所以在sun公司内部成立了一个Green项目组,该小组的领导人是James Gosl ing。他们开发出了一种语言,起初把它命名为Oak(橡树的意思,Gosling注意到自 己办公室外一棵茂密的橡树Oak,这是一种在硅谷很常见的树。所以他将这个新语 言命名为Oak。但Oak是另外一个注册公司的名字。这个名字不可能再用了),后来 将名字改为java,Java是印度尼西亚爪哇岛的英文名称,因盛产咖啡而闻名。JAVA 的标识也正是一杯正冒着热气的咖啡。经过多年的开发,最终于1995年正式确立。
2.Java语言的特点
● 开源
● 简单、高效
● 面向对象
● 平台无关性(跨平台):对于java程序,只需要开发一次,就可以在不同的平台(操作系统)上运行
通过虚拟机,将java程序指令翻译给不同的操作系统,前提是不同的平台上安装不同的java虚拟机,担任运行java程序的一个环境
● 交互式特性
● 多线程机制
● 动态的内存管理机制
● 安全性
JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算 设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模 拟各种计算机功能来实现的,因为有了不同的JVM,所以同一个Java程序在 三个不同的操作系统中都可以执行。这样就实现了Java程序的跨平台性,也 称为Java具有良好的可移植性, 但是前提是要具有不同的jvm。
Java语言与平台无关,JVM与平台相关。
3.Java语言体系结构
● JavaSE,:Java Standard Edition(标准版) JavaSE 包含那些构成 Java语言核心的类。比如:数据库连接、接口定义、输入/输出、网 络编程。
● JavaEE :Java Enterprise Edition(企业版) JavaEE 包含JavaSE 中的类,并且还包含用于开发企业级应用的类。比如:servlet、 JSP、服务器。
● JavaME :Java Micro Edition(微缩版) JavaME 包含JavaSE中一 部分类,用于消费类电子产品的软件开发。比如:呼机、智能卡、 手机、PDA、机顶盒。
简单讲就是:
● JavaSE:java Standard Edition (Java标准版),包含java基础核心的类:字符串、日期、集合、异常、IO、线程、GUI、网络编程
● JavaEE:java Enterprise Edition( Java企业版),包含javaSE、servlet(server applet)、jsp
● JavaME:java Micro Edition (Java微缩版)(已被安卓开发取代)
4.Java语言的运行机制
• Java虚拟机可以理解成一个翻译器。
• 对于不同的运行平台,有不同的虚拟机。
• Java 虚拟机机制屏蔽了底层运行平台的差别,实现了“一次 编译,随处运行” 。
创建.java文件(源代码)--->编辑器--->.class文件(字节码)--->不同平台的JVM--->翻译--->指令--->平台运行
jdk、jre、jvm之间的关系:
5.第一个程序HelloWorld
在F盘新建一个.txt文件,重命名为Hello.java,用NotePad++打开,编辑下列程序
//定义一个类,名为Hello
public class Hello{
//定义主方法
public static void main(String[] args){
System.out.println("Hello World!"); //程序代码部分
}
}
打开cmd命令提示符,输入F:,进入F盘,输入javac Hello.class(编译成class文件),再输入java Hello(运行class文件),就会打印出Hello Word;
二、基础语法
1.IDE的使用
IDE(Integrated Development Environment )集成开发环境,是用于 提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面等工具。
常用的java开发工具有 IntelliJ IDEA、 Eclipse 。
2.注释
对程序功能的说明,以某种特定符号作为标记,程序在运行过程中不会执行注释.
Java语言有三种注释方式:
// 用于单行注释, 快捷键ctrl+/
/*
用于多行注释,快捷键ctrl+shift+/ ctrl+shift+\ 取消注释
*/
/**
* 文档注释,用于为类,方法(函数),属性 功能进行说明,可在调用时提示
*/
/**
* 注释的演示
*/
public class Demo1 {
public static void main(String[] args) {
//年龄
int age;
/*
姓名
注意不能为空
*/
String name;
Demo1.eat("jim");
System.out.println();
}
/**
吃饭的方法
name:姓名
*/
public static void eat(String name){
}
}
3.关键字
定义:被Java语言赋予了特殊含义,用做专门用途的字
特点:关键字中所有字母都为小写
4.保留字
现有Java版本尚未使用,但以后版本可能会作为关 键字使用。自己命名标记符时要避免使用这些保留字 goto 、cons。
5.标识符
1.标识符
Java 对各种变量、方法和类等要素命名时使用的字符序列称为标识符。
2.定义合法标识符规则
由26个英文字母大小写,0-9 ,_或 $ 组成。
数字不可以开头。
不可以使用关键字和保留字,但能包含关键字和保留字。
Java中严格区分大小写,长度无限制。
标识符不能包含空格。
注意:在起名字时,为了提高阅读性,要尽量有意义, “见名知意”。
3.java中的名称命名规范
包名:多单词组成时所有字母都小写:xxxyyyzzz
类名、接口名:多单词组成时,所有单词的首字母大写: XxxYyyZzz
变量名、方法名:多单词组成时,第一个单词首字母小写,第二 个单词开始每个单词首字母大写:xxxYyyZzz
常量名:所有字母都大写。多单词时每个单词用下划线连接: XXX_YYY_ZZZ
6.java变量
• 变量是程序中最基本的存储单元,程序执行中数值可变的. 本质上,变量其实是内存中的一小块区域,使用变量名来访问这块区域,因此,每一个 变量使用前必须要先申请(声明),然后必须进行赋值(填充内容),才能使用。
• 变量是通过使用变量名来访问这块区域的。
• 其要素包括变量名,变量类型。
• Java程序中每一个变量都属于特定的数据类型,在使用前必须对其声明,声明格式为:
[修饰符] type varName [=value][,varName[=value]……];
例如:
int i = 100;
int i1, i2, i3 = 10;
String s = “hell
7.java基本数据类型
程序中对于每一种数据都定义了明确的具体数据类型,在内存中 分配了不同大小的内存空间。
1.整数类型
Java 各整数类型有固定的表数范围和字段长度,其不受具体操作系统的影响,以 保证Java程序的可移植性。
Java语言的整型常量默认为int型,声明long型常量可以后加‘ l ’或‘ L ’ ,
如: int i1 = 600; //正确
long l1 = 8888888888L; //必须加l或L否则会出错
2.进制
对于整数,有四种表示方式:
二进制:0,1 ,满2进1.以0b或0B开头。
八进制:0-7 ,满8进1. 以数字0开头表示。
十进制:0-9 ,满10进1。
十六进制:0-9及A-F,满16进1. 以0x或0X开头表示。此处的A-F不区分大小写。 如:0x21AF +1= 0X21B0
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
3.浮点类型
与整数类型类似,Java浮点类型有固定的表数范围和字段长度,不受平台影响。
Java 浮点类型有两种表示形式:
十进制数形式,例如: 3.14 314.0
科学记数法形式,如 3.14e2 3.14E2
Java 浮点型常量默认为 double 型,如要声明一个常量为 float 型,则需在数字后面加 f 或 F , 如:double d = 12345.6; //正确 float f = 12.3f; //必须加f否则会出错
4.逻辑型boolean(布尔)
boolean 类型适于逻辑运算,一般用于程序流程控制 。
boolean 类型数据只允许取值 true 或 false 。
注意:不可以0或非 0 的整数替代false和true,这点和C语言不同。
//逻辑控制语句
boolean flag;
flag = true;
if(flag) {
//do something
}
5.字符型char
char 型数据用来表示一个单个字符。
char占2字节。
用单引号括起来,例如: char c1 = 'a'; char c2 = '中';
可以涵盖世界上所有书面语的字符。
char运算: char类型是可以运算的因为char在字符编码表中有对应的数值。 在JAVA中,对char类型字符运行时,直接当做对应编码表的整数来 对待。 char c= ‘a’+1; 先将’a’提升为int,计算结果98,对应的 字符是b。
/*
字符型
*/
public class Demo4 {
public static void main(String[] args) {
char c = 'a';//97-->二进制
char d = '中'; //20013 0xffdda存储 utf-8就是在网页,文件中显示时对照表
//在运算时,char会转为int(在编码表中的十进制编号)
System.out.println(d+0);
System.out.println(d<10);
/*
计算机是不能识别字符的?
编码表
a--97
b--98
*/
}
}
6.ASCII码
在计算机内部,所有数据都使用二进制表示。每一个二进制位(bit)有 0 和 1 两种状 态,因此 8 个二进制位就可以组合出 256 种状态,这被称为一个字节(byte)。一个 字节一共可以用来表示 256 种不同的状态,每一个状态对应一个符号,就是 256 个符 号,从 0000000 到 11111111。
ASCII(ASCII American Standard Code for Information Interchange,美国 信息互换标准代码)。
上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系, 做了统一规定。这被称为ASCII码。
ASCII码一共规定了128个字符的编码,比如空格“SPACE”是32(二进制 00100000),大写的字母A是65(二进制01000001)。这128个符号(包括32个不 能打印出来的控制符号),只占用了一个字节的后面7位,最前面的1位统一规定为0。
缺点: 不能表示所有字符。
7.Unicode编码
Unicode:一种编码,将世界上所有的符号都纳入其中。这个编号范围从 0x000000 到 0x10FFFF (十六进制),有 110 多万,每个字符都有一个唯一的Unicode 编号,这个编号一般写成 16 进制,在前面加上 U+。例如:“马”的 Unicode 是U+9A6C。
Java底层采用unicode编码来存储字符。
随着互联网的兴起,计算机与网络,计算机与计算机之间的通讯急需一种统一的编码方式来编译和解释 Unicode编码。
这种编码方式就是我们现在使用最广泛的 UTF-8,所以,UTF-8 是 Unicode 编码的一种具体实现,它规定了字符转换到二进制编码的一系列规则。
UTF-8 最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字 节表示一个符号,根据不同的符号而变化字节长度。
8.基本数据类型转换
java中可以从任意基本类型转型到另外的基本类型, boolean 类型不可以转换为其他的数据类型。
转换分为默认转换和强制转换:
默认转换:
整形,字符型,浮点型的数据在混合运算中相互转换,转换时遵循以下原则: 容量小的类型默认转换为容量大的数据类型;数据类型按容量大小排序为: byte,short,char->int->long->float->double byte,short,char之间不会互相转换,他们三者在计算时首先会转换为int类型
强制转换:
容量大的数据类型转换为容量小的数据类型时,要加上强制转换符,但可能造成精 度降低或溢出;使用时要格外注意。
有多种类型的数据混合运算时,系统首先自动的将所有数据转换成容量最大的那一 种数据类型,然后再进行计算。
public class Demo5 {
public static void main(String[] args) {
byte b=127;
int c= 2147483647;
long d = c;
float f = d;
int x = 258;
byte y = (byte)x;
System.out.println(y);
float m = 10.5F;
long n = (long)m;
System.out.println(n);
}
}
9、运算符
a、算术运算符
+ - * / ++ -- % - * / % 只能进行字符运算 +: 加法 字符串连接:数值 +(连接) 字符串 = 字符串 字符串 +(连接) 字符串 = 字符串 ++ :每++一次,在原来的基础上+1,再赋值 单独使用时,++在前在后没有区别,在混合运算时,++在前先自增后运算,++在后先运算后自增
b、比较运算符
== != > < >= <= == != 可用于数值,Boolean,引用类型
c、逻辑运算符
& | ! ^ && || & | ! ^ 可以参与逻辑运算,也可以参与位运算 &&:短路与 遇到第一个false时,就发生短路,后面的表达式就不执行了 &:按位与 遇到第一个false时,不发生短路,后面的表达式继续执行 ||:短路或 遇到第一个true时,就发生短路,后面的表达式就不执行了 |:按位或 遇到第一个true时,不发生短路,后面的表达式继续执行
d、赋值运算符
== += -= *= /= %= =:当"="两侧数据类型不一致时,可以使用自动类型转换或使用强制类型转换原则 混合运算时,数据类型会默认转为表达式中最大的类型
e、条件运算符
(条件表达式)?表达式1:表达式2 //必须返回一个结果,结果的类型与定义结果的类型一致 int a = 10; int b = 5; int max = (a>b)?a:b;
f、位运算符
二进制bit位的运算
<<(相当于*2) | 空位补0;被移出的高位丢弃,空缺位补0 |
---|---|
>>(相当于/2) | 被移位的二进制最高位是0,右移后,空缺位补0;最高位是1,空缺位补1 |
>>>(无符号右移) | 被移位二进制最高位无论是0还是1,空缺位都补0 |
&(按位与) | 二进制进行&运算,只有1&1时,结果是1,否则是0 |
(按位或) | 二进制进行或运算,只有0或0时,结果是0,否则为1 |
^(按位异或) | 相同为0,不同为1 |
~(按位取反) |
分隔符>一元运算符>算数运算符/移位运算符>关系运算符>逻辑运算符>三目运算符>赋值运算符
10、控制台输入
使用标准输入串System.in使用Scanner取得一个字符串或一组数字在新增一个Scanner对象是需要一个System.in对象,仅在JavaSE中测试程序时输入使用Scanner的next()方法用以取得用户输入的字符串;nextInt()将取得的输入字符转换为整数类型;在使用Scanner对象时,需要在文件头带入java.util.Scanner;写法为:import java.util.Scanner;
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt();
float b = scanner.nextFloat();
double c = scanner.nextDouble();
11、控制语句
a、if语句
不建议if else 语句块省略{ }, 省略后,if else 只对紧跟着的那行代码有效
if if(条件){语句块1}else{语句块2} if(条件1){语句1}else if(条件2){语句2}..else if(条件N){语句N;}
b、switch:多路选择
表达式值类型:byte,short,int,char,枚举,JDK 7 以后可以使用String类型 选项值1,2,3类型需要和表达式的类型一致, 值1,2,3 必须是字面量(常量)
值1,2,3 值不能重复
匹配的case语句执行完成后,如果没有break结束,则继续向下执行下一个case,直到遇到break,如果没有与表达式匹配的选项,则执行default语句,没有default则结束switch
switch(表达式){ switch(表达式){ case 值1 : 代码块; [break]; case 值2 : 代码块; [break]; case 值n : 代码块; [break]; default: 默认代码块; } }
break 语句:用于终止某个语句块的执行,用在循环体中,可以强行退出循环,只能终止一层 continue:只是终止当次循环,之后进入到下一次循环结束外层循环(在内层循环,结束外层循环) outer:for(int i = 0;i < 4;i++){ for(int j = 0;j < 5;j++){ if(j==3){ break outer; } System.out.print("*"); } System.out.print(); }
多路分支选择,switch可以实现的,if都可以实现,if条件更灵活,switch适用于一些固定选项的选择,在固定选项执行中,效率高
c、循环
满足某种条件,一直重复做某种事情
循环语法格式:循环变量初始化
进入循环的条件
循环体(循环中要执行的代码)
循环变量的更新
循环的方式:while do while for
while先条件判断,不成立不能进入到循环体中 while(进入循环的条件){ 循环体 }
do{}while{}; 先执行,后判断,即使条件不成立,也至少执行一次
for循环 for(变量初始化1;条件2;更新变量4){ 循环体3; }
12、Java中的方法
类似于C语言中的函数,解决某一个问题,而编写的代码组合,属于类或对象
main方法是java程序的主入口,启动java主线程
语法格式: [访问权限修饰符(public) 修饰符 返回值类型(int void表示方法没有返回值)] static修饰方法属于类,可以直接通过类名调用,不加static修饰,方法属于对象,需要通过对象调用 如果方法有返回值,必须声明返回值的类型;注意定义的返回值的类型与实际返回值的类型要匹配
package day;
public class Run{
public static void main(String[] args){
Run.multi();
Run m = new Run();
m.test();
}
public void test(){
int a = 10;
int b = 10;
if(a>b){
System.out.println("a>b");
return;
}
}
public void multi(){
for (int i = 1; i <=9 ; i++) {
for (int j = 1; j <= i ; j++) {
System.out.print(j+"*"+i+"="+(i*j)+" ");
}
System.out.println();
}
}
}
13、return表达式
return 表达式;//将表达式的值返回 return;// 后面没有值的时候,只表示方法终止,不表示方法没有返回值
三、数组
1、数组的基本概念及作用
数组:数组是相同数据类型的集合,也就是说存储一组数据类型相同的数
数组是引用类型数据,即对象
可以存储基本类型数据,也可以存储引用类型数据
特点:在内存中的空间是连续的
声明数组:int 表示数组中存储的数据类型
int [] a;(建议)
int a [];
int [] a,b;
int x [];
2、数组的创建
方式1:
创建数组时,必须为其指定长度,而且长度一旦定义了,就不能改变了
new int[10];在内存空间中创建了一个长度为10的数组对象
int [] a = new int[10];
//System.out.println(a); [I@1b6d3586 这个是输出对象时,默认输出的是对象在内存中的地址.
System.out.println(Arrays.toString(a));// Arrays类中提供一个toString() 以字符串形式输出数组中的内容
//[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
float[] f = new float[10];
System.out.println(Arrays.toString(f));//[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
char [] chars = new char[10];
System.out.println(Arrays.toString(chars));//[ , , , , , , , , , ]
boolean [] b = new boolean[10];
System.out.println(Arrays.toString(b));//[false, false, false, false, false, false, false, false, false, false]
String[] s = new String[10];
System.out.println(Arrays.toString(s));//[null, null, null, null, null, null, null, null, null, null]
方式2:创建数组的同时,为数组每个空间赋值,同时确定了数组的长度
int [] c = new int []{2,5,1,3,4};
System.out.println(Arrays.toString(c));
方式3:隐式创建
int [] y = {2,5,1,3,4};
System.out.println(Arrays.toString(y));
3、数组的访问与迭代
数组索引:就是每一个空间的标号
整数,最小为0,最大是长度为-1
int[] a = new int[10];
a[0] = 1; //为数组指定空间位置赋值
a[1] = 2;
System.out.println(Arrays.toString(a));
int[] b = {1,2,3,4,5};
// 0 1 2 3 4
System.out.println(b[2]);//获得数组指定位置的值
//System.out.println(b[10]); 访问数组非法索引
/*
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10
at day1.ArrayDemo2.main(ArrayDemo2.java:26)
*/
数组元素的遍历,使用循环生成数组索引,获取每一个位置的值
int[] a = {1,2,3,3,45,8,5,6};
System.out.println(a.length); //length属性获取到数字长度
for (int i = 0; i <a.length ; i++) {
if(a[i]==8){
System.out.println("包含8");
break;
}
}
增强for循环 int i 每次循环声明一个变量 a是要遍历的数组 每循环一次,从数组中挨个取出一个元素,赋值给t; for(声明一个变量,用来接收每次从数组中取出的元素:需要遍历的数组){ 每循环一次,从数组中取出一个元素,赋给定义的变量,直到没有元素了 }
int [] a = {2,3,1,4,5};
for(int t : a){
if(t==8){
System.out.println("包含8");
}
}
4、数组排序
a、冒泡排序
每次拿出相邻的两个数,满足条件交换位置
int [] a = {4,5,2,3,1}; //外层循环,控制循环的次数 for(int i = 0;i<a.length-1;i++){ //内层循环,控制比较的次数 for(j = 0;j < a.length-1-i;i++){ if(a[j]>a[j+1]){ int temp = a[j]; a[j] = a[j+1]; a[j+1] = temp; } } } System.out.println(Arrays.toString(a));
b、选择排序
从第一个元素开始与后面的每个元素比较,满足条件交换位置
int [] a = {4,3,5,2,1};
//外层循环,取出数组的每个元素
for(int i = 0;i < a.length-1;i++){
//内层循环,取出每次与i比较的元素
for(j = i+1;j < a.length;j++){
if(a[i]>a[j]){
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
System.out.println(Arrays.toString(a));
5、二维数组
二维数组的每一个元素都是一维数组
声明: int [][] a; int a [][]; 创建: int [][] a = {{1,2},{3,4}}; int [][] b = new int [3][4]; //二维数组中有3个一维数组,一维数组的长度是4 int [][] c = new int [][]{{},{}};
遍历二维数组
int [][] a = {{1,2,3},{4,5,6},{7,8,9}};
//首先,遍历二维数组,从二维数组中取出每一个一维数组
for(int i = 0;i < a.length;a++){
//再对每个一维数组进行遍历
for(int j = 0;j < a[i].length;j++){
System.out.print(a[i][j]+"");
}
System.out.println();
}