JAVA学习第三天

1.数组

1.1数组的几个特点、

(1)长度一旦确定就不能更改
(2)数组的元素是连续存储的,需要在内存内开辟一整块连续的存储空间
(3)数组元素的访问速度是非常快

1.2JVM的运行时分为几个部分

(1)方法区:存储加载的类信息,常量,静态变量
(2)堆:存储程序员通过new申请(创建对象)申请的内存
(3)Java虚拟机栈: 存储方法体中的局部变量
(4)本地方法栈: 存储调用的本地方法(c的函数库)的局部变量等信息
(5)程序计数器: 存储每一个线程的下一条要执行的指令

1.3变量

(1)基本数据类型的变量: 存储值
(2)引用数据类型的变量: 存储地址值

1.4数组的细节

(1)元素的数据类型和数组的长度决定了需要开辟多大的空间
(2)JVM会给内存编号每一个字节都有自己的内存地址
(2)arr存储元素的首地址 但是也不完全划=
(3)Java不会对外暴露的地址
(3)[I@723279cf [一维数组 I表示int 723279cf数组对象的hashcode值16进制

1.5总结

(1) 数组的元素存储在堆中 连续存储
(2) 数组名是记录数组对象的首地址
(3) 下标从0开始表示第一个元素不用跨过任何元素的意思

2.数组的初始化

2.1静态初始化

数据类型[] 数组名 = {元素1,元素2,元素3...};//必须在一个语句中完成,不能分开两个语句写

数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3...};
数据类型[] 数组名;
数组名 = new 数据类型[]{元素1,元素2,元素3...};

int[] arr = {1,2,3,4,5};//正确

int[] arr;
arr = {1,2,3,4,5};//错误

int[] arr = new int[]{1,2,3,4,5};//正确

int[] arr;
arr = new int[]{1,2,3,4,5};//正确



// 当访问数组元素时,下标指定超出[0, 数组名.length-1]的范围时,
// 就会报数组下标越界异常:ArrayIndexOutOfBoundsException。

3.二维数组

1.二维数组的声明


元素的数据类型[][] 数组名字
元素的数据类型 数组名字[][]
元素的数据类型[] 数组名字[]


2.二维数组的初始化


(1)静态初始化
数组名 = new 元素的数据类型[][] {{},{}} 



3.如何获取总行数 : arr.length


获取一行 arr[]
获取一行的元素个数 arr[].length


4.动态初始化


规则的矩阵
数组名 = new 元素的类型[行数][列数]
不规则(每一行的列数不相同) 有长有短
1.先确定行数
2.依次确定每一行的列数

public class _01DoubleDimensionalArray {
    public static void main(String[] args) {
        //
        int[][] grades = new int[][] {
                {1,2,3,4},
                {1,2,3,4},
                {1,2,3,4}
        };
        System.out.println(grades); // [[I@723279cf
        System.out.println(grades[0]); // [I@10f87f48
        /*
         可以把二维数组看成一位维数组
         */
        System.out.println("行数:" + grades.length);
        System.out.println("第一行的第一个数据:" + grades[0][0]);

        int[][] arr = new int[4][5];
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                arr[i][j] = i+1;
            }
            System.out.println();
        }

        int[][] newArr = new int[5][];
        for (int i = 0; i < newArr.length; i++) {
            /*
                发生了空指针异常
                当发生了空指针异常是,先找前面的东西看看他是否为null

                解决?
                给arr[i] new一个数组
             */
            arr[i] = new int[i+1];
            for (int j = 0; j < arr[i].length; j++) {
                arr[i][j] = i+1;
                System.out.print(arr[i][j]);
            }
            System.out.println();
        }
    }
}

5.杨辉三角形

public class _02ArrayExer {
    public static void main(String[] args) {
        int[][] yanghui = new int[10][];
        // 给杨辉三角形赋值
        for (int i = 0; i < yanghui.length; i++) {
            yanghui[i] = new int[i + 1];
            yanghui[i][0] = 1;
            yanghui[i][i] = 1;
            for (int j = 1; j < yanghui[i].length -1; j++) {
                yanghui[i][j] = yanghui[i - 1][j - 1] + yanghui[i -1][j];
            }
        }

        for (int i = 0; i < yanghui.length; i++) {
            for (int j = 0; j < yanghui[i].length; j++) {
                System.out.print(yanghui[i][j] + "\t");
            }
            System.out.println();
        }
    }
}

4.包

1.包的作用
(1)避免类的重名
(2)组织管理不同层(不同模块)的类
(3)可以限定部分类或成员的可见性范围

2.如何声明包
        package 包名;

要求:
(1)一个.java文件智能有一个package语句,而且必须在代码首行
(2)如果某个.java文件声明package语句,那么这个.java文件必须在对应的目录结构中

3.包命名个规范
        所有单词都小写,每一个单词之间使用.分割,每一个,代表一级目录

4.类如何跨包使用
        只要两个.java文件的package语句不完全相同,就认为是不同的包
        方式(1)使用包的全名.类名 如果同名只能使用这个
        (2)导入包
                import 包.类名
                import 包.* *代表的是类名

5.类和对象

JVM运行的内容:
(1)方法区:存储被加载的类的模板信息,常量等
(2)堆:存储new出来的对象信息
(3)JAVA虚拟机栈:存储Java的局部变量
(4)本地方法栈:存储c/c++等方法的局部变量
(5)程序计数器:存储每一个线程的下一条指令等
new在堆中申请内存空间,存储这个对象的相关信息
每一个对象需要存储三个部分的内容:
(1)对象头
(2)对象的实例变量值
(3)对齐的空白(这个有的对象可能没有)

方法不调用不执行,调用一次执行一次
1.每次调用都会在'栈'(包括java虚拟机栈,如果调用的是java的方法,那么在java虚拟机栈)
2.如果调用的是c的代码,那么在本地方法栈
3.开辟一块独立的内存空间,用来存储当前方法的局部变量等等信息,这个过程称为”入栈“等方法运行结束了后,会自动释放”栈“中的内存空间,这个过程称为”出栈“

栈结构的特点:先进后出

6.实例变量和局部变量

1、声明位置和方式

(1)实例变量:在类中方法外

(2)局部变量:在方法体{}中或方法的形参列表、代码块中

2、在内存中存储的位置不同

(1)实例变量:堆

(2)局部变量:栈

3、生命周期

(1)实例变量:和对象的生命周期一样,随着对象的创建而存在,随着对象被GC回收而消亡, 而且每一个对象的实例变量是独立的。

(2)局部变量:和方法调用的生命周期一样,每一次方法被调用而在存在,随着方法执行的结束而消亡, 而且每一次方法调用都是独立。

4、作用域

(1)实例变量:通过对象就可以使用,本类中“this.,没有歧义还可以省略this.”,其他类中“对象.” (2)局部变量:出了作用域就不能使用

5、修饰符(后面来讲)

(1)实例变量:public,protected,private,final,volatile,transient等 (2)局部变量:final

6、默认值

(1)实例变量:有默认值

(2)局部变量:没有,必须手动初始化。其中的形参比较特殊,靠实参给它初始化。

7.可变参数

可变参数
        参数:形参 实参
        实参的个数可以变

2.语法
        数据类型 ...参数名


3.要求
(1)每一个方法只有一个
(2)最后一个参数


4.使用?
(1)在声明可变参数的方法中当成数组用
(2)在调用可变参数的方法时,实参可以传递
        A:对应类型数组
        B:对应类型0-n个元素

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值