JavaSE基础篇(二)

目录

1.数组介绍

1.数组的定义格式

2.数组的静态初始化

3.数组的元素访问

4.数组的遍历操作

5.数组的动态初始化

6.数组的内存图

7.数组的常见问题

8.二维数组介绍

9.二维数组的静态初始化

10.二维数组的遍历操作

11.二维数组的动态初始化

12.二维数组的内存图

 2.方法

1.方法介绍

2.方法的通用定义格式

3.方法的调用格式

4.方法常见问题

5.方法重载 (Overload)

6.方法参数传递面试题

3.面向对象(基础)

1.面向对象介绍

2.类和对象

3.对象的创建和使用

4.对象内存图

5.this关键字

6.构造方法

7.封装 (重点)

8.private关键字

9.标准 JavaBaen (重点)


1.数组介绍

问题: 什么是数组? 什么情况下使用数组?
​
数组就是一种容器, 可以存储(同种数据类型)的多个值.
double[] arr = {11.1, 22.2, 33.3, 10};
System.out.println(arr[3]);   // 10.0
​
场景: 如果发现要操作的多个数据, 属于同一组数据, 就可以考虑使用数组容器来进行维护.

1.数组的定义格式

1. 数据类型[] 数组名;
​
2. 数据类型 数组名[];
​
注意: 这种格式定义出来的, 仅仅只是数组类型的变量.

int[] arr;
System.out.println(arr);  // 编译错误, 提示没有进行初始化

2.数组的静态初始化

- 初始化: 为数组容器在内存中, 开辟空间, 并将数据存入空间中的过程.
​
- 完整格式:
        
        数据类型[] 数组名 = new 数据类型[]{元素1, 元素2, 元素3...};
        int[] arr = new int[]{11,22,33};
​
        错误示例: int[] arr = new int[3]{11,22,33};  --> 编译错误
            
- 简化格式:
​
        数据类型[] 数组名 = {元素1, 元素2, 元素3...};
        int[] arr = {11,22,33};
