Java语言基础

(一)Java编译运行过程

 编译期:Java源文件经过编译生成.class字节码文件
 运行期:JVM加载.class并运行.class
 特点:跨平台,一次编译到处使用(跨平台特性如下图)

(二)JVM、JRE、JDK

 JVM:(Java Virtual Machine),Java虚拟机
 JRE:(Java Runtime Environment),Java运行环境,除包含JVM外还包含运行Java程序所必须的环境,JRE = JVM + Java系统类库
 JDK:(Java Development Kit),Java开发工具包,JDK = JRE + 编译运行等命令工具

  • 说明:
    • 运行Java程序最小环境为JRE
    • 开发Java程序最小的环境为JDK

(三)变量的命名

 在程序执行过程中,其值能被改变的量称为变量,其值不能改变的量称为常量。变量与常量的命名都必须使用合法的标识符。

    变量的命名应遵循以下规则:
      -只能包含字母、数字、_和$符,并且不能以数字开头
      -严格区分大小写
      -不能使用关键字
      -允许中文命名,但不建议,建议"英文的见名知意"、"小驼峰命名法"

(四)代码注释

  通过在程序代码中添加注释可以提高程序代码的可读性和可维护性,帮助程序员更好的阅读和理解程序。Java语言提供 3 种添加注释的方法,分别为单行注释、多行注释和文档注释。

  • 单行注释
    “//”为单行注释标记,从符号“//”开始直到换行为止的所有内容均为注释而被编译器忽略。语法如下:

        //注释内容
    
        例如,以下代码为声明 int 型变量添加注释:
        int age;    //声明 int 变量用于保存年龄信息
    
  • 多行注释
    “/* */”为多行注释标记,符号“/*”与“*/”之间的所有内容均为注释内容。注释中的内容可以换行。语法如下:

      /*
      注释内容 1
      注释内容 2
      ...
      */
    
      //多行注释中可以嵌套单行注释,但是多行注释中不可以嵌套多行注释
    
  • 文档注释

    “/** */”为文档注释标记,符号“/**”与“*/”之间的所有内容均为注释内容。注释中的内容可以换行。在文档注释出现在声明(如类的声明、类的成员变量的声明、类的成员方法的声明、类的成员方法的声明等)之前时,会被Javadoc文档工具读取作为Javadoc的文档内容。文档注释的格式与多行注释的格式相同。

(五)Java数据类型

1、Java语言提供了四类八种基本数据类型:

  整数类型:byte、short、int、long
  浮点数类型:float、double
  布尔类型:boolean
  字符类型:char

2、简述java的8种基本数据类型:

byte:     字节型,用于存储整数,占用 1 个字节,范围 -128 ~ 127,默认值是 0
short:   短整型,用于存储整数,占用 2 个字节,范围 -32768 ~ 32767,默认值是 0
int:     整型,用于存储整数,占用 4 个字节,范围 -2^31 ~ 2^31-1,默认值是 0
long:    长整型,用于存储较大的整数,占用 8 个字节,范围 -2^63 ~ 2^63-1,默认值是 0L
float:    单精度浮点数,用于存储小数,占用 4 个字节,不能表示精确的值,默认值是 0.0F
double:  双精度浮点数,用于存储小数,占用 8 个字节,不能表示精确的值,默认值是 0.0D
boolean: 布尔型,用于存储 true 和 false,占用 1 个字节,默认值是 false
char:    字符型,采用 Unicode 字符集编码,用于存储单个字符,占用 2 个字节,范围 0 ~ 65535
  举个栗子:
  byte a = 100;byte b = -50;

  short s = 1000;short r = -20000;

  int a = 100000;int b = -200000;  //1)整数直接量默认为int类型,但不能超出范围,若超出范围则发生编译错误 2)两个整数相除,结果还是整数,小数位无条件舍弃 3)运算时若超出范围,则发生溢出,溢出是需要避免的

  long a = 100000L;Long b = -200000L;  //长整型直接量需要在数字后加 L 或者 l,运算时若可能溢出,建议在第一个数字后加L

  //浮点数直接量默认为double类型,若想表示float,需在数字后加F 或 f
  //double 或 float型数据参与运算时,有可能出现舍入误差,精确场合不能使用
  float f = 3.14F;   //3.14F为float型直接量

  double d = 3.14;    //3.14为浮点数直接量,默认为double型

  boolean b1 = true;boolean b2 = false;  //true 和 false 都是布尔类型的直接量

  char letter = "A";  //char类型,字符型直接量必须放到单引号里面,单引号里面必须有字符,只能有一个字符,特殊符号需要通过来转义,例如:char c = "\" 表示字符  ;

