Java编程基础-1

学习任何一门语言,都要从基础开始。本文将针对Java的基本语法,变量进行讲解。

1. 基本语法

1.1 Java的基本语法格式

编写Java程序代码必须先声明一个类,然后在类中编写实现需求的业务代码。类使用class关键字进行声明,类的名称必须与文件名相同,文件扩展名为.java

   [修饰符] class 类名 {
      程序代码
   }

注意:

  1. 程序代码必须包含在类中,不能单独存在。类名必须与文件名相同,文件扩展名为.java
  2. java中程序可分为结构定义语句功能执行语句。结构定义语句用于声明一个类或方法,功能执行语句用于实现具体的功能。每条功能执行语句都必须以英文分号(;)结尾。
    如下示例:
      System.out.println("Hello World!");
  1. Java严格区分大小写,类名必须以大写字母开头,方法名必须以小写字母开头。在程序定义一个computer变量,同时定义一个Computer,这两个是完全不同的变量,请严格注意。
  2. 为了便于阅读,编写代码时应该养成良好的格式习惯。虽然不会报错,但还是要注意排版,使代码更加易读。例如:
    //虽然不报错,但不容易阅读
    public class HelloWorld {public static void main(String[] args) {System.out.println("Hello World!");}}

    //推荐的格式
   public class HelloWorld {
      public static void main(String[] args) {
         System.out.println("Hello World!");
      }
   }
  1. 一个连续的字符串不能分开在两行中书写,可以先将字符串改成两个字符串,然后使用(+)连接起来。例如:
    System.out.println("Hello 
            World!"); //错误的!

    //正确的写法
    System.out.println("Hello " + 
            "World!");

1.2 注释

Java中有三种注释方式:

  1. 单行注释://后面跟注释内容。
  2. 多行注释:/*后面跟注释内容,*/表示注释结束。
  3. 文档注释:/**后面跟注释内容,*/表示注释结束。
    // 单行注释
    int age = 18; // 变量age的注释

    /* 多行注释
    定义一个整型变量x
    将5赋值给变量x
    */
    int x;
    x = 5;

    /**
     * 文档注释
     * HelloWorld类
     * @author 张三
     */
     public class HelloWorld {
        /**
         * 主方法
         * @param args 主方法的参数
         */
        public static void main(String[] args) {
            System.out.println("Hello World!");
        }
    }

注意:

  1. 单行注释只能注释一行代码,不能注释多行代码。
  2. 多行注释可以注释多行代码,但不能嵌套多行注释。
  3. 文档注释可以注释整个类、方法、变量,但不能嵌套文档注释。

1.3 关键字

Java语言共有32个关键字,具体如下:

关键字说明是否常用
abstract抽象类关键字,用于定义抽象类。常用
assert断言关键字,用于在运行时验证表达式。不常用
boolean布尔类型关键字,用于定义布尔类型变量。常用
break跳出当前循环或switch关键字,用于退出循环或switch语句。常用
byte字节类型关键字,用于定义字节类型变量。常用
casecase语句关键字,用于在switch语句中定义多个分支。常用
catch捕获异常关键字,用于捕获并处理异常。常用
char字符类型关键字,用于定义字符类型变量。常用
class类关键字,用于定义类。常用
const常量关键字,用于定义常量。常用
continue继续执行循环关键字,用于跳过当前循环的剩余语句。常用
default默认分支关键字,用于switch语句中定义默认分支。常用
do循环关键字,用于执行循环语句。常用
double双精度浮点类型关键字,用于定义双精度浮点类型变量。常用
elseelse语句关键字,用于在if-else语句中定义else分支。常用
enum枚举类型关键字,用于定义枚举类型。常用
extends继承关键字,用于定义子类。常用
final最终关键字,用于修饰类、方法、变量,表示它们不能被修改。常用
finallyfinally语句关键字,用于在try-catch-finally语句中定义finally分支。常用
float浮点类型关键字,用于定义浮点类型变量。常用
for循环关键字,用于执行循环语句。常用
goto无用关键字,用于Java 1.0时代。不常用
ifif语句关键字,用于条件判断。常用
implements实现接口关键字,用于实现接口。常用
import导入关键字,用于导入类、接口、包。常用
instanceof实例关键字,用于判断对象是否属于某个类或接口。常用
int整型类型关键字,用于定义整型类型变量。常用
interface接口关键字,用于定义接口。常用
long长整型类型关键字,用于定义长整型类型变量。常用
native本地关键字,用于定义本地方法。不常用
new创建对象关键字,用于创建对象。常用
package包关键字,用于定义包。常用

1.4 标识符

标识符是用来标识变量、类、方法、参数、常量、接口、包等名称的字母、数字、下划线和美元($)符号。但是不能以数字开头,也不能是java中的关键字。

Java标识符的命名规则:

  1. 必须以字母、美元符号或下划线开头。
  2. 不能以数字开头。
  3. 严格区分大小写。
  4. 不能使用关键字。
  5. 不能使用标点符号。

例如:

    //合法的
    String username;
    String username123;
    String user_name;
    String _name;
    String $name;

    //不合法的
    String 123name;   //数字开头
    String class;   //关键字
    String Hello World;   //标点符号 不能包含空格等特殊字符

为了增强代码的可读性和美观性,定义标识符时要遵循以下几点规范:

  1. 包名所有字母一律小写,例如:com.example.mypackage
  2. 类名、接口名、变量名、方法名都采用驼峰命名法,即首字母大写,后续每个单词的首字母大写,例如:MyClassMyInterface
  3. 常量名全部大写,单词间用下划线连接,例如:MAX_VALUE
  4. 变量名和方法名的第一个单词首字母小写,从第二个单词开始每个单词首字母大写。例如myVariablemyMethod
  5. 程序中定义标识符,尽量使用有意义的单词来表示。例如:userName表示用户名,totalCount表示统计数量等等。

2. 变量与常量

2.1 变量

变量是程序运行时可改变的量,它可以存储数据、值、表达式的结果等。

Java中变量的声明语法如下:

    数据类型 变量名 [= 初始值];   //可以开始不赋值

例如:

    int x = 18,y;
    y = x+ 3;

上述代码中,第一行定义了两个int类型的变量xy,也就相当于分配了两块内存单元。在定义变量x的同时赋值了18,而变量y并没有进行赋值。
第二行作用是为变量y赋值,在执行第二行代码时,程序首先从内存中取出变量x的值,然后进行计算后,将结果存储到变量y的内存单元中。

2.2 变量的数据类型

Java中变量的数据类型分为两种:

  • 基本数据类型:包括整数类型(byte、short、int、long)、浮点类型(float、double)、字符类型(char)、布尔类型(boolean)。
  • 引用数据类型:包括类(class)、接口(interface)、数组、枚举(enum)、注解(Annotation)。
类型名占用空间(占用的内存大小)默认值取值范围
byte1字节 8位0-128~127
short2字节 16位0-32768~32767
int4字节 32位0-2147483648~2147483647
long8字节 64位0L-9223372036854775808~9223372036854775807
float4字节 32位0.0f
double8字节 64位0.0d
char2字节 16位'\u0000'
boolean1字节 8位falsetrue、false
  1. 整型类型变量:byte(字节型)、short(短整型)、int(整型)、long(长整型)。

tip: long类型变量在赋值时,必须在数字后面加上L或l,例如:long num = 123L;

  1. 浮点类型变量:float(单精度浮点型)、double(双精度浮点型)。

tip: Java中小数会默认为double类型,如果需要使用float类型,则必须在数字后面加上f或F,例如:float num = 3.14f;使用double类型时,可以在后加上d或D,也可以不加。

  1. 字符类型变量:char。

tip: java中每个char都会占用2字节。在赋值时,要用单引号把字符括起来,也可以赋值为0~65535之间的整数。例如:

char c = 'A';  //赋值大写字母A
char c = 65;  //赋值整数65.相当于赋值字符A,参考ASCII码
  1. 布尔类型变量:boolean。

tip: boolean类型只有两个取值:true和false。

2.3 变量的类型转换

Java中变量的类型转换分为两种:

  • 自动类型转换:当运算符左右两边的数据类型不同时,Java会自动进行类型转换。
  • 强制类型转换:当运算符左右两边的数据类型不同时,可以使用强制类型转换来进行类型转换。

2.3.1 自动类型转换

Java中的自动类型转换就好比将小瓶中的水倒入大瓶中,如果小瓶的容量小于大瓶的容量,则可以把小瓶中的水倒入大瓶中,永远都不会溢出。所以在java中,将取值范围小的数据类型值赋值给取值范围大的数据类型的变量时,系统就会进行自动类型转换。例如:

    byte b = 127;
    int i = b; //自动类型转换,b的值会自动转换为int类型
    double d = i; //自动类型转换,i的值会自动转换为double类型

上述代码中,将byte类型变量b的值127赋值给int类型变量i,系统自动将b的值转换为i的类型,即b的值会自动转换为0~255的整数。然后再将i的值赋值给double类型变量d,系统自动将i的值转换为d的类型,即i的值会自动转换为0.0~1.0的浮点数。

2.3.2 强制类型转换

Java中可以使用强制类型转换来进行类型转换,相当于将大瓶中的水倒入到小瓶中,如果小瓶的容量小于大瓶的容量,则会导致溢出。同理,在java中将取值范围大的数据类型值赋值给取值范围小的数据类型的变量时,可能会造成数据的丢失,所以默认不支持在这种行为,需要我们自己去决定是否要进行强制转换。语法如下:

    数据类型 变量名 = (数据类型)值;

例如:

    int x = 18;
    //这样做时错误的,因为int的取值范围大于byte的取值范围
    byte b = x; 

    //正确的做法
    byte b = (byte)x; //强制类型转换

tip: 强制转换可能会导致数据丢失,所以在进行强制类型转换时,一定要确保数据不会丢失。例如:

    public class Demo {
        public static void main(String[] args) {
            byte a;
            int b =298;
            a = (byte)b; // 强制类型转
            System.out.println("b="+b);   //输出结果为298
            System.out.println("a="+a);   //输出结果为42
        }
    }

上述代码中,将int类型变量b的值298强制类型转换为byte类型变量a,由于b的取值范围大于a的取值范围,b为int类型,在内存中占4个字节,而byte类型的数据在内存中只占用1个字节,所以在将int类型转换为byte类型时,导致三个高位字节的数据丢失,导致a的值为42。
详细如下:

int b = 298,所以b的二进制表示为 00000000 00000000 00000001 00101010

byte a 经过强制类型转换b,获取到低8位的二进制为 00101010,这个二进制数对应的十进制数是42。由于高三位字节被舍弃,最终导致了数值的丢失。

2.4 变量的作用域

前面介绍过变量需要先定义后使用,但这并不意味在变量定义后的语句中都可以使用该变量。变量需要在它的作用范围内才可以被使用,这个作用范围称为作用域。在程序中,变量一定会被定义在某一对大括号中,大括号所包含的代码区域,就是变量的作用域。例如:

public class Demo1 {
    public static void main(String[] args) {//在这个括号里面,就是x的作用域
        int x = 18;   
        if(x > 10) {  //在这个括号里面,就是y的作用域
            int y = 20;
            System.out.println(y); // 输出结果为20
        }
        System.out.println(x); // 输出结果为18
    }
}

再看一个作用域的例子:

public class Demo2 {
    public static void main(String[] args) {
        int x = 18;  //定义变量x
        if(x > 10) {
            int y = 20;  //定义变量y
            System.out.println(x); // 访问变量x,输出结果为18

            System.out.println(y); // 访问变量y,输出结果为20
        }
        System.out.println(y); // 编译报错,因为y的作用域已经结束,不能再使用
        System.out.println(x); // 访问变量x,输出结果为18
    }
}

这个例子中,变量y的作用域在if语句中,在if语句结束后,y的作用域就结束了,所以在if语句外面不能再访问y变量。但是,x变量的作用域在整个程序中都有效,所以在if语句外面也可以访问x变量。

2.5 常量

常量是指在程序运行过程中不能被修改的变量。常量通常是指一些固定不变的值,比如圆周率、圆面积等。在Java中,常量包括整型常量,浮点型常量,字符型常量,布尔型常量。

2.5.1 整型常量

整型常量是指整数类型的值,有二进制、八进制、十进制和十六进制四种表示形式。

  1. 二进制常量:由数字0和1组成的数字序列,JDK7以后,允许使用二进制字面值表示整数,此时必须以0b或0B开头,后面跟着数字0和1,目的是为了和十进制进行区分。例如:int num1 = 0b101010;
  2. 八进制常量:以0开头的数字序列,其后跟0~7组成的数字序列,表示八进制的数值。例如:int num2 = 0123;
  3. 十进制常量:最常用的表示形式,以0~9组成的数字序列,表示十进制的数值。例如:int num3 = 123;
  4. 十六进制常量:以0x或0X开头的数字序列,其后跟09和af(或A~F)组成的数字序列,表示十六进制的数值。例如:int num4 = 0x123;

2.5.2 浮点型常量

浮点型常量是指小数类型的值,有单精度和双精度两种表示形式。

  1. 单精度浮点型常量:以小数点.分隔的数字序列,后面跟着f或F,表示单精度浮点型常量。例如:float num5 = 3.14f;
  2. 双精度浮点型常量:以小数点.分隔的数字序列,后面跟着d或D,表示双精度浮点型常量。例如:double num6 = 3.14d;

tip:如果在结尾处不加任何后缀,java虚拟机则默认为double双精度浮点数。此外,还可以使用指数形式表达,例如:

  • 3.14e2f:表示 ,即314.0。
  • 2e3f:表示 ,即2000.0。
  • 3.6d:表示3.6,默认为双精度浮点数(double类型)。
  • 0f:表示0.0,类型为单精度浮点数(float类型)。
  • 3.84d:表示3.84,默认为双精度浮点数(double类型)。
  • 5.022e+23f:表示 ,即502200000000000000000000.0。

2.5.3 字符型常量

字符型常量是指单个字符,有单引号和双引号两种表示形式。

  1. 单引号常量:单引号括起来的单个字符,例如:char c1 = 'A';
  2. 双引号常量:双引号括起来的字符串,例如:String str = "Hello World";

2.5.4 布尔型常量

布尔型常量是指只有两个取值:true和false。

2.5.5 null常量

null常量是指一个特殊的常量值,表示一个空指针。即表示对象的引用为空。

2.5.6 常量定义的语法格式

常量的定义语法非常简单,只需要在定义变量的基础上加上一个final修饰即可:

final 数据类型 常量名 [= 值];