Java语言基础

Java语言概述

是一门计算机高级编程语言,早期称为oak(橡树),后期改名为java

Java之父 詹姆斯·高斯林

Java具有可移植性,安全可靠,性能较好,开发社区最完善,功能丰富

可以应用于桌面应用开发(各种税务管理软件,IDEA),服务器系统(应用后台),企业级应用开发(微服务,大型互联网应用),大数据开发(hadoop),移动应用开发(Android,医疗设备),游戏开发(MC)

java技术体系

SE 标准版 standard

EE 企业版 enterprise

ME 小型版 micro

hello world

编译代码:javac 文件名.java

运行: java 类名

1
2
3
4
5
public class helloworld{
public static void main(String[] args){
System.out.println("Hello world");
}
}
基本要求:

文件名称的后缀必须是java结尾

文件名称必须与代码类名称一致

必须使用英文模式下的符号

IDEA开发工具

IDEA项目结构介绍

projects(项目、工程)

module(模块)

package(包)

class(类)

以上结构一个包一个,可以采用New新建

字体、快捷键以及其他操作

file-settings-自己琢磨

快捷键:

CTRL+D:复制当前行代码到下一行

CTRL+Y:删除所在行

CTRL+/:注释(单行)

CTRL+shift+/:注释

基础语法:注释

单行注释://

多行注释:/* */

文档注释:/** */

注释不影响程序的执行,编译后不存在注释内容

基础语法:字面量

整数:2

小数:12.2

字符:’a’

字符串:”hello world’”

布尔值:true,faulse

空值:null

基础语法:变量

变量定义格式:

数据类型 变量名称 = 初始值

操作和C++相似

注意事项:

变量要先声明再使用

声明后不能再储存其他类型

变量的有效范围是从定义开始到“}”截止,且在同一个范围内不能定义两个同名的变量

定义变量的时候可以没有初始值,但是使用的时候必须给初始值

1
2
int age;
System.out.println(age)//是错误的

可以用{}表示独立的代码块

基础语法:变量原理,ASCII,二进制

二进制:

按字节存储数据,即八位二进制为一个字节,称为一位

ASCII:
1
2
3
char ch='a';
System.out.println(ch+1);//会输出98
System.out.println(ch);//输出a

基础语法:数据类型

数据类型就是约束存储数据的形式

整数:byte,short,int(default),long
浮点数:float,double(default)
字符:char
布尔:Boolean
随便写一个小数默认double,但是再后面加一个F/f表示float
引用数据类型:

String 变量名=字符串

基础语法:关键字,标识符

关键字:

Java保留了一些单词,作为特殊功能,例如:public,class……

不用特意记住,会报错

标识符:

基本要求:由数字,字母,下划线和美元符号组成

强制要求:不能以数字开头,不能是关键字,区分大小写

类型转换:自动类型转换

  • 类型范围小的变量可以赋值给类型范围大的变量
  • 在表达式中,小范围类型的变量会自动转换成当前较大范围的类型在运算
  • 最终类型由表达式中最高类型决定
  • 强制类型转换:int a=20 byte b=(byte) a,由于a的值是在后八位存储的,故可以放入b

基本算数运算符

加减乘都相同

除,两个整数相除还是整数,因为最高类型为整数

取余,%

数据拆分
1
2
3
4
5
6
7
8
9
10
//需求,一个三位数,将其分别拆分为个十百分别输出
public static void main(String[] args){
int data=589;
int ge=data%10;
int shi=data/10%10;
int bai=data/100%10;
System.out.println(ge);
System.out.println(shi);
System.out.println(bai);
}
+符号做连接符

“+”与运算符一起时做连接符,结果还是一个字符串

自增自减运算符

++自增,变量自身的值加一

–自减,变量自身的值减一

只能应用于变量,不能应用于常数

放在变量前面,是先加减,在使用变量

放在变量后面,先使用变量,再进行加减

赋值运算符

