Java基础语法 - Go语言中文社区

Java基础语法


关键字

  • 关键字概述
    • 被Java语言赋予特定含义的单词
  • 关键字特点
    • 组成关键字的字母全部小写
  • 关键字注意事项
    • goto和const作为保留字存在,目前并不使用
    • 类似Notepad++这样的高级记事本,针对关键字有特殊的颜色标记,非常直观
      这里写图片描述
      这里写图片描述

标识符

  • 标识符概述
    • 就是给类,接口,方法,变量等起名字时使用的字符序列
  • 组成规则
    • 英文大小写字母
    • 数字字符
    • $和_
  • 注意事项
    • 不能以数字开头
    • 不能是Java中的关键字
    • 区分大小写

常见命名规则

  • 包(其实就是文件夹,用于解决相同类名问题)

单级和多级分别举例
包:liuyi,cn.itcast
- 类或者接口

一个单词和和多个单词分别举例
类或者接口:Student,HelloWorld

  • 方法和变量

一个单词和和多个单词分别举例
方法和变量:name,main,studentName
- 常量

一个单词和和多个单词分别举例
常量:MAX,STUDENT_MAX_AGE

注释

  • 注释概述
    • 用于解释说明程序的文字
  • Java中注释分类格式
    • 单行注释
格式: //注释文字
  • 多行注释
格式: /*  注释文字  */
  • 文档注释
格式:/** 注释文字 */

注意:
1:对于单行和多行注释,被注释的文字,不会被JVM(java虚拟机)解释执行。
2:对于文档注释,是java特有的注释,其中注释内容可以被JDK提供的工具 javadoc 所解析,
生成一套以网页文件形式体现的该程序的说明文档。

注释的好处

  • 注释是一个程序员必须要具有的良好编程习惯。
  • 初学者编写程序可以养成习惯:先写注释再写代码。
  • 将自己的思想通过注释先整理出来,在用代码去体现。
  • 因为代码仅仅是思想的一种体现形式而已。
  • 解释说明程序,提高程序的阅读性
  • 可以帮助我们排错

常量

  • 常量概述
    • 在程序执行的过程中其值不可以发生改变
  • Java中常量分类

    • 字面值常量
    • 自定义常量
  • 字符串常量 用双引号括起来的内容

  • 整数常量 所有整数

    12,23

  • 小数常量 所有小数

    12.34,56.78

  • 字符常量 用单引号括起来的内容

    ‘a’,’A’,’0’

  • 布尔常量 较为特有,只有true和false

  • 空常量 null

  • Java针对整数常量提供了4种表现形式

    二进制
    八进制
    十进制
    十六进制

  • 进制概述

    进制:就是进位制,是人们规定的一种进位方法。 对于任何一种进制–X进制,就表示某一位置上的数运算时是逢X进一位。二进制就是逢二进一,八进制是逢八进一,十进制是逢十进一,十六进制是逢十六进一。

变量

  • 变量概述

    在程序执行的过程中,在某个范围内其值可以发生改变的量
    理解:如同数学中的未知数

  • 变量定义格式

    数据类型 变量名 = 初始化值;
    注意:格式是固定的,记住格式,以不变应万变

注意:
1:从本质上讲,变量其实是内存中的一小块区域,使用变量名来访问这块区域,因此,每一个变量使用前必须要先申请(声明),然后必须进行赋值(填充内容),才能使用。
变量的组成部分:数据类型,变量名,变量值
2:为什么要定义变量呢
用来不断的存放同一类型的常量,并可以重复使用

数据类型

Java语言是强类型语言,对于每一种数据都定义了明确的具体数据类型,在内存总分配了不同大小的内存空间
这里写图片描述

这里写图片描述
注意:
Java 各整数类型有固定的表数范围和字段长度,其不受具体操作系统的影响,以保证Java程序的可移植性。
Java语言的整型常量默认为int型,声明long型常量可以后加‘ l ’或‘ L ’ ,如:

    int i1 = 600; //正确     
    long l1 = 88888888888L; //必须加l否则会出错

