Java学习(一)

一. Java运行机制及运行过程

1. java核心机制- java虚拟机 JVM java virtual machine

1.1 基本介绍

JVM是一个虚拟的计算机,具有指令集并使用不同的存储区域,负责执行指令,,管理数据,内存,寄存器,包含在JDK中

对于不同的平台,有不同的虚拟机

java虚拟机机制屏蔽了底层运行平台的差别,实现了"一次编译,到处运行"

1.2. JDK

  1. JDK 的全称 Java decelopment KIt java开发工具包,JDK=JRE+java开发工具 [java,javac,javadoc,javap等]

  2. JDK 是提供给Java开发人员使用的,其中包含了java的开发工具,也包括了JRE,所以安装了JDK,就不用在单独安装JRE了

1.3.JRE

  1. JRE(Java Runtime Environment java 运行环境)

JRE = JVM +java 的核心类库(类)

  1. 包括java虚拟机和java程序所需的核心类库等,如果想要运行一个开发好的java程序,计算机中值需要安装JRE即可

1.4 JDK,JRE 和JVM 的包含关系

  • JDK=JRE + 开发工具集(例如javac ,java编译工具等)
  • JRE = JVM + Java SE标准类库(Java核心类库)
  • 如果只想运行开发好的 .class文件 只需要JRE

二. java 快速入门

2.1. 使用Sublime Text 编写代码

1. 编写代码
java 复制代码
 public class Hello{
   //编写一个main方法
   public static void main(string[] args){
   	 System.out.println("hellow,world");
   }
 }
  1. public class Hello 表示Hello是一个类,是一个public 公有的类

  2. hello { } 表示一个类的开始和结束

  3. public static void main(String[] args) 表示一个主方法,即我们程序的入口

  4. main() { } 表示方法的开始和结束

  5. System.out.println("hellow,word"); 表示输出 hello,world 到屏幕

6 ; 表示语句结束

2. 通过终端javac 命令对该java文件进行编译,生成.class文件

javac Hello.java

3. 通过java命令对生成的class文件进行运行

windows: 文件有中文时, 如何处理

在文件 -> 设置文件编码 -> GBK 需要重新保存即可

2.2 什么是编译

Javac Hello.java

  1. 有了java源文件, 通过编译器将其编译成JVM可以识别的字节码文件

  2. 在该源文件目录下,通过javac编译工具对Hello.java文件进行编译

  3. 如果程序没有出错,没有任何提示,但在当前目录下会出现一个Hello.class文件,该文件成为字节码文件,也是可以执行的java的程序

2.3 什么是运行

  1. 有了可执行的java程序(Hello.class字节码文件)

  2. 通过运行工具java.exe 对字节码文件进行执行,本质就是.class装载到jvm机执行

Java程序开发注意事项:

对修改后的Hello.java 源文件需要重新编译,生成新的class文件后,再进行执行,才能生效

2.4 Java 开发注意事项和细节说明

  1. Java源文件以 .java为扩展名. 源文件的基本组成部分是类 class,如本类中的Hello类

  2. Java应用程序的执行入口是main()方法,它有固定的书写格式:

public static void main(String[] args){...}

  1. Java语言严格区分大小写

4, java方法由一条条语句构成,每个语句以 ":" 结束.

  1. 大括号都是成对出现的,缺一不可,习惯,先写{}在写代码

  2. 一个源文件中最多只能有一个public类,其它类的个数不限

  3. 如果源文件包含一个public类,则文件名必须按该类名命名!

  4. 一个源文件中最多只能有一个public类,其它类的个数不限,也可以将main方法写在非public类中,然后指定运行非public类,这样入口方法就是非public的main方法

三. java常用转义字符

  1. \t: 一个制表位,实现对齐的功能
  2. \n: 换行符
  3. \\ : 输出一个\
  4. \" : 输出一个"
  5. \' : 输出一个'
  6. \r : 一个回车
java 复制代码
//演示转移字符的使用
public class ChangeChar{
	//编写一个main方法
	public static void main(String[] args){
		// \t :一个制表位,实现对齐功能
		System.out.println("北京\t天津\t上海");
		// \n : 换行符
		System.out.println("jack\nsmith\nmary");
		//  输出\
		System.out.println("C:\\s");
		// 输出 双引号 " "
		System.out.println("学习:\"java\"");
		// 输出 单引号 ' '
		System.out.println("学习:\'学习java\'");

		// \r: 一个回车
		System.out.println("韩顺平教育\r北京");
		//解读 
		//1. 先输出韩顺平教育然后回车 
		//2. 回车后光标回到韩顺平教育前面
		//3  输出北京,会把韩顺替换掉  
		System.out.println("书名\t作者\t价格\t销量\n三国\t罗 贯中");
	}
}