+=,-=,*=,/=,%=

关系运算符

==,!=,>,>=,<,<=

对数据进行条件判断的符号,最终会返回一个比较多布尔结果

逻辑运算符

可以把多个条件的布尔结果放在一起运算,最终返回一个布尔结果

&逻辑与 &&短路与,前一个为F后一个不执行了

|或 ||短路或,前一个为T,后一个条件不执行了

!逻辑非

^ 逻辑异或

三元运算符
格式:条件表达式 ?值1:值2

首先计算条件表达式的值,T则返回1,否则2

1
2
3
double score=100;
String rs=score>=60?"考试通过":"挂科";
System.out.println(rs);//输出结果为考试通过
优先级问题

在表达式中,哪个运算符先执行要看优先级

API介绍,案例介绍:键盘录入

键盘录入的步骤:

  • 导包:import java.util.Scanner

  • 写一行代码得到键盘扫描器对象:Scanner sc= new Scanner(System.in)

  • 等待接收用户输入数据:int age=sc.nextInt();

    ​ String name=sc.next();

  • System,String在jdk中的java.lang包下,不需要导包

分支结构

if分支结构:
if(条件表达式){……}
else if(条件表达式){……}

​ else{……}

和C++一样

switch分支结构
switch(表达式){
case 值1:
……
break;
case 值2:
……
break;
case 值3:
……
break;
default:
……
}
  • switch注意事项:

​ 表达式类型只能是byte,short,int,char,不支持double,float,long

​ case给出的值不能重复

​ 不能忘记break,否则会出现穿透

比较:

  • if在功能上强于switch
  • if适合做区间匹配,switch适合值匹配
  • switch优雅且性能好

循环结构:

for循环和C++一样

while循环和C++一样

do_while循环:

先执行再判断循环条件

1
2
3
4
5
int i=0;//初始化语句
do{
System.out.println("hello world");//循环体语句
i++;//迭代语句
}while(i<3)//循环条件
死循环:

for(;;)

while(true)

跳转控制语句:

break:跳出并结束当前所在循环的执行

continue:用于跳出当前循环的当次执行,进入下一次循环

random类,猜数字游戏

作用:用于在程序中获取随机数

步骤:
  • 导包:import java.util.Random;
  • 写一行代码代表得到的随机数对象:Random r=new Random();
  • 调用随机数功能获取0-9的随机数:int number=r.nextInt(10);

nextInt(n),只能生成0-n-1,不包含n

1
2
3
4
5
import java.util.Random;
Random r=new Random();
int number=r.nextInt(bound:10);//边界值
//减加法
//3-17=(0-14)+3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//随机生成一个1-100之间的数据,提示用户猜测,猜测大了提示大了,小了提示小了,直至结束游戏
public static void main(String[] args){
Random r=new Random();
int Num=r.nextInt(100)+1;

Scanner sc=new Scanner(System.in);
while(true){
System.out.println("请输入你猜的数字:");
int guess=sc.nextInt();//键入数字
if(guess>Num){
System.out.println("大了");
}
else if(guess<Num){
System.out.println("小了");
}
else{
System.out.println("中了");
break;//退出while死循环
}
}
}

数组

