java(一)
java基础
一.数据类型
在一个程序中,都会遇到需要使用某些数据,具体数据是什么格式我们成为数据类型。如,数字,符号等统一的成为数据类型。
数据类型在Java中总共分为以下几大类:
基本数据类型:
最基础的数据类型。这个数据类型是Java中所有数据的基础。因此非常重要。
引用数据类型:
是Java中通常情况下自定义的类型,这种类型格式比较复杂,也比较多。用处比较大。
1.基本数据类型
基本数据类型安装数据的格式分为两大类
数值型:
数值型按照数据是否是整数分为:整数型和小数型(浮点型)
非数值型:
非数值型又有两种:字符型,布尔型
基本数据类型总共有八类:
- 整数 byte short int long
- 小数 float double
- 布尔 boolean
- 字符 char
数据类型 位数 字节数 最大值 最小值
byte 8 1 2^7-1=127 -2^7 = -128
short 16 2 2^15-1 -2^15
int 32 4 2^31-1 -2^31
long 64 8 2^63-1 10^19 -2^63
float 4 10^38
double 8 10^308- byte 更多是表示流读取的数据
- int 真正用来表示数据
- long 用来表示时间
1kb=1024b 1MB=1024kb 1GM=1024MB 1TB=1025GB
2.引用数据类型
引用数据类型可以分为四大类:
- 数组类型
- 对象类型
- 接口类型
- 枚举类型
二.变量与常量
2.1 变量
变量其实就是指某个内存地址。内存地址中的值可以进行更新,并不是这个变量的名字可以进行更新。
变量的定义:数据类型 变量名=变量的值;
数据类型:决定了当前这个地址中存储的 数据的大小和类型。
变量名:自己起,当然有起名字的规范。
规范:
- 首字母小写
- 是由字母,数字,下划线,美元符组成
- 只有_$,其他的都不行
- 也可以使用汉字(但是不建议使用)
- 不能以数字开头
- 见文知意
- 通过英文翻译,不要写拼音
- 年龄 age
- 身高 height
- 通过英文翻译,不要写拼音
- 驼峰法
- 当变量由多个单词组成时,从第二个单词开始,首字母大写
- 目的就是告诉其他程序员,他们是多个单词组成的
- studentName studentAge
- 不能使用关键字、保留字
- 定义的时候就会报错
变量的值:表示当前内存地址中到底存储的是什么数据。
= 代表的赋值符的意思 把右边的值赋值左边
案例:
// 定义一个整型变量,变量值为100;
int num=100;
// 定义一个字符型变量,变量值为'z'
// 字符的定义,需要将值用单引号括起来,只能写一个字符。
char ch='z';
// 定义一个单精度的变量 值为10.1
// 单精度变量在定义时,如果有初值,需要指明这个值时float类型,因为默认情况下小数类型的值时double类型
// 指明方式,在值的后面添加一个f区分
float fl=10.1f;
// 定义一个布尔类型变量,值为true
boolean boo=true;
// 定义一个长整型的变量,变量值为1000;
long loo=1000;
2.2常量
常量其实就是在变量的基础上将内存中的值定义死,内存中的这个值在定义时就已经确定了,不可以进行改变。
2.3数据类型转化
自动类型转化与强制类型转化
基本数据类型之间的相互转化
注意:布尔类型不能与其他基本数据类型之间相互转化
// 整数之间的相互转化比较简单,直接自动或者强转按照取值范围可以了
// 除此意外,整数与小数之间的数据类型转化。
// 浮点型取值范围最小的是float,占用四个字节。
// 整数型符合公式计算取值范围,但是小数不符合。
// float的取值范围与int的取值范围是不一样的,比long的取值范围还要大。
// 小数转化为整数,都需要强转,整数转化为小数,都是自动类型转化。
long l=1000;
float f=l;//这里可以自动转化
float ff=11100.1f;
long ll= (long) ff;// 这里需要强制转化。
double d=110.0;
long lll= (long) d;
// 字符与整数型直接也可以进行转化。只是字符转化为整数是,是将当前字符的ASCII值当做数据进行转化。
// 数字转化为字符,是将数字对于的ASCII值的字符表示出来。
// 字符能够自动转化为整型,如果需要转化为小于整型的数据类型需要强转,传递性转化。
char c='a';
int i=c;// 默认字符转化为整型
long lo=c;// 现将字符转化为int类型,然后再转化为long类型
short s= (short) c;//强转,现将字符转化为int类型,再强转为short类型
System.out.println(i);
// 整数型转化为字符型,整数型转化为字符型,需要强转
byte ci=100;
char cha=(char)ci;
System.out.println(cha);
三.运算符与表达式
3.1表达式
表达式其实就是数学中的算式,是由各种运算符号组合而成的。比如1+1=2 就是一个表达式。
3.2 运算符
在开发过程中,通常都需要进行运算得到某个结果。运算的过程中就需要用到运算符。
在Java学习中常见的运算符分类有:
- 赋值运算符 = 在数学中“=”右边 是结果,左边是表达式,在程序中 左边是变量 右边是表达式。
- 算数运算符 + - * / %
- 比较运算 > >= < <= == !=
- 逻辑运算符 & && | || !
- 位运算符(了解) & | ~ ^ << >> >>>
- 一元运算符(重点) ++ -- += -= *= /= %=
- 三元运算符 变量 = 条件?值1:值2
3.2.1 逻辑运算符
逻辑运算符是正对布尔类型的表达式或者值进行运算的,结果也是一个布尔类型的结果。
运算公式是固定的。
与或非
&和&&(记住)
&:按位与,不管&符号左边的表达式结果是真是假,右边的表达式结果都会进行判定。
&&:短路与,只要&符号左边的表达式结果是假,右边的表达式就不会判断,最终的结果都为假。节省资源。
|和||(记住)
|:按位或,不管或符号左边的表达式结果是真是假,右边的表达式结果都会进行判定。
||:短路或,只要或左边的表达式结果是真,右边的表达式就不会判断,最终结果是真,节省资源。
^ 符号异或:
运算规则:相同为假,不同为真
5^20= 17
0000-0101
0001-0100 ^
0001-0001=17
5^5 = 0
0^5 = 5
任何数与自己本身相异或,结果都是0,任何数与0相异或,结果都是其本身。
778=8
787=8
异或可以使用交换律
左右移动:
左移动: 二进制相左移动多少位
3<<2 = 12
0000-0011
0000-1100
右移动:二进制数相右移动多少位
3>>2=0
0000-0011
0000-0000
结论:左移动多少位其实就是这个值乘以2的多少次方
右移动多少位就是这个值除以2的多少次方取证。
无符号右移动:计算规则与右移动一样,只是不带符号位。“>>>”
3.3 一元运算符
++ -- += -=
++ 写法有两种
a++ : 先将a的值参与运算,在让a自增
++a:先让a自增,然后将自增后的值参与运算。
都等价于二元运算符 a=a+1,自增1
int i=10;
int a=1;
int z=1;
int y= a++ + ++i+ ++z;
System.out.println(y);
/*int b=i+ (++a);// 10+2
int c=i+ (z++);//10+1
System.out.println(b);// 12
System.out.println(c);//11
System.out.println(a+"----"+z);*/
-- 和++ 一样,--是自减1
a--; 先将a的值参与运算,在让a自减
--a;先让a自减,然后将自增后的值参与运算。
都等价于a=a-1;
+= -=
a+=n;n是某个数,等价于a=a+n;
自增n
如: a+=3;==>a=a+3;
a-=n;等价于a=a-n;
自减n
如:a-=3;===>a=a-3;
3.4 三元运算符
经过三次运算 变量=条件?值1:值2;
- 条件判断,判断这个条件是否为真。逻辑运算
- 如果条件为真,取值1,否则取值2。取值运算
- 将结果赋值给变量 赋值运算。
案例:需要求出两个数中的最大值和最小值
int a=230;
int b=34;
// 可以使用三元运算符得到ab中的最值、
int min=a>b?b:a;
int max=a>b?a:b;
System.out.println("最大值是"+max);
System.out.println("最小值是"+min);
案例:给三个值,判断能否构成一个三角形,如果可以,判断是否可以构成一个直角三角形。(用三元运算符完成)
四.流程控制语句
流程控制语句总共常见的有:
-
顺序语句: 自上而下,逐一执行。
-
分支语句:
-
选择语句:
-
循环语句:
4.1分支语句
分支语句就是判断语句,在开发过程中往往会遇到当某个条件满足时需要执行某些代码,不满足时执行其他代码等。此时如果想要实现这种结构,就必须要使用判断语句。
写法:
If结构的写法:
if(判断条件){
//条件满足时需要执行的代码块
}
if else 结构的写法:
if(判断条件){
//条件满足时需要执行的代码块
}else{
// 条件不满足时需要执行的代码块
}
if ... else if 结构的语法:
if(判断条件1){
//条件1满足时需要执行的代码块
}else if(判断条件2){
// 条件2时需要执行的代码块
}...
else if(判断条件n){
// 条件n时需要执行的代码块
}else{
// 以上条件都不满足时需要执行的代码块
}
分支语句的使用选择
一般情况下:如果判断条件只有一个,会选择if或if else,如果这个条件需要操作条件不满足的操作,就选择 if else.
多个条件判断选择if... else if判断。
举个栗子:
判断输入的用户名和密码是否正确,如果正确输出登录成功,不正确输出用户名或密码错误。
String userName="zhangsan";
String passWord="123456";
if("admin".equals(userName)&&"123456".equals(passWord)){
System.out.println("登录成功...");
}else{
System.out.println("用户名或者密码不正确...");
}例题:
- 判断小名的数学成绩是否及格 (60分及格,满分100分)
2.小名的成绩如果及格,判断属于什么等级, 60-75及格 76-90 良好 大于90优秀
int score=80;
if (score<60){
System.out.println("不及格");
}else if(score>=60&&score<=75){
System.out.println("及格");
}else if (score>75&&score<=90){
System.out.println("良好");
}else if(score>90&&score<=100){
System.out.println("优秀");
}else{
System.out.println("分数不正确");
}
案例:请使用分支语句完成判断某个月份属于哪个季节。
int month=8;
if (month3||month4||month5){
System.out.println("春天");
}else if (month6||month7||month8){
System.out.println("夏天");
}else if(month9||month10||month11){
System.out.println("秋天");
}else if(month12||month1||month2){
System.out.println("冬天");
}else{
System.out.println("月份不对...");
}
对于某些零散的值的判断,如果再使用if else if来进行判断,效果是可以达到的,但是天剑判断可能比较复杂。此时可以选择另一种控制流程语句--选择结构 - 判断小名的数学成绩是否及格 (60分及格,满分100分)
4.2 选择结构
格式:
switch(表达式或变量){
case 值1:
// 值1匹配成功需要执行的代码
break;
case 值2:
// 值2...
break;
.....
case 值n:
break;
default:
//以上选项都没有匹配成功,执行这里
break;
}
int a=5;
switch (a){
case 1:
System.out.println("星期一");
break;
case 2:
System.out.println("星期二");
break;
case 3:
System.out.println("星期三");
break;
default:
System.out.println("休息");
break;
}
switch语句的书写规范:
case的作用:
表示选项的作用,case后面必须要存放满足指定表达式结果或者变量类型的值。或者能够自动转化为指定变量类型的值。
case由于是选项的作用,只要当前case选项被选中,剩下的所有的case选项都不会再被选择。每个选项是不重复的,也就是说,case后面跟的值不 能重复。否则就会报错。同时case之间是不存在书写顺序的。
default作用:
当所有的case选项都没有被选中时,执行这里的代码。其它功能与case是一样。
break在switch中的作用:
跳出当前选项,结束当前选择。当执行到这条语句是,表示当前的switch已经结束了。如果没有书写break,程序会按照顺序往下接着执行。
表示式结果或变量的类型:
switch语句默认表达式结果类型支持整型 int。
从JDK版本1.5开始支持枚举 enum
从JDK版本1.7开始支持字符串 String
也就是说:
switch 支持int enum String 这三种类型,但是在基本数据类型中不分基本类型可以自动转化为int类型,因此也可以支持
如: byte short char.
switch支持六中数据类型: byte short char int String enum
public class SwitchDemo2 {
public static void main(String[] args) {
int month=10;
switch (month){
case 12:
case 1:
case 2:
System.out.println("冬天");
break;
case 3:
case 4:
case 5:
System.out.println("春天");
break;
case 6:
case 7:
case 8:
System.out.println("夏天");
break;
case 9:
case 10:
case 11:
System.out.println("秋天");
break;
default:
System.out.println("月份不对");
break;
}
}
}
4.3 循环结构
4.3.1循环三要素
循环三要素是用来控制某个循环的执行次数,如果没有这个条件,当前循环可能出错,也可能出现死循环(循环永远听不下来)。
1 初始变量:用于参与循环条件的判断,控制循环条件是否满足。
2 循环条件:用于控制循环是否执行,如果条件满足,执行循环体,不满足不执行循环体。
3 变量变化:用于改变初始变量的值从而达到循环条件是否满足需求。
4.3.2 直到型循环
直到型循环在java中,使用do...while实现
写法:
do{
循环体
}while(循环条件);
直到型循环是不管循环条件是否满足,都会先执行一次循环体。直到型循环至少执行一次循环体。
public static void main(String[] args) {
// 输出100次Hello World
int i=1;//初始化变量
do{
// 需要在循环体中输出100次Hello World
System.out.println("Hello World"+i);
// 每执行一次循环体后,都将i的值自增1
i++;//i相当于在记录循环了多少次
}while (i>100); //i是记录循环了多少次,如果i还没有到达100,说明输出的次数不够还需要继续执行循环体
// 由于dowhile循环先执行循环体,再判断循环条件,所以不管循环条件是否满足都会先执行一次循环体
}
例题:需要计算1-100的和。
1+2+3+4+....+99+100
public static void main(String[] args) {
// 1-100的和 最终需要的是结果
int num=0;//定义一个结果
// 定义初始化变量,从1开始
int i=1;
do{
// num=num+i;
num+=i;
i++;//变量的变化
}while(i<=100);
System.out.println(num);
}
案例:计算等差数列 1,3,5,7,9,...,99的值
int i=1;
do{
// num=num+i;
num+=i;
i+=2;//变量的变化
}while(i<=99);
System.out.println(num);
案例:计算 1/2+2/3+3/4+....+9/10的结果
public static void main(String[] args) {
double i=1;
double sum=0;
do {
sum+=i/(i+1);
i++;
}while (i<10);
System.out.println(sum);
}
4.3.3 当型循环
当型循环在java中,使用while和for循环两种实现
只有循环条件满足的时候才会执行循环体。
while循环的格式:
while(循环条件){
// 循环体
}
for循环的格式:将三要素动包含在循环上,使代码更加简介阅读性强。
for(初始变量;循环条件;变量变化){
//循环体
}
public static void main(String[] args) {
// 输出1-100
int i=1;
while (i<=100){
System.out.print(i+" ");
i++;
}
System.out.println();
// 使用for循环书写
for (int j = 1; j <=100 ; j++) {
System.out.print(j+" ");
}
System.out.println(i);//可以取到
// System.out.println(j); // 取不到
}
for循环在循环结束后会将三要素中的初始化变量从内存中销毁,节省内存,但是while循环无法销毁初始化变量。因此while循环的初始化变量会在当前方法结束后才会被销毁。这样占用一段时间内存。
4.3.4 循环的嵌套与DEBUG
在开发过程中,循环使用的地方比较多的,同时还会在循环中使用循环。此时称为循环的嵌套。嵌套的循环在运行时逻辑是比较复杂的。需要有一定的梳理能力。
for(int i=1;i<=10;i++){
for(int j=1;j<=10;j++){
System.out.println("Hello");
}
}
请问在控制台输出了多少次Hello. 100次
想要捋清楚这个逻辑,就必须学会debug
一般循环嵌套用的最多的是2层嵌套。能够打印一个平面信息。
4.3.5 break&continue&return
循环的结束除了使用循环条件以外,还可以使用某些关键字停止循环。
break 结束当前循环。
continue 结束本次循环进行下次循环
return 终止当前方法。
本文来自博客园,作者:{warmer},转载请注明原文链接:{https://www.cnblogs.com/warmerws}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)