与整数类型类似,Java浮点类型有固定的表数范围和字段长度,不受平台影响。
Java 浮点类型常量有两种表示形式
十进制数形式,如: 3.14 314.0
科学记数法形式,如 3.14e2 3.14*10^2
Java 浮点型常量默认为 double 型,如要声明一个常量为 float 型,则需在数字后面加 f 或 F ,如:

double d = 12345.6; //正确   
float f = 12.3f; //必须加f否则会出错

char 型数据用来表示通常意义上的“字符”
字符常量为用单引号括起来的单个字符,例如:

char ch1= 'a'; char ch2='中';

Java 字符采用 Unicode 编码,每个字符占两个字节,因而可用十六进制编码形式表示。注:Unicode是全球语言统一编码

boolean 类型适于逻辑运算,一般用于程序流程控制 。
boolean 类型数据只允许取值 true 或 false ,不可以 0 或非 0 的整数替代 true 和 false ,这点和C语言不同。

使用变量注意事项

  • 作用域

    变量定义在哪一级大括号中,哪个大括号的范围就是这个变量的作用域。相同的作用域中不能定义两个同名变量。

  • 初始化值

    没有初始化值不能直接使用

  • 在一行上建议只定义一个变量

    可以定义多个,但是不建议

    一行定义多个变量的两种情况:

    int x = 10;int y = 20;

    int x,y;
    x = 10;
    y = 20;
  • +是一个运算符, 我们应该能够看懂,做数据的加法。
  • boolean类型不能转换为其他的数据类型
  • 默认转换

    byte,short,char—int—long—float—double
    byte,short,char相互之间补转换,他们参与运算首先转换为int类型

  • 强制转换

    目标类型 变量名=(目标类型)(被转换的数据);

1:案例演示隐式转换

    byte b = 10;
    int i = 100;
    System.out.println(b+i);

    //有问题
    byte bb = b + i;
    System.out.println(bb);

    //没有问题
    int j = b + i;
    System.out.println(j);

这里写图片描述

2:刚才上面的那个例子不可以,但是,我们明明知道它就是在这个范围内,我就想赋值,怎么办?
用强制转换
目标数据类型 变量名 = (目标数据类型)(被转换的数据);
这里写图片描述
3:那么,我们到底用那种转换呢?
一般建议,最好不要随意使用强制类型转换,容易造成数据精度的损失。
(1)容量大的数据类型转换为容量小的数据类型时,要加上强制转换符,但可能造成精度降低或溢出;使用时要格外注意。
(2)有多种类型的数据混合运算时,系统首先自动的将所有数据转换成容量最大的那一种数据类型,然后再进行计算。

【面试题】

byte b1=3,b2=4,b;
b=b1+b2;
b=3+4;

哪句是编译失败的呢?为什么呢?
这里写图片描述
b=3+4 ,3和4都是常量,所以java在编译时期会检查该常量的和是否超出byte类型的范围。如果没有可以赋值。
b=b1+b2不可以,是因为b1和b2是变量,因为变量的值会变化,不确定具体的值,所以默认使用int类型进行存储。

【思考题】
byte b = 130;有没有问题?如果我想让赋值正确,可以怎么做?结果是多少呢?
这里写图片描述
原因:因为byte的范围是:-128到127。 而130不在此范围内,所以报错。
我们可以使用强制类型转换 :
这里写图片描述
结果为-126,为什么?

数据130默认是int类型的十进制数据
第一步十进制的130转换成二进制数据
1 0 0 0 0 0 1 0
第二步130int类型是占4个字节的,所以在内存的表现形式是
00000000  00000000  00000000  10000010
做了截取后的结果为
10000010
通过观察最高位符号位是1,这是一个负数,因为在计算机中所有的数据都是以补码的形式出现的所以要算它的补码
原码:1 0000010    原码变反码,最高位符号位不变,其他数值位10,01得反码
反码:1 1111101    反码变补码就是反码加1得
补码;1 1111110
最终的看到的结果就是
1     1111110最高为是符号位不运算,数值为转化为十进制是64+32+16+8+4+2=126符号位负
所以为-126

