java学习笔记:二维数组与面向对象

目标:

  1. 二维数组
  2. 面向对象编程

一、二维数组

二维数组就是一个元素为一维数组的数组。

格式1:

  • 数据类型[][] 变量名 = new 数据类型[m][n];
  • m表示这个二维数组有多少个一维数组
  • n表示每一个数组的元素的元素个数
/*
	二维数组:就是元素为一维数组的一个数组
	格式1:
		数据类型[][] 变量名 = new 数据类型[m][n];
		m:表示这个二维数组有多少个一维数组
		n:表示每一个一维数组的元素有多少个。
	注意:
		A:以下格式也可以表示二维数组
			a:数据类型 数组名[][] = new 数据类型[m][n];
			b:数据类型[] 数组名[] = new 数据类型[m][n];
*/
class Array2Demo{
	public static void main(String[] args){
		// 定义一个二维数组
		int[][] arr = new int[3][2];
		// 输出二位数组的名称,是一个地址
		System.out.println(arr); //是一个地址
		// 输出二维数组的第一个元素一位数组的名称
		System.out.println(arr[0]); //是一个地址
		System.out.println(arr[1]);
		System.out.println(arr[2]);
		// 输出二位数组的元素
		System.out.println(arr[0][0]); // 0
		
	}
}

 格式2:

  • 数据类型[][] 变量名 = new 数据类型[m][]
  • m表示这个二维数组有多少个一维数组
  • 没有直接给出一维数组的元素个数,可以动态的给出
/*
	格式2:
		数据类型[][] 变量名 = new 数据类型[m][]
		m:表示这个二维数组有多少个一维数组
		没有直接给出一维数组的元素个数,可以动态的给出
*/
class Array2Demo1{
	public static void main(String[] args){
		// 定义数组
		int[][] arr = new int[3][];
		
		System.out.println(arr);  // 这是一个地址
		System.out.println(arr[0]); // null
		System.out.println(arr[1]); // null
		System.out.println(arr[2]); // null
		// 动态的为一个一维数组分配看空间
		arr[0] = new int[2];
		arr[1] = new int[3];
		arr[2] = new int[1];
		
		System.out.println(arr[0]); // 地址
		System.out.println(arr[1]); // 地址
		System.out.println(arr[2]); // 地址
		
		System.out.println(arr[0][0]); // 0
		System.out.println(arr[0][1]); // 0
		System.out.println(arr[1][0]); // 0
		
		// 为数组赋值
		arr[1][0] = 100;
		arr[1][2] = 200;
	}
}

格式3:

  • 数据类型[][] 变量名 = new 数组类型[][]{{元素...},{元素...},{元素...}};
  • 简化版格式:
    • 数据类型[][] 变量名 =  {{元素...},{元素...},{元素...}};
    • 举例:int[][] arr = {{1,2,3},{4,6},{6}}
/*
	需求:打印杨辉三角形(行数可以键盘录入)
	
	分析:规律
		a:任何一行的第一列和最后一列都是1
		b:从第三行开始,每一个数据是它上一行的前一列和它上一行的本列之和
	
	步骤:
		1. 首先定义一个二维数组,行数如果是n,我们把列数也先定义为n
		2. 给这个二维数组任何一行的第一列和最后一列赋值为1
		3. 按照规律给其他元素赋值:
			从第三行开始,每一个数据是它上一行的前一列和它的上一行的本列之和
		4. 遍历这个二维数组
*/
import java.util.Scanner;
class Array2Test3{
	public static void main(String[] args){
		// 创建一个键盘录入对象
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		
		printArray(n);
	}
	
	/*
		打印杨辉三角
		两个明确:
			返回类型:void
			参数数据:n,int
	*/
	public static int printArray(int n){
		// 1. 首先定义一个二维数组,行数如果是n,我们把列数也先定义为n
		int[][] arr = new int[n][n];
		// 2. 给这个二维数组任何一行的第一列和最后一列赋值为1
		for(int x=0;x<arr.length;x++){
			for(int y=0;y<arr[x].length;y++){
				arr[x][0] = 1;
				arr[x][x] = 1;
			}
		}
		// 3. 按照规律给其他元素赋值:
		for(int i=2;i<arr.length;i++){
			for(int j=1;j<arr[i].length-1;j++){
				arr[i][j] = arr[i-1][j-1] + arr[i-1][j];
			}
		}
		// 4. 遍历数组
		for(int x=0;x<arr.length;x++){
			for(int y=0;y<x+1;y++){
				System.out.print(arr[x][y]+" ");
			}
			System.out.println();
		}
		return 0;
	}
}

练习:打印杨辉三角

/*
	需求:打印杨辉三角形(行数可以键盘录入)
	
	分析:规律
		a:任何一行的第一列和最后一列都是1
		b:从第三行开始,每一个数据是它上一行的前一列和它上一行的本列之和
	
	步骤:
		1. 首先定义一个二维数组,行数如果是n,我们把列数也先定义为n
		2. 给这个二维数组任何一行的第一列和最后一列赋值为1
		3. 按照规律给其他元素赋值:
			从第三行开始,每一个数据是它上一行的前一列和它的上一行的本列之和
		4. 遍历这个二维数组
*/
import java.util.Scanner;
class Array2Test3{
	public static void main(String[] args){
		// 创建一个键盘录入对象
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		
		printArray(n);
	}
	
