Java基础

本文详细介绍了Java编程的基础知识,包括变量、基本类型、数据类型转换、复合数据类型、常量、表达式、运算符、循环结构和系统预定义类。讲解了各种类型的特点、用法以及转换规则,如整型、浮点型、字符型和布尔型。此外,还探讨了条件分支语句、循环控制和数学计算,如Math类的使用,以及如何处理越界问题。最后,提到了Scanner类用于用户输入的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

变量

基本类型

基本数据类型转换

复合数据类型

常量

表达式

算术运算符

关系运算符

逻辑运算符

赋值运算符

结构化编程

编程过程

结构化编程的推论

循环总结

系统预定义类


变量

基本类型

4型8种

1.整形:byte 占1字节 short 占2字节 int 占4字节 long 占8字节

  • Java采用补码的方式存储数据

  • 4中不同的表示方式:十进制、0八进制、0x十六进制、0b二进制

  • 在使用字面量,Java中整形默认类型是int,如果想表示long则在数值末尾添加

2.浮点数:float 占4字节 double 占8字节

  • 在Java中浮点数无法精确存放,除非使用Java提供的类BigDecimal

    • 不允许使用等值判断(==),应使用Math.abs(a-b)<le-6

  • 字面量的表示方式:十进制 123.0 、科学计数法1.23e2,注意e后面只能是整数

  • 数值末尾使用f/F表示float,d/D表示double

3.字符类型 char

  • Java中字符采用的是Unicode编码字符集,2B,对应的整数位0-65535

  • 字符类型的变量可以当作整数使用

  • 优先级 ‘0’<‘A’<‘a’

  • Java提供了转义字符,以反斜杠开头

    **  \ddd 1-3位的8进制数对应的字符

    **  \uxxxx 1-4位的16进制数对应的字符

    **  \'表示单引号,注意不允许使用 ’‘’

    **  \''表示双引号

    **  \\表示反斜杠字符

4.布尔类型 boolean

  • 只有两个数值:true表示真,false表示假

  • 在Java中整型数据和boolean之间没有转换

整形数的进制转换

int kk = 123;
        //将十进制数转换为八进制
        System.out.println("0"+Integer.toOctalString(kk));
        //将十进制数转换为十六进制
        System.out.println("0x"+Integer.toHexString(kk));
        //将十进制数转换为二进制
        System.out.println("0b"+Integer.toBinaryString(kk));

常见的数学计算

Java提供了一个Math类,其中包含了基本运算的属性和方法

  • Math.sqrt()计平方根

  • Math.pow(a,b)计算a的b次方

  • Math.abs()求绝对值

  • Math.max/min(a,b) 获取最大值/最小值

  • Math.ceil 获取距离目标最近的最小的整形数值,floor取距离目标值最近的最大的整形数值

  • Math.round 四舍五入的计算

  • Math.random() 获取一个大于或等于0.0小于1.0的随机数

            int dd = 144;
            //开平方
            System.out.println(Math.sqrt(dd));
            
            int k1 = 12;
            int k2 = 3;
            //计算k1的k2次方
            System.out.println(Math.pow(k1, k2));
            
            int k3 = -11;
            //求k3的绝对值
            System.out.println(Math.abs(k3));
            
            //求最大值
            System.out.println(Math.max(k2, k3));
            //求最小值
            System.out.println(Math.min(k2, k3));
            
            double k4 = 5.3d ;
            //获取距离目标值最近的最小的整形数值
            System.out.println(Math.ceil(k4)); //结果为6.0
            //获取距离目标值最近的最大的整形数值
            System.out.println(Math.floor(k4)); //结果为5.0
            
            //四舍五入
            System.out.println(Math.round(k4));
            
            //获取一个大于或等于0.0小于1.0的随机数
            System.out.println(Math.random());

    除了简单计算以外,还有指数、对数、三角和反三角函数等方法的封装

字符类型的基本使用

char c = 'a';
        System.out.println(c);
        //将字符类型转换为整形
        System.out.println(c+"===="+(int)c);
        
        //转义字符
        System.out.println("\123");
        int k5 =0123; 
        System.out.println((char)k5);
        int k6 = 0x0981;
        System.out.println("\u0981");
        System.out.println((char)k6);
        char c1 = '\\';
        System.out.println((int)c1);
        System.out.println(c1);

基本数据类型转换

小转大自动转 大转小需强转 窄化操作

//小转大
        byte b = 123;
        int k = b;
        long kkk = k;
        double k7 = kkk;
        //大转小
        double a = 123;
//      long b = a;  报错  Type mismatch: cannot convert from double 
        long cc =(long)a;

强制类型转换语法

注意:boolean类型和数值类型之间没有任何对应关系,所以进行强制类型转换会报语法错误