请写出下列程序结果

    System.out.println('a');
    System.out.println('a'+1);

    System.out.println("hello"+'a'+1);
    System.out.println('a'+1+"hello");
    System.out.println("5+5="+5+5);
    System.out.println(5+5+"=5+5");

结果:
这里写图片描述
注意:
1:在这里引入ASCII码表
2:任何数据和字符串进行操作,结果都是字符串类型。但是要注意运算的顺序。

运算符

  • 算术运算符
  • 赋值运算符
  • 比较运算符
  • 逻辑运算符
  • 位运算符
  • 三目运算符

1:运算
对常量和变量进行操作的过程称为运算。
2:运算符
对常量和变量进行操作的符号称为运算符
3:操作数
参与运算的数据称为操作数
4:用运算符把常量或者变量连接起来符号java语法的式子就可以称为表达式。
不同运算符连接的式子体现的是不同类型的表达式。

举例:

int a = 3 + 4;

这是做了一个加法运算
+就是运算符,是算术运算符,我们还有其他很多的运算符
3,4就是参与运算的操作数据
3 + 4整体其实就是一个算数表达式

算术运算符

这里写图片描述

  • +,-,*,/都是比较简单的操作,简单演示即可
  • +的几种作用:

    加法
    正数
    字符串连接符

  • 除法的时候要注意一个问题:

    整数相除,只能得到整数
    要想得到小数,可以*1.0

  • /和%的区别

  • ++和–的应用

    单独使用效果相同
    参与运算使用,在操作数的前后效果不同

1:基本小题目

        int a = 10;
        int b = 10;
        int c = 10;

        a = b++;
        c = --a;
        b = ++a;
        a = c--;
        System.out.println(a);
        System.out.println(b);
        System.out.println(c);

请分别计算出a,b,c的值
这里写图片描述

2:比较复杂的题目

        int a = 4;
        int b = (a++)+(++a)+(a*10);
        System.out.println(b);

结果:70

赋值运算符

  • 符号:

= , +=, -=, *=, /=, %=
=为基本的赋值运算符,其他的为扩展的赋值运算符

  • 如下操作写出结果
int a,b; 
a = b = 10;
System.out.println(a); 
System.out.println(b);

这里写图片描述

int a = 10; a += 20; 
System.out.println(a); 

这里写图片描述
+=加赋值
把左边和右边的结果赋值给左边。
注意:左边不能是常量

【面试题】

short s=1; 
s = s+1; 
short s=1;
s+=1;

上面两个代码有没有问题,如果有,那里有问题?
这里写图片描述
这里写图片描述
通过面试题引出+=运算符的特点:
有一个隐含的默认转换功能。
实际上等价于:

short s = 1;
s+=1等价于
s=(s的数据类型)(s+1);

关系运算符

这里写图片描述
注意:

  • 比较运算符的结果都是boolean型,也就是要么是true,要么是false。
  • 比较运算符“==”不能误写成“=” 。

逻辑运算符

这里写图片描述

  • 逻辑运算符用于连接布尔型表达式,在Java中不可以写成3<x<6,应该写成x>3 & x<6
  • “&”和“&&”的区别:

    单&时,左边无论真假,右边都进行运算;
    双&时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。
    “|”和“||”的区别同理,双或时,左边为真,右边不参与运算。

  • 异或( ^ )与或( | )的不同之处是:当左右都为true时,结果为false。

注意:
&:有false则false
|:有true则true
^:相同false,不同true
!:非false则true,非true则false

&&,||和&以及|的区别
结果相同,但是有短路效果,一般建议使用&&,||

    int x = 3;int y =4;
    System.out.println((x++ > 4) & (y++ > 5));
    System.out.println(x);
    System.out.println(y);

    System.out.println((x++ > 4) && (y++ > 5));
    System.out.println(x);
    System.out.println(y);

这里写图片描述

位运算符

这里写图片描述

<<:就是将左边的操作数在内存中的二进制数据左移右边操作数指定的位数,右边被移空的部分补0。相当于乘与2的倍数
>>:右移稍微复杂一点,如果最高位是0,左边被移空的位就填入0;如果最高位是1,左边被移空的位就填入1。相当于除以2的倍数
>>>:无论最高位是1还是0,左边被移空的高位都填入0。

