学习 Java 语言

56 阅读8分钟

前言

最近想了解下其他非前端语言,了解下各语言的使用场景,看看能不能在日常前端工作中使用到以提高开发效率等,从而强大自己。上一篇文章学了 shell 编程,这篇文章学 Java

环境搭建

Java,首先要做的就是搭环境,参考 菜鸟教程。因为我是 windows 系统,所以搭建如下:

  • 到官网下载 Java 开发工具包 JDK,下载地址,选择系统对应的版本(32bit/64bit); jdk-download.png

  • 下载后 JDK 的安装根据提示进行,还有安装 JDK 的时候也会安装 JRE,一并安装就可以了。 安装JDK,安装过程中可以自定义安装目录等信息,例如我选择安装目录为 D:\software\soft\Java\jdk-19

  • 配置环境变量:在 "系统变量" 中设置 3 项属性,JAVA_HOME、PATH、CLASSPATH(大小写无所谓),若已存在则点击"编辑",不存在则点击"新建"。

    变量名称变量值
    JAVA_HOMED:\software\soft\Java\jdk-19
    CLASSPATH.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
    Path%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;

测试 JDK 是否安装成功:打开 cmd,输入 java -version、java、javac,出现以下信息,说明环境变量配置成功

image.png

小工具:自动编译并执行 java

# exec.sh
# author:小晰前端
# time:2022/9/26
# enviroment:windows

# 自动编译并执行java
echo "<<<<<<<< 开始执行 >>>>>>>>"

execJava() {
    javac "$1.java"
    java "$1"
}

main() {
    if [ "$1" = "" ]
    then
        read -p "请输入要执行的java文件名称:" javaName
        if [ "$javaName" != "" ]
        then
            execJava javaName
        else
            echo "请输入非空的java文件名称, 可再次尝试"
        fi
    else
        execJava $1
    fi
}
main $1

echo "<<<<<<<< 执行结束 >>>>>>>>"

我用的编辑器是 VS Code,通过在 git bash 里输入命令 ./exec.sh 文件名 来执行 java。

语法

基础语法

介绍

一个 Java 程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作。下面简要介绍下类、对象、方法和实例变量的概念。

  • 对象:对象是类的一个实例,有状态和行为。例如,一条狗是一个对象,它的状态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等。
  • :类是一个模板,它描述一类对象的行为和状态。
  • 方法:方法就是行为,一个类可以有很多方法。逻辑运算、数据修改以及所有动作都是在方法中完成的。
  • 实例变量:每个对象都有独特的实例变量,对象的状态由这些实例变量的值决定。

示例:

// author:小晰前端
// time:2022/9/27

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

运行:

image.png

基本语法

编写 Java 程序时,应注意以下几点:

  • 大小写敏感:Hello 与 hello 是不同的;
  • 类名:对于所有的类来说,类名的首字母应该大写。如果类名由若干单词组成,那么单个单词的首字母应该大写,例如 HelloWorld
  • 方法名:所有的方法名都应该以小写字母开头。如果方法名含有若干单词,则后面的每个单词首字母大写;
  • 源文件名:源文件名必须和类名相同。当保存文件的时候,你应该使用类名作为文件名保存,文件名的后缀为 .java(如果文件名和类名不相同则会导致编译错误);
  • 主方法入口:所有的 Java 程序由 public static void main(String[] args) 方法开始执行

变量类型

  • 局部变量:在方法、构造方法或者语句块中定义的变量。变量声明和初始化都是在方法中,方法结束后,变量会自动销毁;
  • 类变量(静态变量):声明在类中,方法体之外,但必须声明为 static 类型;
  • 成员变量(非静态变量):定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问;

学到这的时候,感觉 Java 的规矩好多啊,与 shell 相比,明显 shell 简练且没有那么多规规矩矩的...


源文件声明规则

当在一个源文件中定义多个类,并且还有 import 语句和 package 语句时,要特别注意这些规则:

  • 一个源文件中只能有一个 public 类
  • 一个源文件可以有多个非 public 类
  • 源文件的文件名称应该和 public 类的类名保持一致
  • 如果一个类定义在某个包中,那么 package 语句应该在源文件的首行
  • 如果源文件包含 import 语句,那么应该放在 package 语句和类定义之间。如果没有 package 语句,那么 import 语句应该在源文件中最前面
  • import 语句和 package 语句对源文件中定义的所有类都有效。在同一源文件中,不能给不同的类不同的包声明

对象和类

菜鸟教程 Java 对象和类 讲的非常清晰明了,这里不多赘述。

  • 对象: 对象是类的一个实例,有状态和行为。例如:一条狗是一个对象,它的状态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等;
  • :类是一个模板,它描述一类对象的行为和状态;

20210105-java-object-1.png

构造方法

每个类都有构造方法。如果没有显示地定义构造方法,Java 编译器将会提供一个默认构造方法。在创建一个对象的时候,至少要调用一个构造方法,构造方法的名称必须与类同名,一个类可以有多个构造方法。

示例:

public class Puppy {
    public Puppy() {}
    
    public Puppy(String name) {}
}

创建对象

对象是根据类创建的,使用关键字 new 来创建一个新的对象,分三步:

  • 声明:声明一个对象,包括对象名称和对象类型;
  • 实例化:使用关键字 new 来创建一个对象;
  • 实例化:使用 new 创建对象时, 会调用构造方法初始化对象

示例:

/* 创建对象 */
Puppy myPuppy = new Puppy("tommy")

