Java基础语法(二)

1.数组

1.1一维数组

  • 定义格式:

数据类型[] 数组名 = new 数据类型[元素个数或数组长度];

    int[] x = new int[100]; //定义了100个int类型的变量
    等价于
    int[] x;              // 声明一个int[]类型的变量
    x = new int[100];   // 创建一个长度为100的数组
  • 数组赋值
 public class ArrayDemo02 {
    public static void main(String[] args) {
        int[] arr = new int[4]; // 定义可以存储4个整数的数组
        arr[0] = 1; // 为第1个元素赋值1
        arr[1] = 2; // 为第2个元素赋值2
        // 下面的代码是打印数组中每个元素的值
        System.out.println("arr[0]=" + arr[0]);
        System.out.println("arr[1]=" + arr[1]);
        System.out.println("arr[2]=" + arr[2]);
        System.out.println("arr[3]=" + arr[3]);
    }
 }

在上述代码中,第3行代码定义了一个数组,此时数组中每个元素都为默认初始值0。第2、3行代码通过赋值语句将数组中的元素arr[0]和arr[1]分别赋值为1和2,而元素arr[2]和arr[3]没有赋值,其值仍为0,因此打印结果中四个元素的值依次为1、2、0、0。
在定义数组时只指定数组的长度,由系统自动为元素赋初值的方式称作动态初始化
在初始化数组时还有一种方式叫做静态初始化

public class ArrayDemo03 {
        public static void main(String[] args) {
            int[] arr = { 1, 2, 3, 4 }; // 静态初始化
            // 下面的代码是依次访问数组中的元素
            System.out.println("arr[0] = " + arr[0]);
            System.out.println("arr[1] = " + arr[1]);
            System.out.println("arr[2] = " + arr[2]);
            System.out.println("arr[3] = " + arr[3]);
        }
    }

第3行代码千万不可写成int[] arr = new int[4]{1,2,3,4};,这样写编译器会报错。原因在于编译器会认为数组限定的元素个数[4]与实际存储的元素{1,2,3,4}个数有可能不一致,存在一定的安全隐患。

  • 数组遍历
    1.for循环遍历
public class ArrayDemo04 {
   public static void main(String[] args) {
       int[] arr = { 1, 2, 3, 4, 5 }; // 定义数组
       // 使用for循环遍历数组的元素
       for (int i = 0; i < arr.length; i++) {
           System.out.println(arr[i]); // 通过索引访问元素
       }
   }
}
  • 获取数组的最值
public class ArrayDemo05 {
    public static void main(String[] args) {
        int[] arr = { 4, 1, 6, 3, 9, 8 }; // 定义一个数组
int max = arr[0]; // 定义变量max用于记住最大数,首先假设第一个元素为最大值
        // 下面通过一个for循环遍历数组中的元素
        for (int x = 1; x < arr.length; x++) {
            if (arr[x] > max) { // 比较 arr[x]的值是否大于max
                max = arr[x]; // 条件成立,将arr[x]的值赋给max
            }
        }
        System.out.println("max=" + max); // 打印最大值
    }
}
  • 空指针异常
    在使用变量引用一个数组时,变量必须指向一个有效的数组对象,如果该变量的值为null,则意味着没有指向任何数组,此时通过该变量访问数组的元素会出现空指针异常
 1  public class ArrayDemo07 {
 2      public static void main(String[] args) {
 3          int[] arr = new int[3]; // 定义一个长度为3的数组
 4          arr[0] = 5; // 为数组的第一个元素赋值
 5          System.out.println("arr[0]=" + arr[0]); // 访问数组的元素
 6          arr = null; // 将变量arr置为null
 7          System.out.println("arr[0]=" + arr[0]); // 访问数组的元素
 8      }
 9  }

当第7行代码再次访问数组时就出现了空指针异常NullPointerException

1.2 二维数组

  • 定义格式

1.第一种方式:

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

2.第二种方式:

int[][] arr = new int [3][];
arr[0] = new int[] {1,2};
arr[1] = new int[] {3,4,5};
arr[2] = new int[] {6,,7,8,9};
shuzu2.png

3.第三种方式

int[][] arr = {{1,2},{3,4,5},{7,8,9}};
  • 访问二维数组
arr[0][1];
  • demo1
