Java的发展历史
1990年,SUN公司推出了”Green计划“,由James Gosling领导设计出了一门叫做Oak的语言,为了实现智能设备,但并未发展成果,只是这门语言保留了下来。
1990年,由于互联网的流行,Oak语言经过改造,成为了现在的java。所以,Oak就是java语言的前身。
-
1995年,java正式诞生,推出了Java1.0以及开发包 JDK1.0。
-
2004年,Java推出了Java5,此后都以JavaX命名。
-
2009年,SUN公司被Oracle收购,之后都有Oracle进行更新维护。
-
2014年,推出了Java8,是当前最流行的Java版本,也是长期维护的版本(LTS)。
-
当前长期维护版本为Java8、Java11、Java17。
Java能做什么
Java的分类
-
javaMe
-
javaSE\笔记
-
javaEE
javaMe称为Java微星版,用于开发移动应用,早期的塞班系统中会使用,如今基本已经淘汰。
javaSE称为Java标准版,是Java的核心和基础,也是JavaMe和JavaEE的核心,可以用于开发桌面端程序,如IDEA就是用Java开发的。
javaEE称为Java企业版,用于开发WEB应用,Java的流行全靠javaEE,WEB应用如门户网站、电子商务、电子政务等服务器都是由javaEE实现。
Java的优点
- 简单
- 安全
- 开源
- 多线程
- 半解释半编译
Java的安装和环境搭建
- 下载 JDK 安装
第一个Java程序
/**
* 文档注释
* 通常用于解释整个java类或某个方法或某个变量,
* 最终可以通过java命令自动生成文档
*
* 每一个源文件的类型都是.java
* public class 表示公开的类
* Hello为类名,必须与当前源文件名一致
* 类用一个大括号包裹所有内容
*/
public class Hello {
/*
多行注释
通常用于解释一段内容
没有返回值的公共静态方法,方法名为main表示Java程序的入口
小括号中的内容称为方法的参数列表
大括号中的内容称为方法体
一个能够运行的java类,必须有且只有一个main方法
*/
public static void main(String[] args) {
//单行注释 ,通常用于解释一句话
System.out.println("使用println输出");//输出并换行
//ctrl+/
System.out.print("使用print输出");//输出不换行
//直接换行
//System.out.println();屏蔽代码
}
}
Java代码中的注意事项
- 要写代码,必须先创建class,class称为类,是一个Java程序的基本组成单位
- 每个能够运行的Java程序,有且只有一个main方法,称为主方法/入口函数,是程序的起点
-
符号
-
Java中的符号全部都是英文状态下的符号。可以在输入法中设置中文状态下使用英文标点
-
“{}”必须成对出现。用于定义类、定义方法和定义代码块
-
“[]”必须成对出现。用于定义数组、使用数组
-
“()"必须成对出现。用于表示方法的参数
-
“空格”用于分割关键字和代码。可以是一个空格,也可以是多个
-
“.”用于调用某个类或对象的属性和方法
-
“;"用于表示一句代码的结束,大括号后不需要加分号
-
-
换行和缩进
- 在每出现一次大括号时,就要进行一次缩进
Java中的注释
注释可以对代码进行解释说明或者屏蔽不用的代码
编译时无视注释,注释分为
-
单行注释
- 快捷键:ctrl + /
-
多行注释
- 快捷键:ctrl + shift + /
- 文档注释
-
/** * 文档注释 * 通常用于解释整个java类或某个方法或某个变量, * 最终可以通过java命令自动生成文档 */ public class Hello { /* 多行注释 通常用于解释一段内容 */ public static void main(String[] args) { //单行注释 ,通常用于解释一句话 System.out.println("使用println输出");//输出并换行 System.out.print("使用print输出");//输出不换行 //直接换行 //System.out.println();注释还可以屏蔽代码 } }
编程语言的命名规则
驼峰命名法
- 如果用多个单词描述一个内容,除首字母外,其它单词首字母大写
- 如 studenName、empld
帕斯卡命名法
- 所有首字母全部大写
- 如:StuendClass、EmpName
Java中的标识符及命名规则
Java中的类名、方法名和变量名统称为标识符
- 类名使用帕斯卡命名
- 方法名和变量名使用驼峰命名法
- 命名时做到“见名知意”
这些要求不是强制执行的,属于开发人员约定俗成的内容
规则
- 标识符使用字母、数字、下划线和$组成
- 不能以数字开头
- 不能使用Java中的关键字(保留字)
- 图示:
这些要求是强制的,如果不遵循,无法通过编译。
标准命名举例
类名 Test Person Animal Cat UserController StudentService
变量名 age lastName firstName
方法名 login() findEmpById(int id)
常量 COUNTRY_NAME
Java中的数据类型
原始(基本类型)类型和引用类型
原始类型
整型
- byte字节
- short短整型
- int整型
- long长整型,赋值时在数字后加l或L
浮点型
- float单精度浮点型,赋值时在数字后加f或F
- double双精度浮点型
字符型
- char,赋值时可以是单引号引起来的字符或一个数字,这是数字是ascii中的数字或者是一个 转义字符
- ASCII码
转义字符
转义字符 | 意义 | ASCII码值(十进制) |
\a | 响铃(BEL) | 007 |
\b | 退格(BS),将当前位置移到前一列 | 008 |
\f | 换页(FF),将当前位置移到下页开头 | 012 |
\n | 换行(LF),将当前位置移到下一行开头 | 010 |
\r | 回车(CR),将当前位置移到本行开头 | 013 |
\t | 水平制表(HT),(跳到下一个TAB位置) | 009 |
\v | 垂直制表(VT) | 011 |
\\ | 代表一个反斜线字符 " \ " | 092 |
\' | 代表一个单引号(撇号)字符 | 039 |
\" | 代表一个双引号字符 | 034 |
\? | 代表一个问好 | 063 |
\0 | 空字符(NUL) | 000 |
\ddd | 1到3位八进制数所代表的任意字符 | 三位八进制 |
\xhh | 十六进制所代表的任意字符 | 十六进制 |
- 布尔值
类型名 所占字节大小 范围 byte 1字节 ~128~127 short 1字节 ~32768~32767 int 4字节 ~2147483648~2147483647 long 8字节 ~2^63-2^63-1 float 4字节 double 8字节 char 2字节 用单引号引起来的一个字符。在java中,不管是数字还是英文还是汉字, char都占用2个字节。因为Java编译器默认使用Unicode编码。 boolean true/flase 在程序中写出的整数,默认时int类型,写出的小数,默认是double类型
运算符
算术运算符
需要两个操作符的运算,如果有浮点数参与,结果为浮点型数据
符号 | 作用 | 说明 |
+ | 加 | 如果两个数都是数值型的数据,用于计算,如果+左右两端一端是字符串,则用于拼接字符串 |
- | 减 | 只能用于数值型数据 |
* | 乘 | 只能用于数值型数据 |
/ | 除 | 只能用于数值型数据,如果两个整数橡树,结果只能保留整数部分(商) |
% | 取余 | 只能用于数值型数据,商一定是整数 |
循环
如果要重复执行某些代码时,则需要使用循环语句
while循环:
语句:while(循环条件){
满足条件是重复执行的代码
}
执行流程:
限制性小括号中的内容,如果结果为true,执行大括号中的内容,判断结果为false则停止循环。
- 注意!
- while循环先判断后执行,因此极有可能一次都不执行
- 例:
//打印0-100以内的所有偶数 int num = 0; while (num<=100){ if (num%2==0){ System.out.print(num+"\t"); } num++; } //第二种:执行效率快 while (num<=100){ System.out.print(num+"\t"); num+=2; }
do-while 循环:
语法:do{
满足条件时执行的代码
}while(循环条件)
执行流程 :
先执行一次大括号中的内容,再判断while小括号中的内容,如果成立,再次执行do大括号中的内容,如果不成立,停止循环。
- 注意!
- do-while是先执行后判断
- do-while至少会执行一次
- 例:
//假设密码为123123,接收输入的密码,判断是否正确 //如果正确,输出正确,如果错误,重新输出,最多输入3次 Scanner scanner = new Scanner(System.in); System.out.println("请输入密码:"); int pwd;//密码 int count=1;//次数 do { pwd = scanner.nextInt(); if (pwd == 123123) { System.out.println("密码正确"); } else { System.out.println("请重新输入密码"); } count++; if (count==3){ System.out.println("次数已达上限"); //停止循环 break; } } while (pwd != 123123);
for循环
语法:for(表达式1;表达式2;表达式3;){
循环体
}
表达式1:定义循环变量(第一步执行)
表达式2:判断循环条件(第二步执行)
表达式3:更新循环变量(第四步执行)
循环体(第三步执行)
执行流程:
首先执行表达式1,再执行表达式2,如果表达式的结果为true,执行循环体,再执行表达式3,执行表达式2判断,如果表达式2结果为false,结束循环.
代码演示:
for (int i =1; i<10;i++){
System.out.println(i);
}//输出1-10的所有数字
数组(一维数组)
概念
一组类型相同的数据的有序集合,实际在内存中是一块连续的空间,是保存数据的区域
关于数组
实际在内存中是一块连续的空间,是保存数据的区域
数组定义时需要确定大小和数据类型,不可改变
定义数组时的变量保存的是实际内存空间的地址
数据中保存的数据称为元素,每个元素有一个唯一的位置,称为索引(下标),这个索引从0计数
可以通过数组的索引给数组赋值或读取数组中某个索引上的值
图示:
定义数组
语法:数据类型[]数组名或数据类型 数组名[],建议使用前者
定义数组后,如果不初始化数组,数组无法使用,
代码演示:
//定义数组,如果数组未初始化,不能使用
int[]score;
//可以这样写,但不建议
//int score[];
数组初始化
语法:数组名=new数据类型[数组大小]
代码演示:
//定义一个保存数组的变量的nameList
String[] nameList;
//在内存中申请一块连续空间,将这个空间的地址保存到比那辆nameList中
nameList=new String[10];
定义数组的同时初始化
语法:数据类型[] 数组名 = new 数据类型[数组大小];
代码演示:
double[] salary = new double[30];
给数组赋值
动态赋值:通过数组名[索引]给数组中某个位置赋值
代码演示:
int[] list = new int[10];
list[0]=123;//索引从0开始
list[9]=22;//最大索引为数组大小-1
list[22]=5;//能通过编译,但是在运行时会抛出数组越界异常
静态赋值
在定义数组的同时赋值
- 数据类型[]数组名=new 数据类型[]{元素1,元素2,....}
代码演示:
String[] nameList = new String[]{"小明","王海","刘希"}
-
数据类型[]数组名={元素1,元素2...}
-
代码演示:
String[]nameList = {"小明","王海","刘希"}
注意!
- 数组一旦初始化后,数组大小不能改变,其中的元素类型要统一
-
数组的索引范围时[0,数组大小-1],使用时不能超过范围,在编译无法识别是否超出数组索引,但运行时会抛出“数组索引溢出”异常
-
数组一旦初始化后,如果没有赋值,默认有初始值
-
数组数据类型
默认值
整型
0 浮点型
0.0 应用类型(如String等)
null 布尔型
false 字符型
空白字符
个人总结:
- Java语言涉及多类技术,需要明确该技术是什么,特点,怎么使用,什么时候用,这些需要牢记。
- 编写代码时,需要明确需求,分析思路,确定编写步骤,然后实现代码。