​
​
- 细节:
        打印数组名称的时候, 会在控制台看到数组的十六进制地址值.
        
            [I@233ac34

3.数组的元素访问

格式: 数组名[索引];
​
索引(角标,下标) : 数组容器中每一个空间, 所对应的编号, 编号从0开始逐个+1增长.

4.数组的遍历操作

介绍: 将数组中每一个元素取出来的过程, 取出来之后(打印, 判断, 求和...)
for(int i = 0; i < arr.length; i++){
   // i : 索引
   // arr[i] : 元素
}
细节: 数组名.length ---> 动态的获取到数组的长度(元素的个数)
​
遍历数组的快捷键: 数组名.fori + 回车

5.数组的动态初始化

介绍: 手动指定长度, 系统分配默认初始化值.
​
格式: 数据类型[] 数组名 =  new 数据类型[长度];
实例: int[] arr = new int[3];
​
默认初始化值:
​
    整数: 0
    小数: 0.0
    布尔: false
    字符: '\u0000' --> unicode字符 ---> 常见的体现就是空白字符
    引用数据类型 : null
        
    引用数据类型: 数组, 类, 接口
两种初始化的区别:
​
    动态初始化: 手动指定长度, 系统分配默认初始化值.
    静态初始化: 手动指定元素, 系统会计算出该数组的长度.
​
两种初始化的使用选择:
    
    1. 静态初始化:  如果要操作的数据都已经明确给出了, 推荐使用静态初始化
                    需求: 计算出班级学生的总成绩  (100,100,100,90)
                    int[] arr = {100,100,100,99};
    
    2. 动态初始化:  只知道要存储几个元素, 但是不明确具体数值的情况
                    需求: 键盘录入5个元素, 并存入数组
                    需求: 产生10个1~100之间的随机数, 并存入数组
                    
                  
  int[] arr = new int[5];
                    
                    for(int i = 0; i < arr.length; i++){
                        arr[i] = sc.nextInt();
                    }
                    
                    ------------------------------------------
                    
                    int num1 = sc.nextInt();
                    int num2 = sc.nextInt();
                    int num3 = sc.nextInt();
                    int num4 = sc.nextInt();
                    int num5 = sc.nextInt();
                    
                    int[] arr = {num1, num2, num3, num4, num5};

6.数组的内存图

 

7.数组的常见问题

ArrayIndexOutOfBoundsException : 数组索引越界异常
​
原因: 访问了不存在的索引

NullPointerException : 空指针异常

原因: 当一个引用数据类型的变量, 记录到一份 null 值之后, 跟堆内存的指向就切断了
   这时候还想去访问堆内存数据, 就会出现空指针异常.

8.二维数组介绍

介绍: 二维数组是一种容器, 内部存储的都是一维数组
		理解: 数组的嵌套
		
场景: 如果发现要操作的多组数据, 又是同一组, 就可以考虑使用二维数组进行维护
举例:
		第一季度:22,66,44 
        第二季度:77,33,88 
        第三季度:25,45,65
        第四季度:11,66,99 


		{
			{22,66,44},
			{77,33,88},
			{24,45,65},
			{11,66,99}
		}

9.二维数组的静态初始化

完整格式:

数据类型[][] 数组名 = new 数据类型[][]{  {一维数组}, {一维数组}  };


简化格式:

数据类型[][] 数组名 = {  {一维数组}, {一维数组}  };


范例:

int[][] arr = {
    {22,66,44},
    {77,33,88},
    {24,45,65},
    {11,66,99}
};
二维数组的元素访问:

数组名[索引]; ---> 获取到的是一维数组

数组名[m索引][n索引] :

		m索引 : 指定要访问哪一个一维数组
		n索引 : 指定访问一维数组中的哪一个元素
		
		System.out.println(arr[2][1]);

10.二维数组的遍历操作

思路:

1. 遍历二维数组, 获取到每一个一维数组
2. 遍历每一个一维数组, 获取到具体的元素
for(int i = 0; i < arr.length; i++){
	// arr[i] : 每一个一维数组
	for(int j = 0; j < arr[i].length; j++){
		System.out.println(arr[i][j]);
	}
}

11.二维数组的动态初始化

格式: 

数据类型[][] 数组名 = new 数据类型[m][n];
int[][] arr = new int[2][3];
创建了一个二维数组, 数组名叫做arr, 该数组可以存储2个一维数组, 每一个一维数组可以存储3个元素.
细节:

可以将提前创建好的一维数组, 存入二维数组中.

int[] arr1 = {11,22,33};
int[] arr2 = {44,55,66};
int[][] arr = new int[2][3];

arr[0] = arr1;
arr[1] = arr2;

12.二维数组的内存图

 2.方法

1.方法介绍

  • 什么是方法 ?

    • 方法就是一段具有独立功能的代码块,不调用就不执行。

  • 方法的另外一个名字?

    • 函数

  • 方法的出现对程序有哪些好处?

    • 可以将记在一起的臃肿代码,按照功能逻辑进行分类关系(提高代码的可阅读性)

    • 可以提高代码的复用性

      • 写好的一个方法, 可以进行多次调用

  • 问题 : 方法的出现, 是否能够提高程序的执行效率 ?

    • 不能 !

2.方法的通用定义格式

  • 格式 :

public static 返回值类型 方法名 (参数) {  
  方法体;  
  return 返回值;
}

  • 修饰符 : 目前来说, 就是 public static

  • 返回值类型 : 跟返回值的类型要匹配

    • return 10; int
      
      return 12.3; double

  • 方法名 : 自己起的名字 -> 见名知意 -> 小驼峰命名法

  • 参数 : 方法运行之前所需要的材料.

  • 方法体 : 方法中真正执行的逻辑代码

  • return :

    • 用于返回结果数据

    • 结束方法

  • 今后自己定义方法的思路 :

    • 参数 :

      • 问题 : 思考自己这个方法中所使用的数据, 是否有灵活度的要求

        • 没有 : 不写参数

        • 有 :

      • 问题 : 思考自己这个方法要什么类型的数据, 要几个?

        • 举例 : 求出三个整数的最大值

          • 类型 : int

          • 数量 : int a, int b, int c

    • 返回值类型 :

      • 观察 : 自己这个方法逻辑写完了之后, 有没有结果的产生

        • 没有 : void

        • 有 : 写对应的数据类型.

3.方法的调用格式

  • 不带返回值的方法 (void)

    • 只能单独调用

    public static void method(){
        
    }
    ​
    method();
  • 带返回值的方法

    public static int getMax(int a, int b){
        int max = a > b ? a : b;
        return max;
    }
    • 单独调用 : geteMax(10,20);

      • 丢失数据, 不推荐

    • 赋值调用

      • int max = getMax(10,20);

      • 推荐, 因为非常灵活.

    • 输出调用

      • System.out.println(getMax(10,20));

      • 不太推荐, 不够灵活.

4.方法常见问题

  • 方法不调用就不执行

  • 方法与方法之间是平级关系, 不允许嵌套定义

  • 方法的编写顺序和执行顺序无关, 要想梳理执行顺序, 就看调用顺序.

  • 如果一个方法没有返回值 (void) return语句可以省略不写, 但是非要写的话, 只能是 return;

  • retrun; 下面不要写代码, 因为执行不到.

5.方法重载 (Overload)

  • 目标 1: 能够独立识别出方法与方法之间是否是正确的重载关系

    • 在同一个类中, 方法名相同, 参数不同

      • 个数不同, 类型不同, 顺序不同.

  • 目标2 : 能够理解方法重载出现的好处

    • 不需要记忆过多繁琐的方法名字了.

    • 假设没有方法重载 :

      System.out.printInt(10);
      System.out.printDouble(10.0);
    • 有方法重载:

      System.out.println(10);
      System.out.println(10.0);

6.方法参数传递面试题

  • 打开ppt文件夹,将内部流程梳理清楚。

  • 方法的参数传递问题:

    • 基本数据类型:传递的是具体的值

    • 引用数据类型:传递的是地址值

3.面向对象(基础)

1.面向对象介绍

  • 什么是面向对象呢 ?

    • 面向对象不是一门技术,而是一种编程的指导思想

    • 指导我们以什么方式去思考问题,指导我们以什么方式去编写代码

    - 当要解决问题的时候, 就要思考, 是否已经有存在的对象, 可以解决这个问题.
        - 解决的问题是键盘录入 :  Scanner
        - 解决的问题是产生随机数 : Random
        - 解决的问题是对多个学生的信息进行管理 : Student --> 自己写的类.
  • 面向对象主要学习什么 ?

    • 学习自己如何设计对象

    • 学习已有的对象该如何使用.

2.类和对象

  • 什么是类 ?

    • 类是一组相关属性和行为的集合 , 可以将其看做为是对象的 [设计图]

  • 什么是对象 ?

    • 根据类, 所创建出来的实体.

  • 类和对象的关系 ?

    • 依赖关系, 需要根据类去创建对象

    • 根据一个类, 还可以创建多个对

  • 类的组成 ?

    • 属性 (成员变量) 成员变量跟之前定义的变量格式一样, 只不过位置发生了改变, 放在类中方法外.

      • 什么样的东西, 作为类的属性呢?

        • 事物的一些特征信息 , 姓名, 年龄, 身高... (名词)

    • 行为 (成员方法) 成员方法跟之前定义方法的格式一样, 只不过去掉了 static 关键字.

      • 什么样的东西, 作为类的行为呢?

        • 行为指的是该事物具体能做的事情, 吃饭, 学习...(动词)

public class Student {
    String name;
    int age;
    
    public void study(){
        System.out.println("学生学习");
    }
}

3.对象的创建和使用

  • 创建对象的格式

类名 对象名 = new 类名();
Student stu = new Student();
​
- 打印对象名的时候, 会看到内存地址.
  • 使用成员变量的格式

对象名.变量名;
​
stu.name = "张三";
System.out.println(stu.name);
System.out.println("姓名为:" + stu.name);
​
- 如果没有给成员变量赋值, 获取到的就是成员变量的默认初始化值.
  • 使用成员方法的格式

对象名.方法名();
​
stu.study();

4.对象内存图

  • 一个对象的内存图

  • 两个对象内存图

    • 在一次程序的执行过程中, 创建了多个对象, 该类的字节码文件加载一次.

    • 每new一次, 都是一个新的对象, 在堆内存中会有自己独立的内存空间.

  • 两个引用指向相同空间内存图

 

  • 成员变量和局部变量的区别

    • 编写位置不同

      • 成员变量 : 方法外

      • 局部变量 : 方法中

    • 初始化值不同

      • 成员变量 : 有默认初始化值

      • 局部变量 : 没有默认初始化值, 使用之前必须完成赋值.

    • 内存位置不同

      • 成员变量 : 堆内存

      • 局部变量 : 栈内存 -- 栈内存的所属方法当中

    • 生命周期不同

      • 成员变量 : 随着对象的创建而存在, 随着对象的消失而消失

      • 局部变量 : 随着方法的调用而存在, 随着方法的调用结束而消失.

    • 作用域

      • 都在自己所在的大括号中.

5.this关键字

  • this关键字可以解决的问题

    • 情况 : 如果局部变量和成员变量重名了, Java 会根据就近原则, 优先使用局部变量.

    • 非要使用成员变量的话, 就可以使用 this 关键字进行区分.

public class Student {
    String name = "张三";
    
    public void show(){
        String name = "李四";
        System.out.println(name);      // 李四
        System.out.println(this.name); // 张三
    }
    
}
  • this 关键字的概念 :

    • this 代表当前类对象的引用 (地址)

    • 哪一个对象调用的方法, 方法中的this, 就代表的是哪一个对象 .

      • stu1.show() --> this --> stu1的地址

      • stu2.show() --> this --> stu2的地址

  • this的内存图

  •  

6.构造方法

  • 构造方法 (构造器) : 用于创建对象.

  • 构造方法的格式 :

    • 方法名与类名相同, 大小写也要一致

    • 没有返回值类型, 连 void 都没有

    • 没有具体的返回值 (不能由return语句带回结果数据.)

  • 构造方法的执行时机 :

    • 在创建对象的时候, 被系统自动调用执行.

    • 每创建一次对象, 就会执行一次构造方法.

    • 注意 :构造方法不能手动调用, 不能通过对象名.的形式进行调用

  • 构造方法的注意事项

    • 如果一个类当中, 没有手动编写过构造方法, 系统将会提供一个默认的, 无参数的构造方法

    • 如果手动编写了构造方法, 系统将不会再系统那个默认的无参构造了.

    • 建议 : 无参构造方法, 带参构造方法, 全部手动给出.

    • 构造方法也是方法, 允许重载关系.

7.封装 (重点)

  • 面向对象三大特征 : 封装, 继承, 多态

  • 封装 : 隐藏实现细节, 仅对外暴露公共的访问方式.

  • 封装在代码中常见的体现:

    • 将属性抽取到类当中, 这是对数据进行的一种封装

      • 封装前 :

      工号 姓名 年龄 电话
      1   张三  23  156JQKA1111
      2   李四  24  156JQKA1111
      3   王五  25  156JQKA1111
      4   赵六  26  156JQKA1111
      ​
      ​
      使用Java代码保留这些数据并使用.
      ​
      String id1 = "1";
      String name1 = "张三";
      int age1 = 23;
      String tel1 = " 156JQKA1111";
      ​
      String id2 = "1";
      String name2 = "张三";
      int age2 = 23;
      String tel2 = " 156JQKA1111";
      ​
      String id3 = "1";
      String name3 = "张三";
      int age3 = 23;
      String tel3 = " 156JQKA1111";
      ​
      String id4 = "1";
      String name4 = "张三";
      int age4 = 23;
      String tel4 = " 156JQKA1111";
      ​
      ​
      弊端: 变量太多, 太零散, 不方便进行管理.

      • 封装后 :

      工号 姓名 年龄 电话
      1   张三  23  156JQKA1111
      2   李四  24  156JQKA1111
      3   王五  25  156JQKA1111
      4   赵六  26  156JQKA1111
          
      public class Employee {
          String id;
          String name;
          int age;
          String tel;
          
          ...
      }
      ​
      Employee e1 = new Employee("1","张三",23,"156JQKA1111");
      Employee e2 = new Employee("2","张三",23,"156JQKA1111");
      Employee e3 = new Employee("3","张三",23,"156JQKA1111");
      Employee e4 = new Employee("4","张三",23,"156JQKA1111");

    • 将代码功能抽取到方法中, 这是对代码功能进行的一种封装

    public static void printArray(int[] arr){
    	... 遍历数组的代码
    }
    ​​​​​​​printArray(arr);

8.private关键字

  • 权限修饰符 : 修饰的是成员 (变量, 方法, 构造方法)

    • private : 在同一个类中

    • 默认的 : 在同一个类中, 在同一个包下进行访问

    • protected : 就业班再学..

    • public : 可以在任意位置访问

  • 今后使用最多的 :

    • private

    • public

9.标准 JavaBaen (重点)

  • JavaBean 类 : 用于封装数据的类

  • 要求 :

    • 成员变量需要私有化

    • 提供空参, 带参构造方法

    • 针对于私有的成员变量, 提供对应的setXxx和getXxx方法.

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Last In First Out

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值