看结果:总结相当于乘以或者除以2的多少次幂。

System.out.println(3 << 2);

System.out.println(24 >> 2);
System.out.println(24 >>> 2);

System.out.println(-24 >> 2);
System.out.println(-24 >>> 2);

这里写图片描述

这里写图片描述

三目运算符

  • 格式

    (关系表达式)?表达式1:表达式2;
    如果条件为true,运算后的结果是表达式1;
    如果条件为false,运算后的结果是表达式2;

  • 示例:
    获取两个数中大数。

int x=3,y=4,z;
z = (x>y)?x:y;//z变量存储的就是两个数的大数。

键盘录入数据

  • 键盘录入数据概述

    我们目前在写程序的时候,数据值都是固定的,但是实际开发中,数据值肯定是变化的,所以,我准备把数据改进为键盘录入,提高程序的灵活性。

  • 如何实现键盘录入数据呢?

    导包(位置放到class定义的上面)

    import java.util.Scanner;

    创建对象

    Scanner sc = new Scanner(System.in);

    接收数据

    int x = sc.nextInt();

流程控制语句

  • 在一个程序执行的过程中,各条语句的执行顺序对程序的结果是有直接影响的。也就是说程序的流程对运行结果有直接的影响。所以,我们必须清楚每条语句的执行流程。而且,很多时候我们要通过控制语句的执行顺序来实现我们要完成的功能。

  • 流程控制语句分类

    顺序结构
    选择结构
    循环结构

顺序结构

  • 顺序结构概述

    是程序中最简单最基本的流程控制,没有特定的语法结构,按照代码的先后顺序,依次执行,程序中大多数的代码都是这样执行的。
    总的来说:写在前面的先执行,写在后面的后执行

  • 顺序结构图

这里写图片描述

选择结构

  • 选择结构

    • 也被称为分支结构。
    • 选择结构有特定的语法规则,代码要执行具体的逻辑运算进行判断,逻辑运算的结果有两个,所以产生选择,按照不同的选择执行不同的代码。
    • Java语言提供了两种选择结构语句

      if语句
      switch语句

选择结构(if语句)

  • if语句有三种格式

  • if语句第一种格式:

    if(关系表达式) {
                 语句体
        }
  • 执行流程

    首先判断关系表达式看其结果是true还是false
    如果是true就执行语句体
    如果是false就不执行语句体

  • if图1

这里写图片描述

  • 注意事项

    关系表达式无论简单还是复杂,结果必须是boolean类型
    if语句控制的语句体如果是一条语句,大括号可以省略;如果是多条语句,就不能省略。建议永远不要省略。
    一般来说:有左大括号就没有分号,有分号就没有左大括号

  • if语句第二种格式:

    if(关系表达式) {
                 语句体1;
        }else {
                 语句体2;
        }
  • 执行流程

    首先判断关系表达式看其结果是true还是false
    如果是true就执行语句体1
    如果是false就执行语句体2

  • if图2
    这里写图片描述

  • 我们前面讲解过三元运算符,它根据比较判断后,给出的也是两个结果,所以,这种情况和if语句的第二种格式很相似,他们在某些情况下应该是可以相互转换的。

  • if语句第二种格式和三元运算符

    三元运算符的操作都可以使用if语句改进,反之不成立
    什么时候不成立呢?
    当if语句控制的语句体是一条输出语句的时候,就不成立。因为三元运算符是一个运算符,必须要求有一个结果返回。而输出语句却不能作为一个返回结果。

  • if语句第三种格式:

    if(关系表达式1) {
                 语句体1;
        }else  if (关系表达式2) {
                 语句体2;
        }else {
                 语句体n+1;
        }
  • 执行流程

    首先判断关系表达式1看其结果是true还是false
    如果是true就执行语句体1
    如果是false就继续判断关系表达式2看其结果是true还是false
    如果是true就执行语句体2
    如果是false就继续判断关系表达式…看其结果是true还是false

    如果没有任何关系表达式为true,就执行语句体n+1。

  • if图3
    这里写图片描述