针对浮点数系统默认为是double,所以定义变量时识别为double,如果要变量声明为float,这里需要进行数据类型转换或者进行特殊声明

double d = 123.123
long d1 = (long)d; //强制转换
System.out.println(d1);  //使用强制数据类型转换是可能导致精度丢失问题
​
//针对浮点数的特殊处理
float f1 = 123.46;  //报错  Type mismatch: cannot convert from double to float
float f2 = 123.46;  //后缀f/F表示单精度浮点数
float f3 = (float) f1;

复合数据类型

复合数据类型包括:类calss、接口interface、数组

特殊值null,在运行时并没有对应的类型,但是它可以被转化为任何复杂类型,表示没有存储数据,但是不能赋值给简单类型

复合类型的默认值就是null空指针

public class Typora {
    public static void main(String[] args) {
        //复合类型
        Object bb; //定义bb为复合类型Object,Object类是系统预定义
//      System.out.println(bb);  报错:局部变量没有被初始化
        bb = null;
        System.out.println(bb);
        }
}

常量

常量就是指在程序执行期间值不发生变化的数据

//常量
        final double PI = 3.1415926;
//      PI = PI+1;  报错:PI定义为常量  其值不可以修改
        System.out.println(PI);

表达式

表达式就是运算符、操作数以及方法的调用序列,用来所明某个计算过程并返回计算结果

基本运算符可以分为:算数运算符、关系运算符、位运算符、条件运算符

  • 算术运算符: + - * / % ++ --

  • 关系运算符: > >= < <= == 等值 != 不等于

  • 逻辑运算符: &&与运算,表示并且的关系, ||或运算,表示或者的关系, !非运算,表示不是, 重点在于计算过程中支持短路操作

  • 位运算:&与 |或 ^异或 ~按位取反 <<左位移 >>右位移,基本不做要求,位运算不支持短路操作

  • 赋值运算符: = += -= *= /= %=

  • 三目运算符: (表达式1:表达式2:表达式3)

算术运算符

+-*/
特殊:整除计算,参与计算的双方都是整数,则计算为整除计算,结果中不会有小数部分,例如  10/3=3 不是3.33333.如果10./3返回值就是3.33333...,因为10.表示浮点数,不是整除
    
%取余[取模]
10%3 = 1  实际上就是10除以3的余数
    
double k = 10.12;
System.pout.println(k%3);    //输出结果为1.12,小数部分不参与除法运算
​
++和--都是单目运算符
i++计算结果等价于i = i + 1, i--结果等价于 i = i - 1;  【这里需要特别注意:只是计算结果相同   而不是说等价!!!】
​
有两种写法:以++为例,--写法实际相同
    i++是先获取i的值,然后针对i执行i+1的操作
    int age = 99;
    System.out.println(age++); //输出值为99  先获取age值为99,输出后,进行+1操作,此时age = 100
    System.out,println(age);   //结果为100  
​
    ++i是先进性+1操作,在获取i的值
        
    System.out.println(++age);   //结果为100  先+1操作,在获取age此时为100,系统获取后输出100
    System.out.println(age);     //结果为100

问题:将一个任意正整数进行反转,如果数值越界则返回-1

  • 最大正整数 Integer.MAX_VALUE, 最小正整数 Integer.MIN_VALUE ----------常量

int p = 123456009;
        long res = 0;
        while(p>0) {
            int l = p%10;
            p = p/10;
            res = res*10+l;
            if(res > Integer.MAX_VALUE) {
                res = -1;
                break;    //立即终止循环的程序
                
            }
        }
        System.out.println(res);    //输出结果为900654321   如果越界则会返回-1

如果这段代码需要多个地方使用,则需定义一个方法,其中包含处理逻辑,其他地方使用是只需要通过名称就可以进行调用

public class A1 {
    public static void main(String[] args) {
    int k = 200000999;
    System.out.println(reverse(k));
}
   public static int reverse(int x){ //自定义的方法,不会主动执行,需要在main方法中进行调用。这里可以先理解public static是固定的写法【实际上有问题】,int表示返回值类型,reverse是方法名称(可以执行定义),以后相当于需要使用这段代码的时是通过名称就可以直接调用,int x 是参数,表示调用方法时必须传入一个int类型的参数
     long res = 0;
     while(x > 0) {
        int l = x %10;
        x = x/10;
        res = res*10+l;
        if(res > Integer.MAX_VALUE) {
            res = -1;
            break;    //立即终止循环的程序
         }
      }
       return (int)res; //因为res声明为long类型,但是返回类型应该是int,所以需要强制类型转换
    }
}

关系运算符

用于判断两个数据之间的大小关系,计算结果就是boolean值,如果成立则返回true,否则返回false

<小于 >大于 >= 大于等于 <=小于等于 == 等于 !=不等于

double d = 10;
System.out.println(d>3) ;  //返回true