3、数据类型间的转换

  • 小到大依次为:byte-short/char-int-long-float-double
  • 自动/隐式类型转换:由小到大
  • 强制类型转换:语法(要转换成为的数据类型)变量,由大到小,强转有可能发生溢出或丢失精度
  int a = 5;
  long b = a; //自动类型转换
  int c = (int) b; //强制类型转换

  long d = 5;
  double e = 5;
  long f = 10000000000L;
  int g = (int) f;
  System.out.println(g);  //1410065408    强转有可能会内存溢出
  double h = 23.34545;
  int i = (int) h;
  System.out.println(i);  //23    强转有可能会丢失精度

  //整数直接量可以直接赋值给byte、short、char,但是不能超出范围
  //byte、short、char型的数据参与运算,系统会将其自动转换为int再运算
  byte b = 3;
  byte b1 = 5;
  byte b2 = (byte) (b + b1);
  System.out.println(b2);

  System.out.println("2" + "2");//100."2"的码50 加上 "2"的码50 ,得100

(六)Java中的运算符

  • 算数运算符:+、——、*、/、%、++、–
  • 关系运算符:>、<、>=、<=、==、!=
  • 逻辑运算符:&&、||、!
  • 赋值运算符:=、+=、-=、*=、/=、%=
  • 字符串连接符:+
  • 条件运算符:boolean ? 数1 : 数2
  算数运算符自增(++)、自减(--)使用的两种不同情况:
  单独使用时:在前在后都是会使值自增1
  被使用时:a++/a--  ————————先赋值,再运算
            ++a/--a   ————————先运算,再赋值
        
public class OperatorDemo {
    public static void main(String[] args) {
            //自增、自减运算演示

            //单独使用时,都会自增/自减1
            int a = 5, b = 10;
            a++;
            b++;
            System.out.println("a = " + a); //6
            System.out.println("b = " + b); //11

            //被使用时。运算符在前,先运算后赋值;运算符在后,先赋值后运算
            int c = 20, d = 20;
            int e = c++;
            int f = ++d;
            System.out.println("e = " + e); //20
            System.out.println("f = " + f); //21
    }
}

(七)Java中的流程控制

1、程序结构

  • 顺序结构:按照书写顺序执行的语句构成的程序段,从上往下执行,每句必走
  • 分支结构:有条件的执行不同的语句,并非每句都走
  • 循环结构:循环条件满足的情况下,反复执行一段相同或相似的代码

2、if条件语句
 主要用于告诉程序在某个条件成立的情况下执行某段语句。语法结构和执行过程如下:

1)语法:
     if(boolean){
        语句块;
      }
2)执行过程:
      判断boolean的值:
      若为true,则执行语句块(if结束)
      若为false,则if直接结束

3、if…else语句
 如果满足某种条件,就进行某种处理,否则就进行另一种处理。语法结构和执行过程如下:

1)语法:
    if(boolean){
       语句块1
    }else{
       语句块2
    }
2)执行过程:
    判断boolean的值:
    若为true,则执行语句块1(整个结束)
    若为false,则执行语句块2(整个结束)
3)说明:
    语句块1和语句块2,必走其中之一-----------2选1

4、if…else…if语句
 针对某一事物的多种情况进行处理,通常表现为“如果满足某种条件就进行某种处理,如果满足另一种条件就进行另一种处理”。语法结构和执行过程如下:

1)语法:
    if(boolean-1){
       语句块1
    }else if(boolean-2){
       语句块2
    }else if(boolean-3){
       语句块3
    }else{
       语句块4
    }
2)执行过程:
     判断boolean-1,若为true则执行语句块1(结束),若为false则
     再判断boolean-2,若为true则执行语句块2(结束),若为false则
     再判断boolean-3,若为true则执行语句块3(结束),若为false则执行语句块4(结束)
3)说明:
     语句块1/2/3/4,只能执行其中之一---------多选1

5、switch…case语句
 根据不同的值给出输出语句,实现多选一的效果。相比较而言,效率高,结构清晰,但是只能对整数判断相等。swich…case能作用在byte、short、int、char、String、枚举等类型的变量上。语法如下:

switch(用于判断的参数){
case 常量表达式1:	语句1;	break;
case 常量表达式2:	语句2;	break;
...
case 常量表达式n:	语句n;	break;
default:    语句n+1;	break;
}

6、while循环语句
 利用一个条件来控制是否要继续反复执行一个语句。先判断后执行,有可能一次也不执行。语法如下:

1)语法:
    while(boolean){
      语句块-------------反复执行的代码
    }
2)执行过程:
     先判断boolean的值,若为true则执行语句块,
     再判断boolean的值,若为true则再执行语句块,
     再判断boolean的值,若为true则再执行语句块,
     如此反复,直到boolean的值为false时,while循环结束

7、do…while循环语句
 类似于while语句。但是do…while语句是先执行再判断,语句块至少执行一次。语法如下:

语法:
    do{
       语句块-------------反复执行的代码
    }while(boolean);

8、for循环语句
 用来重复执行某条语句,知道条件得到满足(应用率最高)。语法如下:

1)语法:
  //   1     2    3
  for(要素1;要素2;要素3){
     语句块/循环体--------------反复执行的代码  4
  }
2)执行过程:
  1243243243243243...2
说明:break 和 continue 关键字的区别:
    break:跳出循环,结束整个循环,开始执行循环之后的语句。可应用在Switch和循环语句中。
    continue:跳过循环体中剩余语句,进入下一次循环,只能应用在循环中。

(八)数组

  • 数组是一种引用类型,是相同数据类型元素的集合
   //声明整型数组arr,包含10个元素,每个元素都是int类型,默认值为0
   int[] arr = new int[10];
  • 初始化:—-初始化数组中的数据
   int[] arr = new int[3]; 
   int[] arr = {1,4,7}; 
   int[] arr = new int[]{1,4,7}; 
   int[] arr;
   //arr = {1,4,7}; //编译错误,此方式只能声明同时初始化
   arr = new int[]{1,4,7}; //正确
  • 访问:—-访问的是数组中的元素
    通过(数组名.length)可以获取数组的长度(元素个数)
   int[] arr = new int[3];
   System.out.println(arr.length); //3
  • 通过下标/索引来访问数组中的元素,下标从0开始,最大到(数组长度-1)
   int[] arr = new int[3];
   System.out.println(arr[0]); //0,输出第1个元素的值
   arr[0] = 100; //给第1个元素赋值为100
   arr[1] = 200; //给第2个元素赋值为200
   arr[2] = 300; //给第3个元素赋值为300
   //arr[3] = 400; //运行时会发生数组下标越界异常
   System.out.println(arr[arr.length-1]); //300,输出最后一个元素的值
  • 数组的遍历/迭代:从头到尾挨个走一遍
    int[] arr = new int[10];
    for(int i=0;i<arr.length;i++){ //遍历arr数组
      arr[i] = (int)(Math.random()*100); //给每个元素赋值为0到99之间的随机数
      System.out.println(arr[i]); //输出每个元素的值
      //arr[i]:代表的是arr中的每一个元素
    }
  • 数组的复制
    System.arraycopy(a,1,b,0,4);
    int[] a = {10,20,30,40,50};
    int[] b = new int[6]; //0,0,0,0,0,0
    //a:源数组
    //1:源数组的起始下标
    //b:目标数组
    //0:目标数组的起始下标
    //4:要复制的元素个数
    System.arraycopy(a,1,b,0,4); //灵活性好
    for(int i=0;i<b.length;i++){
        System.out.println(b[i]);
    }
  • 数组的扩容
    int[] b = Arrays.copyOf(a,6);
    a = Arrays.copyOf(a,a.length+1);
    //数组的扩容
    int[] a = {10,20,30,40,50};
    //数组的扩容(创建了一个更大的新的数组,并将数据复制进去了)
    a = Arrays.copyOf(a,a.length+1);
    for(int i=0;i<a.length;i++){
        System.out.println(a[i]);
    }
  • 数组的排序: Arrays.sort(arr);
    int[] arr = new int[10];
    for(int i=0;i<arr.length;i++){
        arr[i] = (int)(Math.random()*100);
        System.out.println(arr[i]);
    }
    Arrays.sort(arr); //对arr进行升序排列
    System.out.println("排序后:");
    for(int i=0;i<arr.length;i++){  
        System.out.println(arr[i]);
    }
hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » Java语言基础