四. 注释

4.1 单行注释 //

4.2 多行注释 /* */

4.3 文档注释

注释内容可以被JDK提供的工具 javadoc所解析,生成一套以网页文件形式体现的该程序的说明文档,一般写在类

javascript 复制代码
/**
 * 这是类的注释
 * @author wufeng
 * @version 1.0
 */
public class Comment02 {

    /**
     * 主方法
     * @param args 参数
     */
    public static void main(String[] args) {
        System.out.println("Hello");
    }
}

运行命令

在当前目录新建 doc 文件夹,把所有javadoc文档全部生成进去

javadoc -d ./doc -author -version Comment02.java

生成文档

五. 代码规范

  1. 类,方法的注释,要以javadoc的方式来写

  2. 非java Doc的注释,往往是给代码的维护者看的,着重告述读者为什么这么写,如何修改,注意什么问题等

  3. 选中文本后,按 Tab 键整体向右移动缩进;按 Shift + Tab 键整体向左移动缩进。

  4. 运算符和 = 两边习惯性各加一个空格,比如: 2 + 4 * 5 + 345 - 89

  5. 源文件使用utf-8编码

  6. 行宽度不要超过80字符

  7. 代码编写次行风格和行尾风格

六. Windows DOS(命令)

Dos: Disk Operating System 磁盘操作系统

1.补充: 相对路径: 从当前目录开始定位,形成的一个路径

绝对路径: 从顶级目录D盘,开始定位形成的路径

需求: 从abc\test100 访问 hello.txt

相对路径: ..\..\abc2\test200\hello.txt

绝对路径: d:\abc2\test200\hello.txt

2.常用的dos命令

  1. 查看当前目录是有什么内容

(DOS) dir dir d:\abc2\test200

(Mac/Linux) ls /Users/你的用户名/abc2/test200

  1. 切换到其他盘下: 盘符号cd

(DOS) cd cd/D c:

(Mac/Linux) cd /Users/ 用户名 /abc2/test200

3, 切换到当前盘的其他目录下

DOS) cd 文件夹名

(Mac/Linux) cd 文件夹名

  1. 切换到上一级

(DOS) cd..

(Mac/Linux) cd ..

  1. 切换到根目录

(DOS) cd

(Mac/Linux) cd /

  1. 查看指定的目录下所有的子集目录

(DOS) tree D:

(Mac/Linux) ls -R /Users/ 用户名

  1. 清屏

(DOS) cls

(Mac/Linux) clear

  1. 退出

(DOS) exit

(Mac/Linux) exit

七. 变量

变量相当于内存中一个数据存储空间的表示,你可以把变量看做是一个房间的门牌号,通过门牌号我们可以找到房间,而通过变量名可以访问到变量(值)

1. 变量使用的基本步骤

声明变量 int a;

赋值 a=60; 把6赋值给a

通常是 int a=60;

打印 System.out.println(a);

2. 变量使用注意事项

  1. 变量表示内存中的一个存储区域[不同的变量,类型不同,占用的空间大小不同],比如int 4个字节,double 就是8个字节

  2. 该区域有自己的名称[变量名]和类型[数据类型]

  3. 变量必须先声明,后使用,就有顺序

  4. 该区域的数据可以在同一类型范围内不断变化

  5. 变量在同一个作用域内不能重名

  6. 变量=变量名+值+数据类型

3. 程序中 + 号的使用

  1. 当左右两边都是数值型时,则做加法运算
java 复制代码
int a = 10;
int b = 20;
int res = a + b;
System.out.println(res); // 输出:30
  1. 当左右两边有一方为字符串,则做拼接运算
java 复制代码
String name = "用户";
int age = 22;
String info = name + age;
System.out.println(info); // 输出:用户22

八. 数据类型

8.1 基本数据类型

1.整数类型
  • byte 1字节 -128 ~ 217(取值范围)
  • short 2字节 -32768 ~32768
  • int 4字节 常用默认整型
  • long 8字节 超大整数,结尾要加L
java 复制代码
byte a =10; 
short b = 10; 
int c = 1000; 
long d = 9999999999L 
2. 浮点类型
  • float 4字节 单精度,结尾加F
  • double 8字节 双精度,小数默认用它
java 复制代码
float f = 3.14F; 
double d = 3.14159; 
3. 字符类型
  • char : 2字节,存单个字符,用单引号 ' '