class ArrayDemo08 {
    public static void main(String[] args){
    
        //定义二维数组的方式
        int[][] arr = new int[3][4];
    
        System.out.println( arr ); //输出地址
        System.out.println("二维数组的长度: " + arr.length);
        //获取二维数组的3个元素
        System.out.println( arr[0] ); //输出地址
        System.out.println( arr[1] ); //输出地址
        System.out.println( arr[2] ); //输出地址
        
        System.out.println("打印第一个一维数组的元素值");
        System.out.println( arr[0][0] );
        System.out.println( arr[0][1] );//访问的为二维数组中第1个一维数组的第2个元素
        System.out.println( arr[0][2] );
        System.out.println( arr[0][3] );
        
        System.out.println("打印第二个一维数组的元素值");
        System.out.println( arr[1][0] );
        System.out.println( arr[1][1] );
        System.out.println( arr[1][2] );
        System.out.println( arr[1][3] );
        
        System.out.println("打印第三个一维数组的元素值");
        System.out.println( arr[2][0] );
        System.out.println( arr[2][1] );
        System.out.println( arr[2][2] );
        System.out.println( arr[2][3] );
    }
}
  • 一维数组、二维数组元素遍历和数组元素累加和
public class Person {
    public static void main(String[] args) {
        //一维数组的求累加和、遍历
        int[] arr1 = {10,20,30,40,50};
        int sum = 0;
        for(int i = 0; i < arr1.length; i++){
            sum += arr1[i];
        }
        System.out.println(sum);
        
        
        //二维数组的求和、遍历
        int[][] arr2 = {{1,2},{3,4,5},{6,7,8,9,10}};
        int sum2 = 0;
        for(int i = 0; i < arr2.length; i++){
            for(int j = 0; j < arr2[i].length; j++){
                sum2 += arr2[i][j];
            }
        }
        System.out.println(sum2);
    }
}
  • demo2
public class Demo2 {
    public static void main(String[] args) {
        int[][] arr = new int[3][];
        arr[0] = new int[] {11,22,33};
        arr[1] = new int[] {21,22,34};
        arr[2] = new int[] {44,55,66};
        
        int sum = 0;
        for(int i = 0; i < arr.length; i++){
            int groupSum = 0;
            for(int j = 0; j < arr[i].length; j++){
                groupSum += arr[i][j];
            }
            sum += groupSum;
            System.out.println(groupSum);
        }
        System.out.println(sum);
    }
}

2. 方法

2.1方法的定义格式:

 修饰符 返回值类型  方法名 ( 参数类型 参数名1,  参数类型 参数名2,......){ 
      执行语句
      ……… 
      return 返回值;
}
  • demo1
public class MethodDemo01 {
    public static void main(String[] args) {
        int area = getArea(3, 5); // 调用 getArea方法
        System.out.println(" The area is " + area);
    }

    // 下面定义了一个求矩形面积的方法,接收两个参数,其中x为高,y为宽
    public static int getArea(int x, int y) {
        int temp = x * y; // 使用变量temp记住运算结果
        return temp; // 将变量temp的值返回
    }
}

  • 图解getArea()方法调用过程


    getArea()方法的调用过程.png

    在程序运行期间,参数x和y相当于在内存中定义的两个变量。当调用getArea()方法时,传入的参数3和5分别赋值给变量x和y,并将x*y的结果通过return语句返回,整个方法的调用过程结束,变量x和y被释放。

2.1 方法重载

Java允许在一个类中定义多个名称相同的方法,但是参数的类型或个数必须不同,这就是方法的重载。

下面的三个方法互为重载关系
 public static int add(int x,int y) {逻辑} //两个整数加法
 public static int add(int x,int y,int z) {逻辑} //三个整数加法
 public static int add(double x,double y) {逻辑} //两个小数加法

  • demo2
public class MethodDemo03 {
    public static void main(String[] args) {
        // 下面是针对求和方法的调用
        int sum1 = add(1, 2);
        int sum2 = add(1, 2, 3);
        double sum3 = add(1.2, 2.3);
        // 下面的代码是打印求和的结果
        System.out.println("sum1=" + sum1);
        System.out.println("sum2=" + sum2);
        System.out.println("sum3=" + sum3);
    }

    // 下面的方法实现了两个整数相加
    public static int add(int x, int y) {
        return x + y;
    }
    // 下面的方法实现了三个整数相加
    public static int add(int x, int y, int z) {
        return x + y + z;
    }
    // 下面的方法实现了两个小数相加
    public static double add(double x, double y) {
        return x + y;
    }
}

2.2参数传递

  • 基本数据类型参数传递
public class ArgumentsDemo01 {
    public static void main(String[] args) {
        int a = 1;
        int b = 2;
        change(a, b);//调用方法时,传入的数值称为实际参数
        System.out.println("a=" + a);
        System.out.println("b=" + b);
    }

    public static void change(int a, int b){//方法中指定的多个参数称为形式参数
        a = a+b;
        b = b+a;
    }
}

程序执行步骤:
1)main()方法首先压栈执行,
2)a=1 , b=2
3)change(a,b) change方法压栈执行 change(1,2) a=3 b=5 然后change() 方法就出栈。(未改变main()中的实参)
4)sop(a)
5)sop(b)
图解:

方法参数是基本数据类型.JPG
  • 引用数据类型参数传递
