数组(一维数组和二维数组的概述与使用);递归的使用;面向对象的思想;类与对象;成员变量与局部变量;方法的形式参数是类名的时候如何使用

数组的概述和定义格式说明

  • 为什么要有数组:为了统计某种数据而采用的一种统计方法,数组是存储多个变量(元素)的东西(容器),这多个变量的数据类型要一致。
  • 数组的概念:数组是存储同一种数据类型多个元素的集合。也可以看成是一个容器。
    数组既可以存储基本数据类型,也可以存储引用数据类型。
  • 数组定义格式
    格式1: 数据类型[] 数组名;
    格式2: 数据类型 数组名[];
  • 举例:
    int[] a; 定义了一个int类型的数组a;
    int a[]; 定义了一个int类型的a数组;

数组的初始化动态

  • 什么是数组的初始化
    Java中的数组必须先初始化,然后才能使用。
    所谓初始化:就是为数组中的数组元素分配内存空间,并为每个数组元素赋值。
  • 什么是数组的初始化
    Java中的数组必须先初始化,然后才能使用。
    所谓初始化:就是为数组中的数组元素分配内存空间,并为每个数组元素赋值。
  • 注意事项: 这两种方式,只能使用一种,不能进行动静结合。
  • 动态初始化的格式:
    数据类型[] 数组名 = new 数据类型[数组长度];
    数组长度其实就是数组中元素的个数。
    举例: int[] arr = new int[3]; 定义了一个int类型的数组arr,这个数组可以存放3个int类型的值。
列:public class SZ {
    public static void main(String[] args) {
       int []arr={1,2,3};
       System.out.println(arr[0]);
       System.out.println(arr[1]);
        System.out.println(arr[2]);
        }
        }

Java中的内存分配以及栈和堆的区别

  • 栈: 存放的是局部变量
    局部变量:在方法定义中或者方法声明上的变量都是局部变量。
  • 堆: 存放的是所有new出来的东西
    特点:
    a: 每一个new出来的东西都会为其分配一个地制值。
    b: 每一个变量都有一个默认的值
    byte,short,int,long – 0
    float,double – 0.0
    char – ‘\u0000’
    boolean – false
    引用数据类型 – null
    c: 使用完毕就变成了垃圾,等待垃圾回收器对其回收。
  • 方法区:又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
  • 本地方法区:方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。
  • 寄存器:cpu 使用。

数组的图解

  • 定义第一个数组,定义完毕后,给数组元素赋值。赋值完毕后,再输出数组名称和元素。
    定义第二个数组,定义完毕后,给数组元素赋值。赋值完毕后,再输出数组名称和元素。
    定义第三个数组,把第一个数组的地址值赋值给它。(注意类型一致),通过第三个数组的名称去把元素重新赋值。
    最后,再次输出第一个数组数组名称和元素。

[外链图片转存失败(img-xCvXrmX0-1566444123472)(C:\Users\14512\Desktop\培训\4.05\20190405-JavaSE-课件\图示\二维数组图示.png)]

数组的初始化静态初始化

  • 静态初始化的格式:
    格式:数据类型[] 数组名 = new 数据类型[]{元素1,元素2,…};
  • 举例: int[] arr = new int[]{1,2,3};
    简化格式:
    数据类型[] 数组名 = {元素1,元素2,…};
    举例: int[] arr = {1,2,3};

数组的操作遍历

  • 数组遍历:就是依次输出数组中的每一个元素。
列:public class SZ {
    public static void main(String[] args) {
    int[][] arr = {{2, 4}, {10, 30}, {10, 30, 40}, {10, 1}};
        for (int i = 0; i < arr.length; i++) {
            //System.out.println(arr[i]); //一维数组
            for (int j = 0; j < arr[i].length; j++) {
                System.out.println(arr[i][j]);
            }
        }

    }

数组的操作获取最大值

public class ArrayDemo {
    public static void main(String[] args) {
        //获取数组中的最大值或最小值
        int[] arr = {10, 20, 50, 40, 102};
        int max = getMax(arr);
        System.out.println("最大值是" + max);
        }
        }

数组的操作反转

public class ArrayDemo{
    public static void main(String[] args) {
        //数组元素反转(就是把元素对调)
        int[] arr = {10, 20, 30, 40, 50}; //50 40 30 20 10

        for (int i = 0, j = arr.length - 1; i < j; i++, j--) {
            int t = arr[i];
            arr[i] = arr[j];
            arr[j] = t;
        }

        //reverseArray(arr);
        showArray(arr);


    }

    //数组元素反转
    private static void reverseArray(int[] arr) {
        //首尾元素值交换,遍历一半
        for (int i = 0; i < arr.length / 2; i++) {
            //采用中间变量进行值交换
            int t = arr[i];
            arr[i] = arr[arr.length - 1 - i];
            arr[arr.length - 1 - i] = t;

        }
    }

    private static void showArray(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + ",");
        }
    }


}