java 复制代码
char ch = 'A'
4.布尔类型
  • boolean: 只有两个值true / false, 不能和数字互换
java 复制代码
boolean flag = true; 
boolean b = false; 

8.2 引用数据类型

1.字符串String 保存一串文本字符 双引号"内容" 默认值: null

特点:

  • 引用类型
  • 一旦创建不可修改
    • 号可以和任意类型做字符串拼接

2. 数组

类型 定义格式 作用 下标规则 默认值
数组 类型[] 数组名 存放同类型一组数据 从 0 开始 基本类型给 0 / 假,引用给 null

分类:

  • 基本类型数组: int[ ] byte[ ] double [ ]
  • 引用类型数组: String [ ] 类名[ ]
java 复制代码
int[] arr = {10,20,30};
String[] strArr = {"a","b","c"};

8.3.类 / 接口 / 抽象类

1. 类 class
类型 关键字 作用 创建对象方式 默认值
自定义类 class 封装属性和方法 new 类名() 成员变量默认 null
java 复制代码
//1. 定义普通类 
class Person{
  String name; 
  int age; 
}

//使用 
public class demo {
  public static void main(String[] args){
    // new 创建对象
    Person p =new Person(); 
    p.name = "张三";
    p.age = 20; 
    System.out.println(p.name + p.age);
  }
}
2. 接口(interface)
类型 关键字 作用 使用方式
接口 interface 定义行为规范、规则 类用 implements 实现
java 复制代码
//1. 定义接口 
interface Play {
  //接口方法默认抽象
  void game();
}

//2. 类实现接口
class Student implements Play{
  @Override 
  public void game(){
    System.out.println("学生玩游戏"); 
  }
}

//使用
public class demo{
  public static void main(String[] args){
    Student s = new Student(); 
    s.game();
  }
}
3. 抽象类 (abstract class)
类型 关键字 作用 特点
抽象类 abstract class 半模板、有抽象方法 不能直接 new,只能被继承
java 复制代码
// 1. 定义抽象类
abstract class Animal {
  //抽象方法 : 没有方法体 
  public abstract void eat(); 
}

// 2.子类继承抽象类

class Cat extends Animal{
  // 必须重写重写方法 
  @Override 
  public void eat(){
    System.out.println("猫吃鱼");
  }
}

//使用
public class demo{
  public static void main(String[ ] args){
    Cat c = new Cat(); 
    c.eat(); 
  }
}

九. 基本数据类型使用细节

9.1. 整数类型

  1. Java各整数类型有固定的范围和字段长度,不受具体操作系统的影响,以包整java程序的可移植性,
  2. Java的整型常量默认为int型,声明long型常量须加 'l' 或 'L'
  3. Java程序中变量常声明为int型,除非不足以表示大数,才使用long
  4. bit: 计算机中的最小存储单位, byte: 计算机中基本存储单位, 1byte = 8 bit

9.2. 浮点类型

  1. 与整数类型类似,Java浮点类型也有固定的范围和字段长度,不受具体OS的影响 [float 4个字节, double 是8个字节]
  2. Java的浮点型常量默认为double型,声明float型常量,须后加 'f' 或 'F'
  3. 浮点型常量有两种表示形式
    十进制数形式: 如: 5.12 512.0f .512(必须有小数点)
    科学计数法形式: 如: 5.12e2[ ] 5.12E-2 [ ]
  4. 通常情况下,应该使用double型,因为它比float型更精确
    double num9 = 2.1234567851;
    float num1 = 2.1234567851F;
  5. 浮点数使用陷阱: 2.7 和8.1 / 3 比较

double num11 = 2.7;

double num12 = 8.1 / 3;

System.out.println(number11); //1.7

System.out.println(num12); //接近2.7 2.6999999999999997

注意: 当我们对运算结果是小数的进行相等的判断时,要注意. 应该是以两个数的差值的绝对值,在某个精度范围类判断

正确写法 :

差值非常小,到我的规定精度,认为相等

if(Math. abs(num11 - num12) < 0.0000001){

}

System.out.println(Math.abs(num11 - num12)); //4.440892098500626E-16

9.3. 字符类型(char)

  1. 字符量是用单引号(' ')括起来的单个字符,例如: char c1 = 'a'; char c2 = '中'; char c3 = '9';
  2. java中还允许使用转移字符 '\' 来将其后的字符转变为特殊字符型常量, 例如: char c3 = '/n'; // '\n' 表示换行符
  3. 在java中,char的本质是一个整数,在输出时,是unicode码对应的字符
  4. 可以直接给char赋一个整数,然后输出时,会按照对应的unicode 字符输出
  5. char类型是可以进行运算的,相当于一个整数,因为它都对应有Unicode码