访问实例变量和方法

通过已创建的对象来访问成员变量和成员方法,示例:

myPuppy.变量
myPuppy.方法名称()

基本数据类型

变量就是申请内存来存储值,即当创建变量的时候,需要在内存中申请空间。内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来储存该类型数据。

Java 有两大数据类型:

  • 内置数据类型(八种):六种数字类型(四个整数型,两个浮点型),一种字符类型,一种布尔型;
  • 引用数据类型:指向一个对象,变量一旦声明后类型就不能改变了;

内置数据类型

类型描述范围默认值示例
byte8位、有符号,以二进制补码表示的整数[-128, 127]0byte a=100, byte b=-50
short16位、有符号,以二进制补码表示的整数[-32768(-2^15), 32767(2^15 - 1)]0short s=1000
int32位、有符号,以二进制补码表示的整数([-20亿-20亿])[-2,147,483,648(-2^31), 2,147,483,647(2^31 - 1)]0int a=100000
long64位、有符号,以二进制补码表示的整数[-9,223,372,036,854,775,808(-2^63), 9,223,372,036,854,775,807(2^63 -1)]0Llong a=100000L
float单精度、32位、符合IEEE 754标准的浮点数(浮点数不能用来表示精确的值,如货币)暂无0.0ffloat f1 = 234.5f
double双精度、64位、符合IEEE 754标准的浮点数(不能用来表示精确的值,如货币)暂无0.0ddouble f1 = 234.5f
booleantrue/false[true, false]falseboolean loding=true
char一个单一的16位 Unicode 字符[\u0000(十进制等效值为 0), \uffff(即为 65535)]u0000
--------char letter='A'

对于数值类型的基本类型的取值范围,可以直接使用:

public class PrimitiveTypeTest {  
    public static void main(String[] args) {  
        // byte  
        System.out.println("基本类型:byte 二进制位数:" + Byte.SIZE);  
        System.out.println("包装类:java.lang.Byte");  
        System.out.println("最小值:Byte.MIN_VALUE=" + Byte.MIN_VALUE);  
        System.out.println("最大值:Byte.MAX_VALUE=" + Byte.MAX_VALUE);  
        System.out.println();  
  
        // short  
        System.out.println("基本类型:short 二进制位数:" + Short.SIZE);  
        System.out.println("包装类:java.lang.Short");  
        System.out.println("最小值:Short.MIN_VALUE=" + Short.MIN_VALUE);  
        System.out.println("最大值:Short.MAX_VALUE=" + Short.MAX_VALUE);  
        System.out.println();  
  
        // int  
        System.out.println("基本类型:int 二进制位数:" + Integer.SIZE);  
        System.out.println("包装类:java.lang.Integer");  
        System.out.println("最小值:Integer.MIN_VALUE=" + Integer.MIN_VALUE);  
        System.out.println("最大值:Integer.MAX_VALUE=" + Integer.MAX_VALUE);  
        System.out.println();  
  
        // long  
        System.out.println("基本类型:long 二进制位数:" + Long.SIZE);  
        System.out.println("包装类:java.lang.Long");  
        System.out.println("最小值:Long.MIN_VALUE=" + Long.MIN_VALUE);  
        System.out.println("最大值:Long.MAX_VALUE=" + Long.MAX_VALUE);  
        System.out.println();  
  
        // float  
        System.out.println("基本类型:float 二进制位数:" + Float.SIZE);  
        System.out.println("包装类:java.lang.Float");  
        System.out.println("最小值:Float.MIN_VALUE=" + Float.MIN_VALUE);  
        System.out.println("最大值:Float.MAX_VALUE=" + Float.MAX_VALUE);  
        System.out.println();  
  
        // double  
        System.out.println("基本类型:double 二进制位数:" + Double.SIZE);  
        System.out.println("包装类:java.lang.Double");  
        System.out.println("最小值:Double.MIN_VALUE=" + Double.MIN_VALUE);  
        System.out.println("最大值:Double.MAX_VALUE=" + Double.MAX_VALUE);  
        System.out.println();  
  
        // char  
        System.out.println("基本类型:char 二进制位数:" + Character.SIZE);  
        System.out.println("包装类:java.lang.Character");  
        // 以数值形式而不是字符形式将Character.MIN_VALUE输出到控制台  
        System.out.println("最小值:Character.MIN_VALUE="  
                + (int) Character.MIN_VALUE);  
        // 以数值形式而不是字符形式将Character.MAX_VALUE输出到控制台  
        System.out.println("最大值:Character.MAX_VALUE="  
                + (int) Character.MAX_VALUE);  
    }  
}  

Java 常量

常量在程序运行时是不能被修改的,使用关键字 final 来修饰产量,声明方式和变量类似:

final double PI = 3.1415927;

虽然产量名也可用小写,但为了便于识别,通常使用大写字母表示产量。

byte、int、long、和short都可以用十进制、16进制以及8进制的方式来表示。当使用字面量的时候,前缀 0 表示 8 进制,而前缀 0x 代表 16 进制,示例:

int decimal = 100;
int octal = 0144;
int hexa =  0x64;

自动类型转换

整数、实型(常量)、字符型数据可以混合运算。运算中,不同类型的数据先转化为同一类型,然后进行运算。转换从低级到高级

低  ------------------------------------>  高

byte,short,char—> int —> long—> float —> double 

Java 规矩好多啊...,问从入门到结束要多久(好难啊)~,到现在我还不知道 Java 到底能干啥,能干啥!

应用

总结