数组的操作查找

public class ArrayDemo{
    public static void main(String[] args) {
        String[] arr = {"星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"};
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入一个整数 1----7");
        int index = scanner.nextInt();
        String str = getElementByArray(index, arr);
        System.out.println(str);
    }

    private static String getElementByArray(int index, String[] arr) {
        if (index >= 1 && index <= 7) {
            return arr[index - 1];
        } else {
            return "查无此元素";
        }
    }
}

二维数组概述和格式

  • 概述:二维数组其实就是每一个元素为一维数组的数组。

  • 二维数组格式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个元素

  • 二维数组格式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,5,6},{7,8,9}};
    int[][] arr = {{1,2,3},{5,6},{7}};

  • 注意事项
    A:以下格式也可以表示二维数组
    a:数据类型 数组名[][] = new 数据类型[m][n];
    b:数据类型[] 数组名[] = new 数据类型[m][n];
    这两种格式不推荐使用
    B:注意下面定义的区别
    int x,y;
    int[] x,y[];

    	区别是:
    	 int[] x,y[];//定义了两个数组 一个是一维数组x 一个是二维数组y
    	  x=new int[3];	
    
      		  y=new int [3][];
    

递归解决问题的思想

  • 递归概述: 方法定义中调用方法本身的现象
  • 递归注意事项
    要有出口,否则就是死递归
    次数不能太多,否则就内存溢出
public class MyTest2 {
    public static void main(String[] args) {
        //求 5的阶乘
        //用递归来做
       int r= jieCheng(5);
        System.out.println("结果是"+r);

    }

    private static int jieCheng(int i) {
        if(i==1){
            return 1;
        }else{

            return i*jieCheng(i-1);
        }
    }
}

不死神兔的问题:
public class MyTest2 {
    public static void main(String[] args) {
        //有一对兔子,从出生后第3个月起每个月都生一对兔子,
        //小兔子长到第三个月后每个月又生一对兔子,
        //假如兔子都不死,问第二十个月的兔子对数为多少?


        月份     兔子的对数
        //  1           1
        //  2           1
        //  3           2
        //  4            3
        //  5            5
        //  6            8
        //  7            13
        //   8           21

        //  1 1 2 3 5 8 13 21 从第三个数开始,这个数等于前两个数之和 (斐波那契数列)
        //递归来做
        int sum = sumRabbit(20);
        System.out.println("兔子的对数" + sum);
    }

    private static int sumRabbit(int i) {
        if (i == 1 || i == 2) {
            return 1;
        } else {
            return sumRabbit(i - 1) + sumRabbit(i - 2);
        }

    }
}

面向对象思想概述

  • 面向过程思想概述
    我们来回想一下,这几天我们完成一个需求的步骤:首先是搞清楚我们要做什么,然后在分析怎么做,最后我们再代码体现。
    一步一步去实现,而具体的每一步都需要我们去实现和操作。这些步骤相互调用和协作,完成我们的需求。
    在上面的每一个具体步骤中我们都是参与者,并且需要面对具体的每一个步骤和过程,这就是面向过程最直接的体现。
    那么什么是面向过程开发呢? 面向过程开发,其实就是面向着具体的每一个步骤和过程,把每一个步骤和过程完成,然后由这些功能方法相互调用,完成需求。
    面向过程的代表语言:C语言
  • 面向对象思想概述
    当需求单一,或者简单时,我们一步一步去操作没问题,并且效率也挺高。
    可随着需求的更改,功能的增多,发现需要面对每一个步骤很麻烦了。这时就开始思索,
    能不能把这些步骤和功能在进行封装,封装时根据不同的功能,进行不同的封装,功能类似的封装在一起。
    这样结构就清晰了很多。用的时候,找到对应的类就可以了。这就是面向对象的思想。
  • 面向对象思想特点
    a:是一种更符合我们思想习惯的思想
    b:可以将复杂的事情简单化
    c:将我们从执行者变成了指挥者
    角色发生了转换
  • 面向对象特征
    封装(encapsulation)
    继承(inheritance)
    多态(polymorphism)
  • 面向对象开发
    就是不断的创建对象,使用对象,指挥对象做事情。