选择结构(switch语句)

  • switch语句格式:

    switch(表达式) {
              case1:
                语句体1;
                break;
                case2:
                语句体2;
                break;
                …
                default:    
                语句体n+1;
                break;
        }
  • 格式解释

    • switch表示这是switch语句

      表达式的取值:byte,short,int,char
      JDK5以后可以是枚举
      JDK7以后可以是String

    • case后面跟的是要和表达式进行比较的值

    • 语句体部分可以是一条或多条语句

    • break表示中断,结束的意思,可以结束switch语句

    • default语句表示所有情况都不匹配的时候,就执行该处的内容,和if语句的else相似。

  • 执行流程

    首先计算出表达式的值
    其次,和case依次比较,一旦有对应的值,就会执行相应的语句,在执行的过程中,遇到break就会结束。
    最后,如果所有的case都和表达式的值不匹配,就会执行default语句体部分,然后程序结束掉。

  • switch语句图
    这里写图片描述

  • 注意事项

    • case后面只能是常量,不能是变量,而且,多个case后面的值不能出现相同的

    • default可以省略吗?

      可以省略。一般不建议。除非判断的值是固定的。(单选题)

    • break可以省略吗?

      可以省略,一般不建议。否则结果可能不是你想要的

    • default的位置一定要在最后吗?

      可以出现在switch语句任意位置。

    • switch语句的结束条件

      遇到break
      执行到程序的末尾

循环结构

  • 循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体语句,当反复执行这个循环体时,需要在合适的时候把循环判断条件修改为false,从而结束循环,否则循环将一直执行下去,形成死循环。

  • 循环语句的组成

    初始化语句:
    一条或者多条语句,这些语句完成一些初始化操作。
    判断条件语句:
    这是一个boolean 表达式,这个表达式能决定是否执行循环体。
    循环体语句:
    这个部分是循环体语句,也就是我们要多次做的事情。
    控制条件语句:
    这个部分在一次循环体结束后,下一次循环判断条件执行前执行。通过用于控制循环条件中的变量,使得循环在合适的时候结束。

循环结构(for循环语句)

  • for循环语句格式:

    for(初始化语句;判断条件语句;控制条件语句) {
             循环体语句;
        }
  • 执行流程

    A:执行初始化语句
    B:执行判断条件语句,看其结果是true还是false
    如果是false,循环结束。
    如果是true,继续执行。
    C:执行循环体语句
    D:执行控制条件语句
    E:回到B继续

  • for循环语句图
    这里写图片描述

  • 注意事项

    判断条件语句的结果是一个boolean类型
    循环体语句如果是一条语句,大括号可以省略;如果是多条语句,大括号不能省略。建议永远不要省略。
    一般来说:有左大括号就没有分号,有分号就没有左大括号

循环结构(while循环语句)

  • while循环语句格式:

    基本格式

     while(判断条件语句) {
             循环体语句;
       }

    扩展格式

      初始化语句;
      while(判断条件语句) {
             循环体语句;
             控制条件语句;
        }
  • while循环语句格式图
    这里写图片描述

循环结构(for循环和while循环的区别)

  • for循环语句和while循环语句可以等价转换,但还是有些小区别的

    • 使用区别:控制条件语句所控制的那个变量,在for循环结束后,就不能再被访问到了,而while循环结束还可以继续使用,如果你想继续使用,就用while,否则推荐使用for。原因是for循环结束,该变量就从内存中消失,能够提高内存的使用效率。
    • 场景区别:

      for循环适合针对一个范围判断进行操作
      while循环适合判断次数不明确操作

