JAVA语言特点
-
面向对象
**两个基本概念:**类,对象
**三大特性:**封装,继承,多态
-
健壮性
吸收了C/C++语言的优点,但去掉了其影响程序健壮性的部分(如指针、内存的申请与释放等),提供了一个相对安全的内存管理和访问机制
-
跨平台性
跨平台性:通过Java语言编写的应用程序在不同的系统平台上都可以运行。“Write once , RunAnywhere”
原理:只要在需要运行 java 应用程序的操作系统上,先安装一个Java虚拟机 (JVM Java Virtual Machine) 即可。由JVM来负责Java程序在该系统中的运行。
JAVA的核心机制
Java虚拟机 (Java Virtal Machine)
- JVM是一个虚拟的计算机,具有指令集并使用不同的存储区域。负责执行指令,管理数据、内存、寄存器。
- 对于不同的平台,有不同的虚拟机。
- 只有某平台提供了对应的java虚拟机,java程序才可在此平台运行
- Java虚拟机机制屏蔽了底层运行平台的差别,实现了“一次编译,到处运行”
垃圾收集机制 (Garbage Collection)
- 不再使用的内存空间应回收—— 垃圾回收。
- 在C/C++等语言中,由程序员负责回收无用内存。
- Java 语言消除了程序员回收无用内存空间的责任:它提供一种系统级线程跟踪存储空间的分配情况。并在JVM空闲时,检查并释放那些可被释放的存储空间。
- 垃圾回收在Java程序运行过程中自动进行,程序员无法精确控制和干预。
- Java程序还会出现内存泄漏和内存溢出问题吗?Yes!
Java语言的环境搭建
什么是JDK,JRE
JAVA声明
变量的分类
对于每一种数据都定义了明确的具体数据类型(强类型语言),在内存中分配了不同大小的内存空间。
按声明的位置的不同
- 在方法体外,类体内声明的变量称为成员变量。
- 在方法体内部声明的变量称为局部变量。
-
注意:二者在初始化值方面的异同:
同:都有生命周期
异:局部变量除形参外,需显式初始化。
JAVA运算符
运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。
- 算术运算符
- 赋值运算符
- 比较运算符(关系运算符)
- 逻辑运算符
位运算符
- 三元运算符
1.//(前)++ :先自增1,后运算
//(后)++ :先运算,后自增1
2.//(前)-- :先自减1,后运算
//(后)-- :先运算,后自减1
3.连接符:+:只能使用在String与其他数据类型变量之间使用。
赋值运算符
- 符号:=
- 当“=”两侧数据类型不一致时,可以使用自动类型转换或使用强制类型转换原则进行处理。
- 支持连续赋值。
- 扩展赋值运算符: +=, -=, *=, /=, %=
特别说明:
1.运算的结果不会改变变量本身的数据类型
2.开发中,如果希望变量实现+2的操作,有几种方法?(前提:int num = 10;)
方式一:num = num + 2;
方式二:num += 2; (推荐)开发中,如果希望变量实现+1的操作,有几种方法?(前提:int num = 10;)
方式一:num = num + 1;
方式二:num += 1;
方式三:num++; (推荐)
- 比较运算符的结果都是boolean型,也就是要么是true,要么是false。
比较运算符“==”不能误写成“=”
。
逻辑运算符:
&—逻辑与 | —逻辑或
!—逻辑非 && —短路与
|| —短路或 ^ —逻辑异或
逻辑运算符区别:
“&”和“&&”的区别
:
- 单&时,左边无论真假,右边都进行运算;
- 双&时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。
“|”和“||”的区别同理,||表示:当左边为真,右边不参与运算。
异或( ^ )与或( | )的不同之处是:当左右都为true时,结果为false。
理解:异或,追求的是“异”!
案例1:
public class Test {
public static void main(String[] args) {
//会员卡号:四位会员卡号,取百位数,如果百位数和幸运卡号相同的话就是幸运会员.不是的话,就写谢谢惠顾
Scanner input = new Scanner(System.in);
System.out.println("请输入你的会员卡号");
int num = input.nextInt();
int a = num/100%10;
int random =((int)Math.random()*10);
System.out.println(random);
String s=(a==random)?"恭喜你中奖":"谢谢惠顾";
System.out.println(s);
}
}
JAVA流程控制-顺序结构
其流程控制方式采用结构化程序设计中规定的三种基本流程结构,即:
- 顺序结构
- 程序
从上到下
逐行地执行,中间没有任何判断和跳转。
- 程序
- 分支结构
- 根据条件,选择性地执行某段代码。
- 有if…else和switch-case两种分支语句。
- 循环结构
- 根据循环条件,重复性的执行某段代码。
- 有while、do…while、for三种循环语句。
- 注:JDK1.5提供了foreach循环,方便的遍历集合、数组元素。
if-else选择结构
在Java程序中,如果要根据条件来决定是否执行某一段代码,就需要if
语句。
public class AgeTest{
public static void main(String args[]){
int age = 75;
if (age < 0) {
System.out.println("不可能!");
} else if (age > 250) {
System.out.println("是个妖怪!");
} else {
System.out.println(“人家芳龄 " + age +" ,马马乎乎啦!");
}
}
}
switch-case结构
除了if语句外,还有一种条件判断,是根据某个表达式的结果,分别去执行不同的分支。
例如,在游戏中,让用户选择选项:
- 单人模式
- 多人模式
- 退出游戏
这时,switch
语句就派上用场了。 switch
语句根据switch (表达式)
计算的结果,跳转到匹配的case
结果,然后继续执行后续语句,直到遇到break
结束执行。
public class SwitchTest2 {
public static void main(String args[]) {
String season = "summer";
switch (season) {
case "spring":
System.out.println("春暖花开");
break;
case "summer":
System.out.println("夏日炎炎");
break;
case "autumn":
System.out.println("秋高气爽");
break;
case "winter":
System.out.println("冬雪皑皑");
break;
default:
System.out.println("季节输入有误");
break;
}
}
}
Switch规则:
switch(表达式)中表达式的值必须是下述几种类型之一:
byte,short,char,int,枚举 (jdk 5.0),String (jdk 7.0);
case子句中的值必须是
常量
,不能是变量名或不确定的表达式值;同一个switch语句,所有case子句中的常量值互不相同;
break语句用来在执行完一个case分支后使程序跳出switch语句块;
如果没有break,程序会顺序执行到switch结尾
,如果遗漏了break
,就容易造成严重的逻辑错误,而且不易在源代码中发现错误。default子句是
可选的
。同时,位置也是灵活的。当没有匹配的case时,执行default
switch和if语句的对比
if和switch语句很像,具体什么场景下,应用哪个语句呢?
- 如果判断的具体数值不多,而且符合byte、short 、char、int、String、枚举等几种类型。虽然两个语句都可以使用,建议使用swtich语句。因为
效率稍高
。 - 其他情况:对区间判断,对结果为boolean类型判断,使用if,if的使用范围更广。也就是说,
使用switch-case的,都可以改写为if-else
。反之不成立。
JAVA流程控制-循环结构
循环语句就是让计算机根据条件做循环计算,在条件满足时继续循环,条件不满足时退出循环。
- 循环结构
- 在某些条件满足的情况下,反复执行特定代码的功能
- 循环语句分类
- for 循环
- while 循环
- do-while 循环
循环语句的四个组成部分:
- 初始化部分(init_statement)
- 循环条件部分(test_exp)
- 循环体部分(body_statement)
- 迭代部分(alter_statement)
for循环
说明:
- ②循环条件部分为boolean类型表达式,当值为false时,退出循环
- ①初始化部分可以声明多个变量,但必须是同一个类型,用逗号分隔
- ④可以有多个变量更新,用逗号分隔
public class ForLoop {
public static void main(String args[]) {
int result = 0;
for (int i = 1; i <= 100; i++) {
result += i;
}
System.out.println("result=" + result);
}
}
while循环
语法:
public class WhileLoop {
public static void main(String args[]) {
int result = 0;
int i = 1;
while (i <= 100) {
result += i;
i++;
}
System.out.println("result=" + result);
}
}
do-while循环
语法:
说明
do while
循环先执行循环,再判断条件;
do while
循环会至少执行一次。
public class DoWhileLoop {
public static void main(String args[]) {
int result = 0, i = 1;
do {
result += i;
i++;
} while (i <= 100);
System.out.println("result=" + result);
}
}
嵌套循环(多重循环)
- 将一个循环放在另一个循环体内,就形成了嵌套循环。其中,for ,while ,do…while均可以作为
外层循环
或内层循环
。 - 实质上,嵌套循环就是把内层循环当成外层循环的循环体。当只有内层循环的循环条件为false时,才会完全跳出内层循环,才可结束外层的当次循环,开始下一次的循环。
- 设外层循环次数为m次,内层为n次,则内层循环体实际上需要执行m*n次。
说明
嵌套循环:将一个循环结构A声明在另一个循环结构B的循环体中,就构成了嵌套循环
内层循环
:循环结构A
外层循环
:循环结构B
① 内层循环结构遍历一遍,只相当于外层循环循环体执行了一次
② 假设外层循环需要执行m次,内层循环需要执行n次。此时内层循环的循环体一共执行了m * n次
③ 外层循环控制行数,内层循环控制列数
break和continue
无论是while
循环还是for
循环,有两个特别的语句可以使用,就是break
语句和continue
语句。
break语句
break
语句总是跳出自己所在的那一层循环
public class BreakTest{
public static void main(String args[]){
for(int i = 0; i<10; i++){
if(i==3)
break;
System.out.println(" i =" + i);
}
System.out.println("Game Over!");
}
}
continue 语句
break
会跳出当前循环,也就是整个循环都不会执行了。
而continue
则是提前结束本次循环,直接继续执行下次循环。
- continue只能使用在循环结构中
- continue语句用于跳过其所在循环语句块的一次执行,继续下一次循环
- continue语句出现在多层嵌套的循环语句体中时,可以通过标签指明要跳过的是哪一层循环
public class ContinueTest {
public static void main(String args[]){
for (int i = 0; i < 100; i++) {
if (i%10==0)
continue;
System.out.println(i);
}
}
}
return的使用
特殊流程控制语句
return
:并非专门用于结束循环的,它的功能是结束一个方法
。当一个方法执行到一个return语句时,这个方法将被结束。- 与break和continue不同的是,
return直接结束整个方法
,不管这个return处于多少层循环之内
特殊流程控制语句说明
- break只能用于
switch语句
和循环语句
中。 - continue 只能用于
循环语句
中。 - 二者功能类似,但continue是终止
本次循环
,break是终止本层循环
。 - break、continue之后不能有其他的语句,因为程序永远不会执行其后的语句。
- 标号语句必须紧接在循环的头部。标号语句不能用在非循环语句的前面。
- 很多语言都有goto语句,goto语句可以随意将控制转移到程序中的任意一条语句上,然后执行它。但使程序容易出错。Java中的break和continue是不同于goto的。
JAVA数组
- 数组(Array),是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据行统一管理。
- 数组的常见概念
- 数组名
- 下标(或索引)
- 元素
- 数组的长度
数组本身是引用数据类型
,而数组中的元素可以是任何数据类型
,包括基本数据类型和引用数据类型。
创建数组对象会在内存中开辟一整块连续的空间
,而数组名中引用的是这块连续空间的首地址。
数组的长度一旦确定,就不能修改
。
我们可以直接通过下标(或索引)的方式调用指定位置的元素,速度很快。
数组的分类:
- 按照维度:一维数组、二维数组、三维数组、…
- 按照元素的数据类型分:基本数据类型元素的数组、引用数据类型元素的数组(即对象数组)
数组的特点就是:元素类型是固定的、长度是固定的、通过角标查询,查询快,增删慢
。
2、分配空间:
语法:数组名 = new 数据类型[数组长度];
比如:scores = new int[30];
第一步和第二步可以一起写
数据类型[] 数组名 = new 数据类型[数组长度];
3、赋值:
语法:数组名[数组下标] = 数据;
比如:scores[0] = 60;//表示将数组第一个空间存放了60这个整数
scores[1] = 80;
直接声明数组时就进行赋值
语法:数据类型[] 数组名 = new 数据类型[]{数据1,数据2,数据n};
数据类型[] 数组名 = {数据1,数据2,数据n};
注意:如果在声明数组时就直接赋值,那么不要写数组长度
比如:int[] scores = new int[]{60,80,100,50,60,70};
通过循环的方式动态的录入数据
循环从初始0开始,到数组的最大长度结束,每次加1
for(int i = 0;i < 5;i++){
System.out.println("请输入第"+(i+1)+"名学生的成绩:");
scores[i] = input.nextInt();
}
4、数据的使用:将存放在数组空间中的元素拿出来使用
使用循环的方式将存放在每个空间中数据拿出来使用
for(int i = 0;i < 5;i++){
System.out.println("第"+(i+1)+"名的学生成绩为"+scores[i]);
}
数组名.length表示数组的长度
比如:int[] scores = new int[10];
scores.length = 10;//数组长度为多少,该值就为多少
数据结构(了解)
1.集合
:数据结构中的元素之间除了“同属一个集合” 的相互关系外,别无其他关系;
2.线性结构
:数据结构中的元素存在一对一的相互关系;
3.树形结构
:数据结构中的元素存在一对多的相互关系;
4.图形结构
:数据结构中的元素存在多对多的相互关系。