==和=的区别

  • k=100;这是一个赋值运算,就是将=右边的计算结果赋值给=左边的变量

  • k == 100;这是比较运算,判断k的值是否为100,如果是则返回true,否则返回false

由于浮点数无法精确存放,所以判断k == 1.0写法是错的,正确写法应该是是Math.abs(a-b)<1e-6

逻辑运算符

用于表达多个条件之间的关系,例如年龄大于18并且小于65 age>18 && age<65

&&与运算,表示并且

同真则真,其余为假

age>18 && age<65 age = 25由于两个条件都成立,所以计算结果为真

|| 或运算,表示或者

同假则假,其余为真

age>18 || age<65 age = 125由于age >18 成立所以返回结果为true

! 非运算,不是否则

非真则假,非假则真

考试重点:短路计算

例如:A&&B,如果条件A为false,不管B是true还是false,则计算结果一定是false,这种情况下计算结果和B没有任何关系(&&表示并且,同真为真),所以计算时不执行B,直接返回false

A||B,如果条件A为true,则不需要计算B,直接返回true(||表示或者,有真则真),计算结果和B没有直接关系

int age1 = 100;
        char AA = 'A';
        System.out.println((int)AA);
        System.out.println((int)'B');
        if(AA > 'B' && age<200  ) {    //因为第一个条件不成立  所以直接输出条件为假,后边age<200不需要进行判断
            System.out.println("条件成立");
        }
        System.out.println("条件为假");

赋值运算符

*= += -= = /= %=

int k = 10;将10赋值存储在k对应的存储单元中

k = k+1 可以简化为k+=1,其他的运算含义一致

考点:

short kkkk = 3;
        kkkk = kkkk+3;  //报错:类型不匹配:不能从int转换为short  kkkk+3中的3被系统自动识别为int类型,所以计算结果自动转换为int。但是int类型不能直接给短整型变量直接赋值
kkkk = (short) (kkkk+3);
​
//另外写法
short k = 3;
k+=3;
        

结构化编程

指导思想:自顶向下、逐步求精、模块化

编程过程

流程图时使用画图的方式来说明某个过程,常见的离线绘图工具有Visio或者PowerDesigner等;目前还有在线的绘图工具有ProcessOn等

  • 圆角矩形表示一个流程图的开始或者结束点

  • 矩形用于表示行动方案或者普通额工作环节

  • 菱形用于问题的分支判断或者审核、审批之类的判断环节

  • 平行四边形表示处理流程中额输入或输出

  • 箭头线用于表示工作流的方向

结构化编程的推论

任何复杂的问题都可以使用三种基本算法结构来描述:顺序、选择和循环

条件分支语句

Java提供了两种判断语句if和switch,这两种语句用于实现条件判断,当复合某些条件时执行某段代码,否则不执行

if结构

语法:

当条件成立时执行代码段,如果条件不成立则不执行代码段,而是执行if后面额下一句

if(条件判断语句){
    代码段1:
}else{
    代码段2:
}
//当条件成立时执行代码段1,如果条件不成立则执行代码段2,无论如何至少执行一个代码段

允许if/else结构进行嵌套

if(条件1){
    代码段1:
}else if(条件2){      //隐含条件实际上是条件1不成路并且条件2成立
    代码段2;
}else if(条件n){
    代码段n;
}else{
    代码段n+1;
}

要求:

输入学生性别,如果false则显示女

Scanner sc = new Scanner(System.in);
        boolean bb1 = sc.nextBoolean();
        if(bb1 == false) {
            System.out.println("性别为女");
        }

要求:输入学生成绩,假设成绩都是整数,如果>60显示及格,否则显示不及格

Scanner sc = new Scanner(System.in);
        int q = sc.nextInt();
        if(q>60) {
            System.out.println("你的成绩为及格");
        }else {
            System.out.println("你的成绩不及格");
        }

要求:输入学生成绩,假设成绩全为整数,成绩>=85为优秀,>=75为良好,>=60为及格,否则显示不及格

Scanner sc = new Scanner(System.in);
int score = sc.nextInt();
if(score >= 85){
    System.out.println("你的成绩为"+score+"等级优秀");
}else if(score >= 75){
    System.out.println("你的成绩为"+score+"等级良好");
}else if(score >= 65){
    System.out.println("你的成绩为"+score+"等级及格");
}else{
    System.out.println("你的成绩不及格!!!");
}

这里的判断顺序不能进行调整,例如先判断>=70,在判断>=85

这里的潜在含义为:条件1不成立时才执行条件2的判断,如果条件1成立则不会执行条件2的判定

开关分支语句

swtich(表达式){
    case 值1:  计算表达式的值是否等于值1,如果相等则执行代码块1
         代码块;  break;  执行完毕后,如果没有break则继续向下执行,但是不做判断。如果有break语句则立即终止switch的执行,跳转到switch结构后的下一句开始执行
    case 值2:
         代码块2; break;
       ... ...      
     dafault:    当所有的case都不能成立时,则执行代码块n
         代码块n; [break];
}