类与对象概述

  • 我们学习编程是为了什么
    我们学习编程语言,就是为了模拟现实世界的事物,实现信息化。比如:去超市买东西的计费系统,去银行办业务的系统。
  • 我们如何描述现实世界事物
    举例: 描述学生事物
    姓名 , 年龄 , 性别 …
    学习 , 吃饭 , 睡觉 …
    属性: 就是该事物的描述信息
    行为: 就是该事物能够做什么
    我们学习编程语言,就是为了模拟现实中的事物,我们学习的Java语言最基本单位是类,所以,我们就应该把事物用一个类来体现。
    由此我们就得到了现实中的事物和类的对应关系
    事物 类
    属性 ----------------- 成员变量
    行为 ----------------- 成员方法
  • 定义类其实就是定义类的成员(成员变量和成员方法)
    a:成员变量 和以前定义变量是一样的,只不过位置发生了改变。在类中,方法外。
    b:成员方法 和以前定义方法是一样的,只不过把static去掉,后面在详细讲解static的作用。
  • 类和对象的概念
    a:类:是一组相关的属性和行为的集合
    b:对象:是该类事物的具体体现
    c:举例:
    类 学生
    对象 班长就是一个对象

学生类的定义和使用

  • 学生事物
    属性: 姓名 , 年龄 , 地址 …
    行为: 吃饭 , 睡觉 , 上课 …
  • 学生事物与学生类的对应关系
    属性 ----- 成员变量
    行为 ----- 成员方法
  • 文件名问题
    在一个java文件中写两个类:一个基本的类,一个测试类。
    建议:文件名称和测试类名称一致。
  • 如何使用呢?
    创建对象使用。
  • 如何创建对象呢?
    格式:类名 对象名 = new 类名();
  • 如何使用成员变量呢?
    格式:对象名.变量名
  • 如何使用成员方法呢?
    格式:对象名.方法名(…)
public class Student {
    //成员变量 :不赋值有默认值
    String name;
    int age;
    //成员方法
    public int calc(int a,int b){

        return a+b;
    }

    public void playGame(){
        System.out.println("玩会游戏");
    }
}

public class MyTest {
    public static void main(String[] args) {
        Student student = new Student();
        String name = student.name;
        int age = student.age;
        System.out.println(name);
        System.out.println(age);
        int calc = student.calc(10, 10);
        student.playGame();
        System.out.println(calc);
  }
  }

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

  • 在类中的位置不同
    成员变量:在类中方法外
    局部变量:在方法定义中或者方法声明上(形参)
  • 在内存中的位置不同
    成员变量:在堆内存
    局部变量:在栈内存
  • :生命周期不同
    成员变量:随着对象的创建而存在,随着对象的消失而消失
    局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
  • 初始化值不同
    成员变量:有默认初始化值
    局部变量:没有默认初始化值,必须定义,赋值,然后才能使用。
  • 注意事项:: 局部变量名称可以和成员变量名称一样,在方法中使用的时候,采用的是就近原则。
public class MyTest {
    public static void main(String[] args) {
        //一个Java文件中,可以定义多个类,有什么注意的,注意 public 只能在一个有main方法的类可以加上,其他类不能加public
        Dog dog = new Dog();
        dog.show("汤姆");
        //变量的访问原则,遵循就近原则:我方法中要访问一个变量,我会先在局部位置找,找到就使用
        //如果找不到,我会去成员位置找,找到就使用

    }
}

class Dog {
    //成员位置
    String name = "小花";

    public void show(String name) {
        //方法的内部和形参都属于局部位置
        //String name="aaaa";
        System.out.println(name);
        System.out.println(this.name);
    }
}

方法的形式参数是类名的时候如何调用

  • Java中参数传递问题
    形式参数
    基本类型:形式参数的改变不影响实际参数
    引用类型:形式参数的改变直接影响实际参数
  • 方法的参数是类名
    如果你看到了一个方法的形式参数是一个类类型(引用类型),这里其实需要的是该类的对象。
public class MyTest {
    public static void main(String[] args) {
        //基本数据类型,作为参数传递,形参的改变,不影响实参
        //引用输入类型,作为参数传递,形参的改变,会影响实参
        //引用数据类型:数组,类,接口
        Dog dog = new Dog();
        //如果以后看到一个方法的形参,要一个 类 类型 那么你就传一个该类的对象
        String name = "小花";
        int num = 100;
        dog.show(dog, name, num);
        System.out.println(dog.name);
        System.out.println(dog.age); 
        System.out.println(name);
        System.out.println(num);
    }
}

class Dog {
    String name;
    int age;

    public void show(Dog dog1, String name, int num) {
        System.out.println("这个方法调用了");
        name = "kitty";
        num = 100 + 1;
        dog1.name = name;
        dog1.age = num;
        System.out.println(name);
        System.out.println(num);
    }

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值