Java语法入门
初始Java(JDK安装)
程序概念
- 生活中的程序:流程、工作程序、入职程序、买票、上学.... 为了完成一件事、而进行的一系列的步骤。
- 计算机中的程序:软件、应用、QQ、迅雷、京东、12306.... 计算机中的程序、是一系列指令的集合。 为了满足计算机时代,人们对信息化的需要。
编程语言
- 机器语言:使用二进制(0,1)
- 汇编语言:使用一些关键词(add,...),提供了一个“翻译官”(编译器)帮助我们把一些指令转换为二进制
- 高级语言:语法方面更加偏向于自然语言,可读性非常强,也是有更强大的编器。 C语言、 Python语言、 C#语言、C++语言、Java语言:不是太简单不是太困难。
- ....
Java语言
万金油
诞生
1995,SUM公司,詹姆斯·高斯林
发展
1998年:
- J2 SE :桌面程序,它也是Java核心基础
- J2 EE : 企业级Web程序
- J2 ME : 移动端程序(被Android)
2009年:
- SUM公司被Oracle, 74亿美元贱卖
2011年:
- Java 7
2013年:
- Java8
- 2019年1月1日,Java8后续维护更新,商业收费
- 从Java9,更新频率改为半年已更新
短期支持版:Java9、Java10...,只维护半年
长期支持版:哪怕已经进行了大版本更新,依然进行维护
- Java 8
- Java 11
- Java 17 (下半年)
特点/特性
- 简单易学 Java拥有自动垃圾回收、内存分配 Java去除了C++之类的语言的指针、多继承等概念。
- 健壮性
- 安全性
- 跨平台(一次编译,到处运行)
- 多线程和网络编程
- 分布式
- 高性能
搭建环境
1.下载
2.安装
第一个java程序
开发步骤
1.编写源程序(源代码、源文件)
.java
2.编译源程序
.javac.exe
.class字节码文件
3.运行程序
java.exe
JVM(Java虚拟机)运行字节码文件
基本语法结构
// 类声明
public class 类名 {
// 类体
// main 方法:程序运行入口
// 方法声明
public static void main(String[] args){
// 方法体
// 指令
}
}
使用记事本开发
1.新建1个文本文档
扩展名为.txt , 更改为.java
命名为:HelloWorld
2.打开文件,编写好Java基本语法结构
3.根据需要添加一些指令
System.out.println("输出内容");
4.编译程序
javac HelloWorld.java
5.运行程序
java HelloWorld
环境变量:path环境变量
- DOS系统中输入了一个程序名想要运行,首先它会从当前目录下找,找不到从path环境变量中挨个查找路径下是否有该程序,找得到就执行,找不到就报告
输出语句
- 输出并换行:System.out.println();
- 输出不换行:System.out.print();
- 格式化输出不换行:System.out.printf(格式化字符串,格式化字符串参数列表);
- %s:字符串
- %d:整数
- %f:浮点数
转义字符:
- \n :换行
- \t :一个制表位
注释:
给代码添加一些解释性的内容
适度添加注释
Java中:
- 单行注释:// 注释
- 多行注释:/*注释*/
- 文档注释:javadoc注释,/**注释内容*/
跨平台原理
核心:字节码文件,JVM
编译和反编译
编译:将源代码翻译成字节码的过程
反编译:将字节码转换为源代码的过程。
使用jad工具实现反编译:jad-s java 字节码文件地址
IDE
集成开发环境。集代码编辑、代码编译、代码调试等开发工具为一体的开发服务套。
Eclipse:适合前期,免费
变量和数据类型
程序运行原理
CPU从硬盘上加载程序,加载到内存中
程序运行是在内存中运行,在内存中操作数据。
变量概述
变量:可以变化的量/值,用于存储单一数据的方案
变量定义
// 数据类型由变量值决定
// 声明并赋值
数据类型 变量名 = 变量值;
// 先声明
数据类型 变量名;
// 赋值
变量名 = 变量值:
联想,客人入住酒店,变量值入住内存
变量名:房间号
变量数据类型:房间类型
变量值:入住的客人
数据类型
8个基本数据类型
-
数值类型
- byte:126
- short:12121
- int :12131
- long: "long nm = 10L;"
- float: "float num = 10.1F"
- double
非数值类型
- boolean :true, flase
- char:'a'
引用数据类型:
- 数组
- 类(String是一个类,“字符串”)
- 接口
- 枚举
- ...
命名规范
最困难的
- 由字母、数字、下划线、$组成、数字不能开头
- 见名知意
- 反例:a、b..
- 正例:name、age.....
- 驼峰命名法
- 多个单词的情况下,区分多个单词
- 小驼峰命名法:首字母小写,后面的每个单词首字母大写。stuName
- 下划线连接法(蛇形命名法)
- stu_name
- 不能使用关键字和保留字
- 关键字是语言中已经定义好的,用于表示特定含义的单词。
- 反例:public
- 不能把拼音和英文混合
- 反例:没有XingMing
常量
当需要一些不可以改变的值时,可以将其定义为常量
final double PI = 3.14;
常量的命名,为了和变量区分,单词都大写,多个单词由下划线连接。
输入语句
java.util.Scanner
1.导包
import java.util.Scanner,
import java.util.Arraysl
如果导入多个同一包下的内容,可以使用:import java.util.*;
2.创建对象
Scanner 对象名 = new Scanner(System.in);
3.使用方法
nextInt():int输入并得到整数
nextDouble():double输入并得到浮点数
next():String输入并得到字符串
常见运算符
赋值运算符:=
算数运算符:+、-、*、/、%、++、--
- 前++和后++的区别
int num = 10;
System.out.println(num ++); // 10
System.out.println(num); // 11
int num = 10;
System.out.println(++ num); // 11 num = num +1
System.out.println(num); // 11
- 数据类型不同,导致的计算影响
- 计算时,两个整数计算结果肯定是整数。其中一个是浮点数,结果按照数学运算计算。
int num = 10 / 4;
System.out.println(num); // 2
double num2 = 10 / 4;
System.out.println(num2); // 2.0
double num3 = 10.0 / 4;
System.out.println(num3); // 2.5
复合赋值运算符:
- +=
- -=
/=
- *=
- %=
关系运算符:(运算结果是boolean)
- >
- <
- >=
- <=
- ==
== 比较基本数据类型,比较内容
== 比较引用数据类型,比较地址值
是因为基本类型和引用类型,在栈中存储的数据不一致
引用数据类型要比较内容,需要使用equals()方法,并且要重写该方法。
- !=
逻辑运算符:(运算结果是boolean)
- && 与、并且
- || 或、或者
- !取反
两个&&和一个&的区别: 短路。
三元运算符:条件表达式 ? 条件表达式1 : 条件表达式2;
- 三元运算符的计算结果由表达式1和表达式2决定
数据类型转换
- 自动类型转换
- 强制类型转换
选择结构
if选择结构
- 基础if选择结构
// 条件表达式通过关系运算符和逻辑运算符等构成
// true、false
if (条件表达式) {
// 条件成立时执行的代码段
}
- 互斥if选择结构
if (条件表达式) {
// 条件成立时执行的代码段
} else {
// 条件不成立时执行的代码段
}
- 多重if选择结构
if (条件表达式1) {
// 条件1成立时执行的代码段
} else if (条件表达式2) {
// 条件2成立时执行的代码段
} else {
// 当条件都不满足时执行的代码段
}
- 嵌套if选择结构
if (外层条件表达式) {
if (内层条件表达式) {
}
}
switch选择结构
switch (表达式) {
case 常量1;
break;
default;
break;
}
switch 和 多重if 区别:switch 只能用于等值判断,多重if可以用于范围判断。
switch 的case穿透性:缺失break,会向下继续穿透直到遇到break或结束。
switch 表达式支持类型:int (byte, short, char), String,枚举
随机数
Math:
- random():double[0.0, 1.0)
- 推导生成任意范围的随机整数:(int) (Math.random() * (max - min)) + min
循环结构
while循环
while (循环条件){
// 循环操作
}
do-while循环
do {
// 循环操作
} while (循环条件);
for循环
for (循环变量; 循环条件; 循环出口){
// 循环操作
}
三者区别
while和for都是先判断再执行
do-while 是先执行再判断,无论是否条件成立,都至少会执行一次
for循环适合于固定此数的循环
双重循环
循环嵌套另一个循环
外层循环执行一次,内层循环执行一遍
流程控制:
- break:结束循环
- continue:结束本次循环,继续下一次循环
- return:结束方法
数组
数组概述
数组,它是一种用于存储一组相同数据类型数据的数据结构(线性数据结构)。
会开辟一个连续的内存空间。
数组的定义
数据类型[] 数据名 = new 数据类型[元素个数];
数据类型[] 数据名 = {元素值1, 元素值2,...};
数据类型[] 数据名 = new 数据类型[]{元素值1, 元素值2,...};
数组的动态赋值
数组名[下标] = 元素值;
for (int i = 0; i < 数组名.length; i++){
数组名[i] = 输入的值;
}
数组的遍历
遍历:把数组中的数据挨个取出来。
1.循环下标,遍历数组
for (int i = 0; i < 数组名.length; i++){
数组名[i]
}
2.增强for
for (数据类型 变量名 : 数组名) {
变量名
}
数组默认值
元素空间有默认值。
基本类型:
- 整数 : 0
- 浮点数 : 0.0
- boolean : false
- char : \u0000
引用类型:
- null
二维数组
一个存储一维数组的数组。(嵌套数组)
Arrays工具类
操作数组的工具方法。
- toString(数组):String
- equals(数组1,数组2): boolean比较数组内容
- sort(数组) : void升序排序
- copyOf(数组,新的长度):新数组
- ....
排序算法
- 冒泡排序
比较原理:相邻元素做比较,两两比较小靠前
外层循环:n-1,内层循环:n-1-i
- 选择排序
- 插入排序
- 归并排序
- 希尔排序
- ...
吃货联盟项目
- 多个数组实现一个完整数据的存储(相同下标数组的空间存储的数据,代表同一条)
- 数组删除数据(默认值,数组元素移位)
Java面向对象
类和对象
面向对象概念
它是计算机技术演化的必然产物。
它将现实生活中的内容在计算机中进行建模。
它是基于面向过程而来。
面向过程:解决问题,面向实现的每一个过程/步骤。
面向对象:解决问题,面向能够解决具体问题的对象。
类和对象关系
- 万物皆对象
- 分析对象的特征,行为
- 分析类
类是对象的抽象,是一个模板。
对象是类的具体实例/个体。
类和对象定义
Java是面向对象的编程语言,它是以类为基本组成单元
面向对象三大特性: 1.封装 2. 继承 3.多态
访问权限修饰符 class 类名 {
// 属性
访问权限修饰符 数据类型 属性名;
// 方法
// ...
}
类名 对象名 = new 类名();
对象名.属性名 = 属性值;
对象名.方法名(参数);
方法概述
变量用来存储数据。
方法用来存储代码段/功能。
- 当你需要定义一个可能重复使用的功能时,就将这段内容抽取到方法中。
// 方法声明
[访问权限修饰符][特殊修饰符]返回值类型 方法名(数据类型 参数名, ...) {
// 方法体
[return 返回值];
}
方法和方法重载
带参方法
方法分为四类:
- 无参无返
- 无参有返
- 有参无返
- 有参有返
定义一个生成4位随机整数的方法,调用该方法可以得到一个4位整数。
public int random() {
return...;
}
基本类型参数:传递的是值
引用数据类型参数:传递的是地址值
构造方法
创建对象时采用的。
系统默认提供一个无参构造方法,但是只要你定义一个构造,就不再给提供了(建议自己写出来无参构造)。
访问权限修饰符 类名(数据类型 型参数){
}
带参构造和无参构造。
可以利用带参构造快速赋值属性。
this关键词
this关键字:当前类的对象,代词
- this.属性
- this.方法(参数)
- this(参数)调用构造
成员变量和局部变量区别
- 定义位置不同
- 成员变量定义在类中方法外
- 局部变量定义在类中方法内
- 作用域不同
- 成员变量作用域是整个类
- 局部变量只能中定义它的方法中使用
- 默认值不同
- 成员变量有默认值(和数组一样)
- 局部变量没有默认值,不赋初始值无法使用
- 生命周期不同
- 成员变量(实例变量)是随着对象的产生而产生,随着对象的销毁而销毁
- 局部变量是随着方法的压栈而产生,随着方法的弹栈而销毁
方法重载
在一个类中,多个方法的方法名相同,但参数列表不同(类型、个数、顺序),可以构成方法重载。
相同功能,处理不同类型的数据。
封装
面向对象的第一个特性。
封装的使用
- 属性私有化
- 提供公共的getter(访问)/setter(操作)方法
- 根据需要在getter/setter中添加合适的逻辑处理
一般JavaBean规范
- 属性私有化
- 提供公共的getter(访问)/setter(操作)方法
- 提供无参构造
- 实现序列化接口
访问权限修饰符
修饰符/访问权限范围 | 本类中 | 同包不同类中 | 不同包的子类中 | 不同包的其他类 |
private | √ | |||
默认的(包级) | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
包组织结构
包:Java类可以分门别类的存储。
package 包名; // 包声明
// 导包
import 包名.类名 // 全类名/全限定名
public class 类名 {
}
包名规范:域名倒序.项目名.xxx.分类
(一般小写)