java 复制代码
public class CharDemo {
    public static void main(String[] args) {

        // 1. 单引号括起来的 单个字符
        char c1 = 'a';

        // 2. 转义字符 \n 换行
        char c4 = '\n';
        System.out.println("\n2. 转义字符换行:");
        System.out.println("第一行" + c4 + "第二行");

        // 3. char 本质是整数,直接赋值数字输出对应字符
        char c5 = 97;
        System.out.println("\n3. 赋值整数97:");
        System.out.println(c5); // 输出 a

        // 4. 赋值汉字对应的Unicode数字
        char c6 = 20013;
        System.out.println("\n4. 赋值Unicode 20013:");
        System.out.println(c6); // 输出 中

        // 5. char 可以运算,相当于整数
        char c7 = 'a';
        int result = c7 + 10;
        System.out.println("\n5. char运算:");
        System.out.println("'a' 本身的值:" + (int)c7);
        System.out.println("'a' + 10 = " + result);
    }
}

9.4.字符类型本质

1. 字符型存储到计算机中, 需要将字符对应的码值(整数) 找出来,比如 'a'

存储: 'a' ===> 码值 97==> 二进制 ==>存储

读取: 二进制 => 97 ===> 'a' => 显示

2. 字符和码值的对应关系是通过字符编码表决定的(是规定好的)

介绍一下字符编码表[sublime测试]

ASCll (ASCll) 编码表 一个字节表示,一个128 个字符

Unicode (Unicode 编码表 固定大小的编码 使用两个字节来表示字符,字母和汉字统一都是占用两个字节,这样浪费空间)

utf-8(编码表,大小可变的编码字母使用1个字节,汉字使用3个字节)

gbk(可以表示汉字,而且范围广,字母使用1个字节,汉字2个字节)

gb2312(可以表示汉字,gb2312 < gbk)

big5码(繁体中文,台湾,香港)

9.5.布尔类型

  1. 布尔类型也叫boolean类型,boolean类型数据只允许取值true和false,无null
  2. boolean类型占1个字节.
  3. boolean 类型适于逻辑运算,一般用于流程控制[这个后面会详细介绍]:
    if条件控制语句;
    while循环控制语句;
    do-while循环控制语句;
    for循环控制语句
  4. 不可以0 或非0的整数替代false 和true

十. 基本数据类型转换

10.1 自动类型转换

当java程序在进行赋值或者运算时,精度小的类型自动转换为精度大的数据类型,这个就是自动类型转换

数据类型按精度(容量)大小排序为(规则)

例如 :

int a ='c' ; //可以自动转换 char - > int

double d = 80; // 对 int => double

System.out.println(num) ; //97

System.out.println(d1) ; //80.0

10.2 自动转换注意和细节

  1. 有多种类型的数据混合运算时,系统首先自动将所有数据转换成容量最大的那种数据类型,然后进行计算

  2. 当我们把精度(容量)大的数据类型赋值给精度(容量)小的数据类型时,就会报错,反之就会进行自动类型转换

  3. (byte,short) 和 char之间不会相互自动转换

  4. byte,short,char 他们三者可以计算,在计算时首先转换为int类型

  5. boolean 不参与转换

  6. 自动提升原则: 表达式结果的类型自动提升为操作数中最大的类型

10.3 基本数据类型转换 练习题

java 复制代码
// 基本数据类型转换-练习题
// 判断是否能够通过编译

// 1.
short s = 12; // ok
s = s - 9;    // 错误 int -> short

// 2.
byte b = 10;         // ok
b = b + 11;          // 错误 int -> byte
b = (byte)(b + 11);  // 正确, 使用强转

// 3.
char c = 'a';        // ok
int i = 16;          // ok
float d = .314F;     // ok
double result = c + i + d; // ok float -> double

// 4.
byte b = 16;         // ok
short s = 14;        // ok
short t = s + b;     // 错误 int->short

10.4 基本数据类型和String类型的转换

在程序开发中,我们经常需要将基本数据类型转成String类型,或者将String类型转成基本数据类型

1. 基本数据类型转String

语法: 将基本类型的值 + " " 即可