语法点:【考核点】

  • 表达式的计算结果可以是整数【不允许是long类型】,可以是char,同时还允许字符串类型

  • dafault的位置实际上没有什么特殊要求,但是一定是所有的case值都不相等是才会执行。在具体的开发中为了增强代码的可读性,一般建议写在所有case语句之后

要求:输入月份,显示对应的本月的天数

  • 1 3 5 7 8 10是31天

  • 4 6 9 11是30天

  • 2月闰年29天,平年28天

  • 如果一个年份值可以被4整除,同时不能被100整除,或者能被400整除就是闰年

Scanner sc =new Scanner(System.in);
        int mouth =sc.nextInt();
        switch(mouth) {
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
            System.out.println("本月天数为31天");
            break;
        case 4:
        case 6:
        case 9:
        case 11:
            System.out.println("本月30天");
            break;
        case 2:
            System.out.println("请输入年份:");
            int  year = sc.nextInt();
            if(year%4 == 0 && year%100!=0 || year%400 == 0) {
                System.out.println("本月28天");
                }else {
                    System.out.println("本月29天");
                    break;
                }       
        default:
            System.out.println("输入的年份有误");
            break;      
            }

循环结构

循环就是重复做一件事,在Java程序中,循环控制就是某一个条件下,控制程序重复执行某一个代码段,直到遇到终止条件为止

循环结构也就称为迭代语句,在Java语言中while、for、和do ...while三种循环语句

while循环

while循环时Java中最基本的语句,满足条件才执行循环体,如果不满足则不执行,所以可能循环体执行多次,也可能一次都不执行

*while(条件) {执行语句} * 当条件成立时反复执行语句,知道条件不成立为止

需求:1+2+3+…+100

int res = 0;
int k = 0;
while(k<100){  //使用0比较   累加使用1
    k++;
    res = res+k;
}
System.out.println(res);

break和continue的用法

需求:计算100以内的奇数和

最直接的思路:奇数相加,偶数跳过

int res = 0;
int k = 0;
while(true){
    if(++K>100)
        break;  //终止程序以避免死循环
    if(k%2 == 0)
        continue;  //  终止本次循环,直接进入下次循环,不会执行后续代码。直接返回到语句3
    res=+k;
}
System.out.println(res);
  • break是立即终止循环,进入循环结构的后续代码,继续执行,

  • continue是终止本次循环,进去下一次循环,循环并没有结束

do…while循环

先执行循环体,然后进行条件判单,如果条件为真,则执行下次循环;否则终止循环

不同于while循环的特征:do/while循环至少需要执行一次循环;然而while有可能一次都不执行循环体

do{
    循环体
}while(条件);
实现

int res = 0;
int k  = 1;
do{
    res+=k++;
}while(K<100){
    System.out.println(res);
}

需求:求100以内所有偶数的和

int res = 0;
        int k = 0;
        do {
            k++;
            if(k%2==0) {
                res+=k;
            }
        }
        while(k<100);
            System.out.println(res);
    }

for循环

基本循环流程:1.执行表达式1。2.执行表达式2,一般表达式2是一个条件判断,如果值为true则执行循环体,否则终止循环。3.执行完循环体后在执行表达式3。4、只执行表达式2以判断是否执行循环体。在整个循环执行过程中,表达式1只执行一次

for(表达式1;表达式2;表达式3){
    循环体;
}

//实现:

int res = 0;
for(int k =0;k<=100;k++){
    res+=k;
}
System.out.println(res);

特殊先发:表达式1 2 3并不是必须的 【由于只是小白,代码不在此展示,各路大神可以自行编译运行】

循环总结

实际上三种循环可以相互迭代

for循环一般用于可以明确循环次数的场景中

while循环一般用于不能明确知道执行次数的场景中

do/while循环一般用于不能预先明确循环次数,但是同时要求循环体至少运行一次的场景中

系统预定义类

java5添加了java.util.Scanner类,这是一个用于扫描输入文本的新的实用程序

nextInt()只读取int值,就是只能读取类型的数据,如果输入了非类型的数据(浮点型字符串等)就会报错。nextFloat、nextDouble这些也是以此类推,只能读取符合该类型的数据

Scanner sc = new Scannner(System.in);  //可以理解为获取标准输入设备的引用,用于接收用户的键盘录入
//为了针对用户优化,所以一般输入之前需要对用户进行提醒
System.out.println("请输入您的年龄为:");//在控制台上输出提示信息
int age = sc.nextInt();//这里需要接受一个int类型数据
System.out.println("年龄"+age);

注意在class类定义上方应该添加 import java.util.Scanner ;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值