C++定义数组:int arr[k] int arr[]
Java静态初始化数组的格式:数据类型[] 变量名=(new double[]//完整) {元素1,元素2,……,元素n}
1
2
3
4
int[] ages={2,3,4};//数组的定义
System.out.println(ages[0]);//数组的访问
ages.length;//数组的长度
ages.length-1;//数组的最大索引
动态初始化数组:int[] arr=new int[3];只定义元素的类型和数组长度,之后再存入数据
1
double[] scores=new double[3];//动态定义数组
默认值:
  • 一般类型都是0或者0.0
  • Boolean为false
  • 其他接口类型以及string默认为null
静态和动态定义数组的方式是独立的不能混用。
数组的遍历:
1
2
3
for(int i=0;i<arr.length;i++){
……;
}
数组元素求最大值:
1
2
3
4
5
6
7
8
9
public static void main(String[] args){
int[] facescore={15,9000,10000,20000,9500,-5};
int max=facescore[0];
for(i=0;i<facescore.length;i++){
if(facescore[i]>max){
max=facescore[i];
}
}
}
随机排名:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public static void main(String[] args){
int[] codes=new int[5];
Scanner sc=new Scanner(System.in);
//输入
for(int i=0;i<codes.length;i++){
int code=sc.nextInt();
codes[i]=code;
}
//随机
Random r=new Random();
for(int i=0;i<codes.length;i++){
int index =r.nextInt(codes.length);
int temp=codes[index];
code[index]=codes[i];
codes[i]=codes[index];
}
}
冒泡排序:

思想:每次从数组中找出最大值放到数组的后面去

1
2
3
4
5
6
7
8
9
10
11
12
13
public static void main(String[] args){
int[] arr={8,3,5,1};
for(int i=0;i<arr.length;i++){
//定义一个循环控制的比较次数
for(int j=0;j<arr.length-i;j++){
if(arr[i]>arr[j+1]){
int temp=arr[j+1];
arr[j+1]=arr[j];
arr[j]=temp;
}
}
}
}

debug工具的使用

可以孔子代码从断点开始一行一行的执行,然后详细观看执行情况。

方法概述

方法是一种语法结构,它可以把一段代码封装成一个功能,以方便重复调用。

1
2
3
4
5
6
7
public static void main(String[] args){

}
public static int sum(int a,int b){
int c=a+b;
return c;
}

好处:

  • 提高了代码的复用性
  • 使代码逻辑更加清晰

方法定义、常见问题

1
2
3
4
修饰符(暂时为public static)	返回值类型	方法名(形参列表){
方法体代码;
return 值;
}

不需要返回结果则选择void

常见问题:
  • 方法编写的顺序无所谓
  • 方法与方法之间是平级关系,不能嵌套定义
  • 返回值为void则不能使用return,若有固定的返回值类型,则必须使用return返回值
  • return语句下面不写代码,因为return后不会再执行
  • 方法不调用就不执行,调用时必须严格匹配方法的参数情况
eg1:计算1-n的和返回
1
2
3
4
5
6
7
8
9
10
public static int sum(int n){
int sum=0;
for(int i=1;i<=n;i++){
sum+=i;
}
return sum;
}
public static void main(String[] args){
System.out.println("1-5的和是:"+sum(5))
}
eg2:判断整数是奇数还是偶数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//不需要返回值
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int shu=sc.nextInt;
judge(shu);
}
public static void judge(int b){
if(b%2=0){
System.out.println("该数字是偶数");
}
else{
System.out.println("该数字是奇数");
}
}
方法的内存调用
  • 方法没有被调用的时候,在方法区中的字节码文件中存放
  • 方法被调用的时候,需要进入到栈内存中运行

方法的参数传递机制

基本类型的参数传递:值传递

在传输实参给方法形参的时候,并不是串数实参变量的本身,二十传输实参变量中存储的值,这就是值传递

实参:如在方法内部定义的变量

形参:如在定义方法是,”()”中所声明的参数

引用类型的参数传递:值传递
基本类型参数传输存储的是数据值,不会修改原有的
引用类型参数传输存储的是地址值,会修改原有的

方法重载

定义:

​ 同一个类中,出现多个方法名称相同,但是形参列表不用,这些方法就是重载方法

​ 通过参数的不同进行差异化

识别技巧:

​ 只要是同一个类中,方法名称相同,形参列表不同,它们就是重载的方法

​ 形参列表的不同是指形参的个数,类型,顺序不同,不关心形参的名称

单独使用return关键字

return可以立即跳出并结束当前方法的执行,return关键字单独使用放在任何方法中

应用:除法中,遇到除数为0,直接return跳出当前方法的执行

break:是执行当前所在的循环

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!