	/*
		打印杨辉三角
		两个明确:
			返回类型:void
			参数数据:n,int
	*/
	public static int printArray(int n){
		// 1. 首先定义一个二维数组,行数如果是n,我们把列数也先定义为n
		int[][] arr = new int[n][n];
		// 2. 给这个二维数组任何一行的第一列和最后一列赋值为1
		for(int x=0;x<arr.length;x++){
			for(int y=0;y<arr[x].length;y++){
				arr[x][0] = 1;
				arr[x][x] = 1;
			}
		}
		// 3. 按照规律给其他元素赋值:
		for(int i=2;i<arr.length;i++){
			for(int j=1;j<arr[i].length-1;j++){
				arr[i][j] = arr[i-1][j-1] + arr[i-1][j];
			}
		}
		// 4. 遍历数组
		for(int x=0;x<arr.length;x++){
			for(int y=0;y<x+1;y++){
				System.out.print(arr[x][y]+" ");
			}
			System.out.println();
		}
		return 0;
	}
}

 思考:引用类型和数值类型的参数传递

  • 数值类型:在方法见传递的是数值,不改变原有数值
  • 引用类型:传递的是地址值,改变原有数值。

二、面向对象

我们知道,我们可以将实现某些功能的代码封装到一个方法中,在我们编程的过程中,会封装很多的方法,这时我们可以将我们的方法,继续封装成类。当使用某功能时,我们就可以先找到这个类,然后使用这个类中的方法,这就是面向对象思想的编程方式。

面向对象思想概述:

当需求单一、或者简单时,使用面向过程编程没有问题,并且效率也很高。当随着需求的更改,功能的增多,发现需要面对每一个步骤很麻烦。这时,我们可以把这些步骤和功能进行封装,封装时根据不同的功能,进行不同的封装,功能类似的封装在一起。这样结构清晰,使用的时候,找到对应的类就可以了,这就是面向对象的思想。

面向对象思想:

  • 面向对象是基于面向过程的编程思想
  • 面向过程:强调的是每一个功能的步骤
  • 面向对象:强调的是对象,然后由对象去调用功能

面向对象的思想特点:

  • 是一种更符合我们思想习惯的思想
  • 可以将复杂的事情简单化
  • 将我们从执行者变成了指挥者

面向对象的开发、设计和特征:

  • 面向对象的开发
    • 就是不断的创建对象,使用对象,指挥对象做事情
  • 面向对象的设计
    • 其实就是在管理和维护对象之间的关系
  • 面向对象的特征
    • 封装
    • 继承
    • 多态

类与对象的关系:

  •  类:是一组相关的属性和行为的集合,是一个抽象的概念
  • 对象:是该类事物的具体表现形式,具体存在的个体
  • 举例:类->学生,对象->班长就是一个对象
/* 
	事物:
		属性:事物的信息描述
		行为:事物的功能
	类:
		成员变量:事物的属性
		成员方法:书屋的功能
	定义一个类,其实就是定义该类的成员变量和成员方法
	
	案例:我们来完成一个学生类的定义
	
	学生事物:
		属性:姓名,年龄,地址
		行为:学习,吃饭,睡觉
	把事物转换为对应的类:
	学生类:
		成员变量:姓名,年龄,地址
		成员方法:学习,吃饭,睡觉
	成员变量:和以前变量的定义是一样的格式,但是位置不同,在类中方法外
	成员方法:和以前的方法定义是一样的格式,但是今天把static先去掉
*/
class Student{
	// 定义变量
	// 姓名
	String name;
	// 年龄
	int age;
	// 地址
	String address;
	
	// 定义方法
	// 学习的方法
	public void study(){
		System.out.println("学习");
	}
	
	// 吃饭的方法
	public void eat(){
		System.out.println("吃饭");
	}
	
	// 睡觉的方法
	public void sleep(){
		System.out.println("睡觉");
	}
}

 对象的使用:

/*
	在一个java文件中邪两个类:一个基本的类,一个测试类。
	注意:文件的名称和测试类名称相同
	
	创建对象:
		格式:类名 对象名 = new 对象名();
	使用成员变量:
		格式:对象名.变量名
	使用成员方法:
		格式:对象名.方法名()
*/
// 基本的类
class Student{
	// 定义变量
	// 姓名
	String name;
	// 年龄
	int age;
	// 地址
	String address;
	
	// 定义方法
	// 学习的方法
	public void study(){
		System.out.println("学习");
	}
	
	// 吃饭的方法
	public void eat(){
		System.out.println("吃饭");
	}
	
	// 睡觉的方法
	public void sleep(){
		System.out.println("睡觉");
	}
}


// 测试的类
class StudentDemo{
	public static void main(String[] args){
		// 格式:类名 对象名 = new 类名();
		// 创建一个Student类的对象
		Student s = new Student();
		
		// 输出成员变量
		System.out.println(s.name+"---"+s.age+"---"+s.address);

		// 给成员变量赋值
		s.name = "小五";
		s.age = 10;
		s.address = "上海";
		System.out.println(s.name+"---"+s.age+"---"+s.address);
		
		// 调用方法
		s.study();
		s.eat();
		
	}
}

对象的内存图分析:

一个对象的内存图:

两个对象的内存图:

 

三个对象的内存图:

 

猜你喜欢

转载自blog.csdn.net/gyt15663668337/article/details/83104531