public class ArgumentsDemo02 {
    public static void main(String[] args) {
        int[] arr = { 1, 2, 3 };
        change(arr);// 调用方法时,传入的数值称为实际参数
        
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }

    public static void change(int[] arr) {// 方法中指定的多个参数称为形式参数
        for (int i = 0; i < arr.length; i++) {
            arr[i] *= 2;
        }
    }
}   

程序执行步骤:
1)main() 方法首先压栈执行 int[] arr -->1,2,3 ; change(arr)
2)change(int[] arr) 压栈执行
for (int i = 0; i < arr.length; i++) {
arr[i] *= 2;
}
因为传递的是地址,change()方法改变了堆内数组的值,然后出栈。
3)sop(arr[0]),sop(arr[1]),sop(arr[2]), 重新指向数组地址。

引用参数传递.png

3.引用数据类型(类)

Java提供的类,自己创建的类

3.1 类的定义与使用

  • 类的定义格式
创建java文件,与类名相同
public class 类名{
    数据类型  属性名称1;
    数据类型  属性名称2;
    …
}
  • 类的使用格式
导包:我们将所有的类放到同一个文件夹下,可以避免导包。
创建对象:数据类型  变量名 = new 数据类型();
调用方法:目前我们定义的自定义类不涉及方法,只是属性(自定义类中的方法部分在面向对象部分讲解)
访问属性:变量名.属性 (这是当前的方式,后期会采取调用方法的方式替代掉直接访问的方式来完成对属性的访问。)

4. ArrayList集合

4.1创建集合的常用格式

导包:import java.util.ArrayList;
创建对象:与其他普通的引用数据类型创建方式完全相同,但是要指定容器中存储的数据类型:
ArrayList<要存储元素的数据类型> 变量名 = new ArrayList<要存储元素的数据类型>();
  • demo
   存储String类型的元素
      ArrayList<String> list = new ArrayList<String>();
   存储int类型的数据
      ArrayList<Integer> list = new ArrayList<Integer>(); 
   存储Phone类型的数据
      ArrayList<Phone> list = new ArrayList<Phone>();

4.2 集合中常用方法

方法说明 功能描述
boolean add(Object obj) 将指定元素obj追加到集合的末尾
Object get(int index) 返回集合中指定位置上的元素
int size() 返回集合中的元素个数
boolean add(int index, Object obj) 在集合中指定index位置,添加新元素obj
Object remove(int index) 从集合中删除指定index处的元素,返回该元素
void clear() 清空集合中所有元素.
Object set(int index, Object obj) 用指定元素obj替代集合中指定位置上的元素
import java.util.ArrayList;
public class ArrayListDemo01 {
    public static void main(String[] args) {
        // 创建ArrayList集合
        ArrayList<String> list = new ArrayList<String>();
        // 向集合中添加元素
        list.add("stu1");
        list.add("stu2");
        list.add("stu3");
        list.add("stu4");
        // 获取集合中元素的个数
        System.out.println("集合的长度:" + list.size());
        // 取出并打印指定位置的元素
        System.out.println("第1个元素是:" + list.get(0));
        System.out.println("第2个元素是:" + list.get(1));
        System.out.println("第3个元素是:" + list.get(2));
        System.out.println("第4个元素是:" + list.get(3));
    }
}

ArrayList集合相当于是一个长度可变的数组,所以访问集合中的元素也是采用索引方式访问,第一个元素存储在索引0的位置,第二个元素存储在索引1的位置,依次类推

4.3 集合的遍历

import java.util.ArrayList;

public class ArrayListDemo {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<Integer>();
        list.add(12);
        list.add(13);
        list.add(14);
        list.add(15);
        
         for(int i = 0; i < list.size(); i++){
                          int n = list.get(i);
             System.out.println(n);
         }
    }
}

这里要强调一点,get方法返回值的类型为集合中元素的类型

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354

推荐阅读更多精彩内容

  • 第四天 数组【悟空教程】 第04天 Java基础 第1章数组 1.1数组概念 软件的基本功能是处理数据,而在处理数...
    Java帮帮阅读 1,598评论 0 9
  • 一、基础知识:1、JVM、JRE和JDK的区别:JVM(Java Virtual Machine):java虚拟机...
    杀小贼阅读 2,378评论 0 4
  • Win7下如何打开DOS控制台? a:开始--所有程序--附件--命令提示符 b:开始--搜索程序和文件--cmd...
    逍遥叹6阅读 1,598评论 4 12
  • 如果你用Android Studio开发,并且要用其他项目作为library,这个问题是很容易出现的。出现这个问题...
    MissmoBaby阅读 217评论 0 0
  • 今日寒露,隐约听到冬天的脚步声了。 真好,又可以把自己裹得厚厚的,看起来胖点儿,哈哈,我不喜欢被人说太瘦。 越来越...
    自乐自鱼阅读 455评论 1 9