循环结构(do…while循环语句)

  • do…while循环语句格式:

    基本格式

       do {
             循环体语句;
       }while((判断条件语句);

    扩展格式

      初始化语句;
       do {
             循环体语句;
             控制条件语句;
        } while((判断条件语句);
  • do…while循环语句图:
    这里写图片描述

循环结构(区别及注意事项)

  • 三种循环语句其实都可以完成一样的功能,也就是说可以等价转换,但还是有小区别的:

    do…while循环至少会执行一次循环体。
    for循环和while循环只有在条件成立的时候才会去执行循环体

  • 注意事项:

    写程序优先考虑for循环,再考虑while循环,最后考虑do…while循环。
    如下代码是死循环

        while(true){}
        for(;;){}

跳转控制语句

  • 前面我们已经说过了,Java中的goto是保留字,目前不能使用。虽然没有goto语句可以增强程序的安全性,但是也带来很多不便,比如说,我想在某个循环知道到某一步的时候就结束,现在就做不了这件事情。为了弥补这个缺陷,Java就提供了break,continue和return来实现控制语句的跳转和中断。
  • break 中断
  • continue 继续
  • return 返回

跳转控制语句(break)

  • break的使用场景:

    在选择结构switch语句中
    在循环语句中
    离开使用场景的存在是没有意义的

  • break的作用:

    跳出单层循环
    跳出多层循环

        带标签的跳出
        格式:标签名: 循环语句
        标签名要符合Java的命名规则
    

跳转控制语句(continue)

  • continue的使用场景:

    在循环语句中
    离开使用场景的存在是没有意义的

  • continue的作用:

    单层循环对比break,然后总结两个的区别

    break  退出当前循环
    continue  退出本次循环
    

    也可以带标签的使用

跳转控制语句(return)

  • return关键字不是为了跳转出循环体,更常用的功能是结束一个方法,也就是退出一个方法。跳转到上层调用的方法。

方法概述

  • 方法概述

    假设有一个游戏程序,程序在运行过程中,要不断地发射炮弹(植物大战僵尸)。发射炮弹的动作需要编写100行的代码,在每次实现发射炮弹的地方都需要重复地编写这100行代码,这样程序会变得很臃肿,可读性也非常差。为了解决代码重复编写的问题,可以将发射炮弹的代码提取出来放在一个{}中,并为这段代码起个名字,这样在每次发射炮弹的地方通过这个名字来调用发射炮弹的代码就可以了。上述过程中,所提取出来的代码可以被看作是程序中定义的一个方法,程序在需要发射炮弹时调用该方法即可。

方法定义及格式

  • 简单的说:方法就是完成特定功能的代码块

    在很多语言里面都有函数的定义
    函数在Java中被称为方法

  • 格式:

    修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2…) {
                函数体;
                return 返回值;
        }

方法格式的解释说明

  • 方法格式解释

    修饰符 比较多,后面会详细介绍。目前public static
    返回值类型 用于限定返回值的数据类型
    方法名 一个名称,为了方便我们调用方法
    参数类型 限定调用方法时传入参数的数据类型
    参数名 是一个变量,接收调用方法时传入的参数
    方法体 完成功能的代码
    return 结束方法以及返回方法指定类型的值
    返回值 程序被return带回的结果,返回给调用者

有明确返回值的方法调用

  • 有明确返回值的方法调用:

    单独调用,没有意义
    输出调用,有意义,但是不够好,因为我不一定非要把结果输出
    赋值调用,推荐方式

方法注意事项

  • 方法不调用不执行

  • 方法与方法是平级关系,不能嵌套定义

  • 方法定义的时候参数之间用逗号隔开

  • 方法调用的时候不用在传递数据类型

  • 如果方法有明确的返回值,一定要有return带回一个值

没有明确返回值的方法调用

  • 没有明确返回值的函数调用:

    其实就是void类型方法的调用
    只能单独调用

方法重载

  • 方法重载概述

    在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同即可。

  • 方法重载特点

    与返回值类型无关,只看方法名和参数列表
    在调用时,虚拟机通过参数列表的不同来区分同名方法

数组概述

  • 数组概述

    需求:现在需要统计某公司员工的工资情况,例如计算平均工资、找到最高工资等。假设该公司有80名员工,用前面所学的知识,程序首先需要声明80个变量来分别记住每位员工的工资,然后在进行操作,这样做会显得很麻烦。为了解决这种问题,Java就提供了数组供我们使用。
    那么数组到底是什么呢?有什么特点呢?通过上面的分析:我们可以得到如下两句话:

    • 数组是存储多个变量(元素)的东西(容器)

    • 这多个变量的数据类型要一致

  • 数组是存储同一种数据类型多个元素的集合。也可以看成是一个容器。

  • 数组既可以存储基本数据类型,也可以存储引用数据类型。

  • 数组的定义格式

    格式1:数据类型[] 数组名;
    格式2:数据类型 数组名[];
    【注意】:
    1:针对数组定义两种格式,推荐使用第一种格式。因为第一种的可读性更强。
    第二种可以早期的时候确实有很多人这样用。不过,现在这样用的人越来越少了。
    2:作为Java的粉丝C#(Java的模仿者)就不再支持第二种语法格式了。越来越多的语言可能会抛弃第二种格式。

注意:这两种定义做完了,数组中是没有元素值的。如何对数组的元素进行初始化呢?

数组的初始化

  • 数组初始化概述:

    Java中的数组必须先初始化,然后才能使用。
    所谓初始化:就是为数组中的数组元素分配内存空间,并为每个数组元素赋值。

  • 数组的初始化方式

    动态初始化:初始化时只指定数组长度,由系统为数组分配初始值。
    静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度。

  • 动态初始化:初始化时只指定数组长度,由系统为数组分配初始值。

    格式:数据类型[] 数组名 = new 数据类型[数组长度];
    数组长度其实就是数组中元素的个数。
    举例:

        int[] arr = new int[3];

    解释:定义了一个int类型的数组,这个数组中可以存放3个int类型的值。

  • 静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度。

    格式:
    数据类型[] 数组名 = new 数据类型[]{元素1,元素2,…};
    举例:

        int[] arr = new int[]{1,2,3};

    解释:定义了一个int类型的数组,这个数组中可以存放3个int类型的值,并且值分别是1,2,3。
    其实这种写法还有一个简化的写法

        int[] arr = {1,2,3};

    注意:
    但是一定要注意不能同时进行动态初始化和静态初始化。
    什么意思呢,就是不能在给定数组长度的同时给出元素。

数组操作常见的两个小问题

  • 数组索引越界

    ArrayIndexOutOfBoundsException
    访问到了数组中的不存在的索引时发生。

  • 空指针异常

    NullPointerException
    数组引用没有指向实体,却在操作实体中的元素时

Java中的内存分配

Java 程序在运行时,需要在内存中的分配空间。为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。

  • 栈 存储局部变量

  • 堆 存储new出来的东西

  • 方法区

  • 本地方法区 (和系统相关)

  • 寄存器 (给CPU使用)

二维数组概述

  • 二维数组概述

    每个班有很多个学生,所以,可以用数组来存储,而我们又同时有很多个Java基础班。这个也应该用一个数组来存储。如何来表示这样的数据呢?Java就提供了二维数组供我们使用。
    由此可见:其实二维数组其实就是一个元素为一维数组的数组。

二维数组定义格式

  • 格式1

    数据类型[][] 变量名 = new 数据类型[m][n];
    m表示这个二维数组有多少个一维数组
    n表示每一个一维数组的元素个数

  • 举例:

    int[][] arr = new int[3][2];

    定义了一个二维数组arr
    这个二维数组有3个一维数组,名称是arr[0],arr[1],arr[2]
    每个一维数组有2个元素,可以通过arr[m][n]来获取
    表示获取第m+1个一维数组的第n+1个元素

【注意】
针对格式1其实还可以

    int arr[][];
    int[] arr[];

但是都不建议。

这个时候提醒大家注意一个问题

int[] x,y[];

这种定义x是一个一维数组。
y是一个二维数组。

  • 格式2

    数据类型[][] 变量名 = new 数据类型[m][];
    m表示这个二维数组有多少个一维数组
    这一次没有直接给出一维数组的元素个数,可以动态的给出。

  • 举例:

    int[][] arr = new int[3][];
    arr[0] = new int[2];
    arr[1] = new int[3]
    arr[2] = new int[1];
  • 格式3

    数据类型[][] 变量名 = new 数据类型[][]{{元素…},{元素…},{元素…}};

  • 简化版格式:

    数据类型[][] 变量名 = {{元素…},{元素…},{元素…}};

  • 举例:

        int[][] arr =  {{1,2,3},{4,6},{6}};
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/cckevincyh/article/details/80806946
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2021-05-29 20:20:12
  • 阅读 ( 807 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