java基础入门

java三个版本

  • javaSE:基础版 standard edition

  • javaME:移动版

  • javaEE:企业版,大型系统,大型网站

java 是一门夸平台的语言,一次编写,处处运行

原因:java有各种类型的jvm,并且jvm不跨平台

代码(java) -> 编译(class) -> 执行(class)

java组成

jvm:java虚拟机

jre:jvm+核心类库 只能运行java程序,但不能开发

jdk:jre+运行环境工具 既能运行java程序,又能进行开发

jvm<jre<jdk

环境配置:

下载jdk安装

环境变量:

JAVA_HOME:jdk安装的根目录

path: %JAVA_HOME%\bin

classpath 不用建

基础命令:

编译命令:javac java文件名带后缀(实际编译文件为.java文件,编译产生.class字节码文件)

运行命令:java java文件名不带后缀(运行文件为.class字节码文件)

java程序结构详解

hello world

public class main {
    public static void main(String[] args) {
        System.out.println("Hello world!");
    }
}
  • class后面的称之为“类名”

  • public class后面的类名,必须和文件名保持一致

  • 一个文件可以有多个类(class),但是只能有一个公共类(public class)

  • System.out.println("Hello world!");输出语句

  • 大括号(各种括号)成对出现,要缩进

  • 程序的入口是main()方法

  • java文件中有汉字,并且javac编译时出现 错误提示“错误:编码GBK的不可映射字符” 解决:文件编码改为ANSI编码

转义字符

转义字符(ASCII码值【十进制】) 意义

\b(008) 退格(BS),将当前位置移到前一列

\f(012) 换页(FF),将当前位置一道下页开头

\n(010) 换行(LF),将当前位置移到下一行开头

\r(013) 回车(CR),将当前位置移到本行开头

\t(009) 水平制表(HT)(跳到次啊一个TAB位置)

\\(092) 代表一个反斜字符\

\'(039) 代表一个单引号(撤号字符)

\"(034) 代表一个双引号字符

\?(063) 代表一个问号

\0(000) 空字符(NULL)

\ddd(三位八进制) 1到3位八进制数所代表的任意字符

\xhh(十六进制) 十六进制所代表的任意字符

注释

单行注释 //

多行注释 /* */

文档注释 /** */ 将程序生成一个说明文档,则说明文档中的,说明文字就是通过文档注释生成的

public class main {
    /**
     * hello 
     * @param args
     */
    public static void main(String[] args) {
//        System.out.println("Hello world!");
/*        System.out.println("Hello world!");
        System.out.println("Hello world!");*/
        System.out.println("Hello world!");
    }
}

数据类型详解

IDEA快捷键:

mian快捷写法:psvm +tab

输出语句:sout + tab

多行注释: 选中 Ctrl+/

..........................

变量

变量存在于内存(运行结束变量失效)

声明 赋值 使用

java的数据类型:

  • 原生数据类型(基本数据类型):8个:

    • 数字:

      • 整数:byte<short<long 默认int

      • 小数:float<double 默认double

      • 一般性原则:尽量使用最小范围

    • 非数字:

      • 字符char char c = 'a' 单引号 只能一个字符

      • 布尔boolean true / false

  • 引用数据类型(对象类型):String 字符串

字节byte=8bit(-128~127)

短整数short=2byte

整数int=4byte

长整数long=8byte

float=4byte

double=8byte

Java 基本数据类型的默认值和占用大小:

数据类型

默认值

大小

boolean

false

1字节或 4 字节

char

'\u0000'

2 字节

byte

0

1 字节

short

0

2 字节

int

0

4 字节

long

0L

8 字节

float

0.0f

4 字节

double

0.0

8 字节

赋值

=:赋值符号,右侧赋值给左侧

变量名规范:首字母小写的,驼峰法 myValue

float x = 13.4(错误写法)

float x = 13.4f

float x = (float)13.4

short x = 1 正确

小数=等号 += -=不带转换器

整数=等号 += -=自带转换器

变量使用要赋初值

变量名代表变量,不能重复

变量名区分大小写

java可以表示 的进制

  • 二进制:0b数字 0b011表示3

  • 十进制:默认

  • 八进制:0数字 011表示9

  • 十六进制 0x

变量命名规则(强制性)

首字符+其他

a.首字母:各国语言,下划线,钱

b.其他:首字母

c.不能是关键词

-d.符号只能是下划线和钱

变量的范围:最近一对大括号

+号的用法:加法,拼接

默认包:java的默认包是java.lang,即该包中的所有类回自动导入,不必在写import

从控制台输入:

public class main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        double d = scanner.nextDouble();
        float f = scanner.nextFloat();
        String s = scanner.nextLine();
        s = scanner.next();
    }
}
Scanner scanner = new Scanner(System.in);
scanner.netXxxx()接收各种类型,除了char Scanner没有接收char的方法

next()和nextLing()区别

  • next()不接受空格回车,并且将空格回车作为终止符号

  • nextLine()接收空格回车

阅读异常:

从上往下看,看到自己出错代码行号位置

类型转换

  • 自动转换

    • 范围小的类型可以自动转换为范围大的类型

    • 范围小的类型遇到范围大的类型可以转为范围大的类型

    • 整数<小数

    • “最大整数是字符串”:任何类型遇到字符串,自动转为字符串

    • char<int

  • 强制转换

    • 范围大的给范围小的,必须强转

    • 通用写法:范围小的 = (小类型)范围大的

    • 特殊:float x = 1.23f float x = (float) 1.23