java 复制代码
public class demo {
    public static void main(String[] args) {
        int n1 = 100;
        float f1 = 1.1F;
        double d1 = 4.5;
        boolean b1 = true;

        // 全部转成字符串 拼接
        String s1 = n1 + "";               // int → String
        String s2 = f1 + "";               // float → String
        String s3 = d1 + "";               // double → String
        String s4 = b1 + "";               // boolean → String

        String all = n1 + "" + f1 + "" + d1 + "" + b1;

        System.out.println(all); //1001.14.5true
    }
}
  1. String类型转换基本数据类型

语法: 通过基本类型的包装类调用parseXX方法即可

java 复制代码
public class demo {
    public static void main(String[] args) {
        String s5 = "123";

        // 1. 字符串 → int
        int num1 = Integer.parseInt(s5);
        
        // 2. 字符串 → double
        double num2 = Double.parseDouble(s5);
        
        // 3. 字符串 → float
        float num3 = Float.parseFloat(s5);
        
        // 4. 字符串 → long
        long num4 = Long.parseLong(s5);
        
        // 5. 字符串 → byte
        byte num5 = Byte.parseByte(s5);
        
        // 6. 字符串 → short
        short num6 = Short.parseShort(s5);
        
        // 7. 字符串 → boolean
        boolean b = Boolean.parseBoolean("true");

        // 输出所有结果
        System.out.println("int 类型:" + num1); //123
        System.out.println("double 类型:" + num2);//123.0
        System.out.println("float 类型:" + num3); //123.0
        System.out.println("long 类型:" + num4);//123
        System.out.println("byte 类型:" + num5); //123
        System.out.println("short 类型:" + num6);//123
        System.out.println("boolean 类型:" + b);// true 

        //怎么把字符串转成字符char  -> 含义是指 把字符串的第一个字符得到 
        //解读 s5.charAt(0) 得到s5字符串的第一个字符 '1'
        System.out.println(s5,charAt(0));
    }
}

注意:

  1. 在将String类型转成基本数据类型时,要确保String类型能够转成有效的数据,比如我们可以把 '123',转成一个整数,但是不能把'hello'
  2. 如果格式不正确,就会抛出异常,程序就会终止

十一. 强制类型转换

11.1 强制类型转换

自动类型转换的逆过程,将容量大的数据类型转换为容量小的数据类型,使用时要加上强制转换符( ),但可能造成精度降低或溢出,格外要注意.

java 复制代码
// 自动类型转换细节
public class demo{
   public static void main(String[] args){
     int i =(int)1.9; 
     System.out.println(i); //1

     int j=100;
     byte b1=(byte)j;
     System.out.println(b1); //100 

     int n2=2000;   
     byte b2=(byte)n2;
     System.out.println(b2);//-48 精度损失 
   }
}

注意:

  1. 当进行数据的大小 大---> 小,就需要使用到强制转换

  2. 强转符号只针对于最近的操作数有效,往往会使小括号提升优先级

    int x =(int) 10*3.5 +6*1.5; //编译错误: double->int
    //正确写法
    int y=(int)(10*3.5 +6*3.5);
    System.out.println(x); //44

  3. char类型可以保存int的常量值,但不能保存int的变量值,需要强转

    java 复制代码
    // 自动类型转换细节
    public class demo{
       public static void main(String[] args){
          char c1=100; //ok
          int m=100; // ok
          //char c2=m;//错误
          char c3=(char)m; //ok 
          System.out.println(c3); //100对应的字符
       }
    }
相关推荐
kyriewen111 小时前
代码写成一锅粥?3个设计模式让你的项目“起死回生”
开发语言·前端·javascript·设计模式·ecmascript
陌路物是人非1 小时前
记一个controller入参为null的奇怪问题
java·开发语言
陈天伟教授1 小时前
AI 未来趋势:产业应用范式之变
大数据·开发语言·人工智能·gpt
小瓦码J码1 小时前
Spring boot 如何自定义加密解密数据库连接配置
java
XiYang-DING2 小时前
【Java EE】JUC的常见类(Callable、ReentrantLock、Semaphore和CountDownLatch )
java·java-ee
RuoyiOffice2 小时前
2026 年开源 BPM/工作流引擎大盘点:Flowable vs Camunda vs Activiti vs Turbo——谁才是企业级首选?
java·spring boot·后端·开源·流程图·ruoyi·anti-design-vue
Han.miracle2 小时前
Java IO 流编程实战
开发语言
SamDeepThinking2 小时前
别把业务逻辑塞进存储过程,适当用表驱动法
java·后端·架构
HZY1618yzh2 小时前
洛谷题解:P16304 [蓝桥杯 2026 省 Java C 组] 抽奖活动
java·c++·算法·蓝桥杯