算术运算符详解

算术运算符:

+ - * /

%:求余 取模

% : 有符号问题,结果永远和第一个数被除数相符

关系运算符(比较运算符):

< > >= <= == !=

字符串比较用equals() !equals()

关系运算符的运算结果是boolean值 true false

遇到优先级问题使用小括号

两数交换:中间变量,加减法(溢出),位运算

  • 1. 使用中间变量

    这种方法是最直接也是最容易理解的方式,通过引入一个临时变量来保存其中一个值,然后进行交换。

public class SwapNumbers {
    public static void main(String[] args) {
        int a = 5;
        int b = 10;

        // 使用中间变量交换
        int temp = a;
        a = b;
        b = temp;

        System.out.println("a: " + a + ", b: " + b);
    }
}
  • 2. 加减法 利用加减操作来实现交换,需要注意的是这种方法可能会导致整数溢出的问题,特别是在两个数非常大的情况下。

public class SwapNumbers {
    public static void main(String[] args) {
        int a = 5;
        int b = 10;

        // 使用加减法交换
        a = a + b; // a 现在是 15
        b = a - b; // b 变成原来的 a 的值 5
        a = a - b; // a 变成原来的 b 的值 10

        System.out.println("a: " + a + ", b: " + b);
    }
}
  • 3. 位运算 利用异或操作来实现交换,这种方法不会产生溢出问题,并且不需要额外的存储空间。

public class SwapNumbers {
    public static void main(String[] args) {
        int a = 5;
        int b = 10;

        // 使用位运算交换
        a = a ^ b; // a 现在是 5^10
        b = a ^ b; // b 变成原来的 a 的值 5
        a = a ^ b; // a 变成原来的 b 的值 10

        System.out.println("a: " + a + ", b: " + b);
    }
}

逻辑运算符

!:不等于

两个符号:根据真值表判断(短路原则)

&&

||

一个符号:左右都判断

&

|

i++ 先用后加

++i 先加后用

特例:

byte+byte = int short + short = int

a=a+b a+=b区别 +=有转换器 a = a+ b无转换器

byte+=byte 正确 byte= byte+byte错误

三目运算符:

c = a>b ? a : b boolean运算为真 赋值a 为假赋值b

小数运算遇到问题:

3*0.3f 运算结果0.90000004

float小数,无穷无尽个小数,2的32次方的位置无法容纳所有小数

二进制 无法表示

选择结构

if

if(布尔条件)

{

....................//条件为真 则执行

}

if后面只有一条语句 ,则{}可以省略(但不建议)

如果有多条语句,则{}不能省略

if...else...

if(布尔条件)

{

....................//条件为真 则执行

}

else

{

....................//条件为假则执行

}

简单赋值可以使用三目运算符简化

随机数:

Math.random(); [0,1]

n位随机数

public static int generateNBitRandomNumber(int n) {
        // 计算 n 位数的最小值和最大值
        int minValue = (int) Math.pow(10, n - 1); // 最小值
        int maxValue = (int) Math.pow(10, n) - 1; // 最大值

        // 生成随机数
        double randomValue = Math.random();
        int randomNumber = (int) (randomValue * (maxValue - minValue + 1)) + minValue;

        return randomNumber;
    }

多重if else

if(布尔条件)

{

....................//条件为真 则执行

}

else if(布尔条件)

{

....................//条件为真则执行

}

else

{

....................//条件都不满足则执行

}

多重if else 编写顺序:严格优先判断,(>/>=,数字越大越优先判断;</<=数字越小,越优先判断》)

嵌套if

if()

{

if()

{

}

}

else{}

区别:

多重if和嵌套if : 判断是否同一件事,是多重,否嵌套

switch

switch(x)

{

case 1:

............;

break;

................

default:

..............

break;

}

  • switch后支持的表达式类型:int,short,byte,char,String,枚举

    • Java5 以前 switch(expr)中,expr 只能是 byte、short、char、int。

      从 Java 5 开始,Java 中引入了枚举类型, expr 也可以是 enum 类型。

      从 Java 7 开始,expr 还可以是字符串(String),但是长整型(long)在目前所有的版本中都是不可以的。

  • switch 会用x和所有case比较,一直执行case语句 都不匹配,执行default语句

  • break一般不省略,否则回继续执行case后续case语句

  • default可以省略

  • switch遇到break或者最后大括号结束

  • case 不能重复

区别:

多重if和switch:如果判断区间值,多重if,如果是离散值/单点值,switch

input.hasNextInt 判断输入是否为数字

循环:重复执行的事情

程序中的循环 = 循环条件 + 循环操作

while

while(循环条件)

{

循环操作

}

循环要更新变量,防止死循环

do while

do

{

循环操作

}while(循环条件)

do..while 先执行后判断

至少执行一次

for循环:while的变体

for(int i=0;i<100:i++)

{

sum++;

}

等价while

int i=0

while(i<100)

{

sum++

}

while 先判断后循环

do..while 先判断后循环

for 循环此时已知, 始末条件未知的

continue和break

break 退出循环,终止循环

continue 跳出当前循环,继续下一次循环

仅对当前层次有效

二重循环

循环内嵌循环,循环要完整

while()

{

if()

{

while()

{

}

}

}