• 疯狂Java学习笔记(007)


     

     回 顾

    一、方法:

    1. 方法的定义:

      什么是方法?拥有特定功能的一个代码段,称为方法,其他语言中称为Function(函数).

    2. 方法定义的格式:

    public static 返回值类型 方法名(形参类型 参数名1,形参类型 参数名2,....){
      方法体;
      return [返回值];
    }

    3.定义方法的两个明确:

      1>返回值类型

      2>形参列表

    4. public static :

      方法的修饰符,目前的固定格式。以后会又变化。

    5. 返回值类型:

      Java中的数据类型(基本的四类八种,引用的:可以又多种多样:jdk提供的,也可以是我们自己定义的!),表示的是方法执行后需要返回值的类型!

      如果方法不需要返回任何之,就用void.

    6. 方法名:

      1>可以理解为变量名;

        (就是一段内存空间的标识!方法名就是一段代码的标识!)

      2>和变量的命名规范是一致的(即小驼峰命名法,从第二个单词开始首字母大写)

        类名和接口名的命名规则是一致的(大驼峰命名法)

        联想一下:包名和final变量名:

      3>()里整体称为形参列表;

        每个形参定义包含两方面:形参类型,形参名!形参之间用逗号分隔,如果方法不需要任何参数,什么都不屑,()必须写!!!

      4>形参类型:

        任何可用的数据类型:(基本的和引用的都可以)

      5>形参名:

        就是变量名,这个变量就是在方法体中有效,相当于在方法体中定义的局部变量!!!方法被调用时,形参就被赋值了!按照顺序传值!!!

    7. 方法体:

      0到若干条可以执行的语句,在方法被调用时,这些语句一次执行!

    8. return :

      关键字,表示一个方法的结束,如果方法又明确的返回值类型的话,return后必须有一个值(可以和方法定义时的返回值数据类型一致!或者可以自动类型转换成返回值类型的值:变量;常量;表达式)

      如果方法的定义中,返回值时void型,return后就不能加任何值!!!

      即:return;---此时整条语句都可以省略!!!

    9. 方法定义的位置:

      类定义中,和main方法时平级关系:

      方法中不能再定义其它方法(即:方法不能嵌套定义!!!)

    10. 方法的调用:

      1>方法调用时传值:

        实参:方法调用时,给方法传递的值,就是实参;

        形参:方法定义时,参数列表中出现的参数名

      2>赋值方向:实参→形参!!!

        方法名(实参);

        实参的个数一定要和形参的个数对应!

        类型:实参要么和形参类型一致,要么可以隐式类型转换!!!

        实参的种类:变量,常量,表达式

      3>  如何处理方法的返回值:

        ①有返回值的方法:

          -不关心返回值:单独调用

          -使用返回值:给其他变量赋值,直接参与表达式运算,当成参数传第给其他方法。

        ②没有返回值的方法:

          -只能单独调用

          -不能给其他变量赋值,不能直接参与表达式运算,不能当成参数传第给其他方法。

    11. 方法的重载(overload):

      两同一不同!!!

      即同类,同方法名,形参列表不同(个数不同或者类型的不同都成为形参列表不同!!!)

      方法的访问权限修饰符,以及返回值类型都不是判断方法重载的标志!

     

    练习题:

    1.定义方法,用于计算一个int数值的阶乘

    首先定义:

    //返回值类型:int

    //形参列表:int value

    /*
        1.定义方法,用于计算一个int数值的阶乘
        //返回值类型:int
        //形参列表:int value
    */
    public class HomeworkDemo1{
        public static void main(String[] abc){
            //
            int res = getNum(5);
            System.out.println(res);
            
            //
            System.out.println(getNum(5));
        }
        
        //返回值类型:int
        //形参列表:int value
        public static int getNum(int value){
            //求阶乘思想:
            int res = 1;
            for(int i = 1;i<=value;i++){
                res *= i;
            }
            return res;
        }
    }

    2.定义方法,用于获取指定范围内的一个随机值(int)

    首先定义:

    //返回值类型:int

    //形参列表:int start ,int end

    /*
    
    定义方法,用于获取指定范围内的一个随机值(int)
    //返回值类型:int
    //形参列表:int start,int end
    */ public class HomeworkDemo2{ public static void main(String[] args){ int start = 10; int end = 20; System.out.println("随机值是: " + getRandom(start,end)); } //返回值类型:int //形参列表:int start,int end public static int getRandom(int start,int end){ return (int)(Math.random() * (end - start + 1) + start); } }
    /*
    
    定义方法,用于获取指定范围内的一个随机值(int)
    //返回值类型:int
    //形参列表:int start,int end
    
    练习:
        改造: 从键盘录入起始和结束值:
    */
    import java.util.Scanner;
    public class HomeworkDemo2{
        public static void main(String[] args){
            Scanner s = new Scanner(System.in);
            System.out.print("请输入起始值:");
            int start = s.nextInt();
            System.out.println("请输入最终值:");        
            int end = s.nextInt();
            System.out.print("随机值是: " + getRandom(start,end));
            
        }
        
        //返回值类型:int
        //形参列表:int start,int end
        public static int getRandom(int start,int end){
            return (int)(Math.random() * (end - start + 1) + start);
        }
        
        
    }

     做练习题

    第七天  数组


    一、数组

          

       数组的特点

      

        数组定义格式

          

      数组的初始化形式:

    /*
        数组:array
            同一种数据类型的 〇到多个 数据的组合.
        
        数组的数据类型:就是元素的数据类型
          数组的长度(length):就是数组中数值的个数:
          元素(element):数组的各个数值称为元素
          索引(index):数组中各个元素的编号:从0开始,最大值是:数组的长度-1
        
        数组类型是引用数据类型:
            数组名保存的是一段内存空间的地址!
            真正的元素保存在那段内存空间中!!!
               
        为什么使用数组:
            减少定义变量名
            方便对一组数据进行操作
        
        定义数组的格式:(即:初始化数组的方式:)
            两种:
            > 定义时不指定初始值:只指定数组的长度,(动态初始化)
                数据类型 变量名 = 初始值;
                
                元素类型[] 数组名 = new 元素类型[数组长度];
                例如:
                    定义一个数组,可以存放5个int型数据.
                    int[] arrInt = new int[5];
                
            > 定义时就指定初始值:(静态初始化)
                元素类型[] 数组名 = new 元素类型[]{元素1,元素2,...};
                例如:
                    int[] arr = new int[]{1,2,3,5};
    */
    public class ArrayDemo1{
        public static void main(String[] args){
            //定义数组
            //动态初始化:定义数组时只指定长度,不指定具体的元素值!!
            int[] arr1 = new int[5];
            //arr1保存的是一段内存地址值!
            System.out.println(arr1);//[I@15db9742
            
            //打印引用数据类型的结构:
            //[I : 表示的是数据类型:[ 表示的就是数组,I表示的是元素的类型!
            //@ : 固定的分隔符
            //15db9742 : 一个十六进制的字符串:真实的内存地址值计算出来的!!!
            
            //定义byte类型数组
            byte[] arr2 = new byte[2];
            System.out.println(arr2);
            
            boolean[] arr4 = new boolean[3];
            System.out.println(arr4);
            
            
            //初始化数组的第二种方式:定义数组时指定元素值!此时不能指定数组的长度!
            int[] arr3 = new int[]{1,2,3,4,5,6};
            System.out.println(arr3);
            
            //静态初始化的简化写法:
            int[] arr5 = {1,2,3,45};
        }
    }
    练习:
    考察一下,基本数据类型的数组的变量 ,直接打印时,其中的类型是什么字符?
    /*
    考察基本数据类型的数组变量,直接打印的结果: */ public class ArrayDemo2{ public static void main(String[] args){ byte[] a1 = new byte[2]; short[] a2 = new short[2]; char[] a3 = new char[]{'a','b','c'}; int[] a4 = new int[]{1,2,4}; boolean[] a5 = new boolean[3]; float[] a6 = new float[2]; double[] a7 = new double[2]; long[] a8 = new long[2]; // System.out.println(a1); System.out.println(a2); System.out.println(a3); //println这个方法对字符型的数组有特殊的处理方式:重载这个方法的结果是打印数组里的所有字符! System.out.println(a4); System.out.println(a5); System.out.println(a6); System.out.println(a7); System.out.println(a8); } }

    /*
        考察基本数据类型的数组变量,直接打印的结果,是内存地址的映射,不是真的内存地址,以十六进制表示:
       
    */

    public
    class PractiseDemo{ public static void main(String[] args){ System.out.print("int :"); int[] arr1 = new int[5]; System.out.println(arr1); System.out.print("byte :"); byte[] arr2 = new byte[5]; System.out.println(arr2); System.out.print("short :"); short[] arr3 = new short[5]; System.out.println(arr3); System.out.print("long :"); long[] arr4 = new long[5]; System.out.println(arr4); System.out.print("char :"); char[] arr5 = new char[5]; System.out.println(arr5); System.out.print("float :"); float[] arr6 = new float[5]; System.out.println(arr6); System.out.print("double :"); double[] arr7 = new double[5]; System.out.println(arr7); System.out.print("boolean :"); boolean[] arr8 = new boolean[5]; System.out.println(arr8); } }

    打印结果:注意long型开始时J,boolean型区别于byte是Z,而char类型字符型的数组有特殊的处理方式:重载这个方法的结果是打印数组里的所有字符!

      jvm

    1.描述:  1>.jvm:实际上也是一种软件.
      2>.jvm实际上只是一种标准,任何组织都可以自己开发jvm虚拟机:
       如,淘宝自主开发的  Tao JVM

    2. jvm如何对内存进行区域的划分:
      对内存的划分就是方便对数据的管理:

    3. 通常会划分5大区域:
      栈区:stack
      堆区:heap
      方法区:method area
      本地方法栈:native method stack(基本不用)
      程序计数器:program counter(基本不用)

    4. 不同的jvm虚拟机对内存空间的划分是不一样的.
      1> 栈区:stack
        方法中定义的局部变量(和形参)都是在栈区:
        栈区中的变量没有初始值,使用之前必须手动赋值!!
      2> 堆区:heap
        凡是new出来的对象都是在堆区!
          Scanner s = new ...
          int[] arr = new ...
        ps:堆区中的变量都有初始值!!!

      3> 方法区:method area
        用来存放.class字节码文件和方法定义的!

    4. .java -> .class -> 方法区!!

     

    5. 数组的内存结构

    5.代码学习

      1>定义基本数据类型的数组,查看每种数据类型的默认值,其实有点消极。

        整数:0
           浮点数:0.0
             布尔型:false
                  引用数据类型:null

     1 /*
     2     验证:
     3         1.数组的默认值:
     4         2.数组元素的访问方式:
     5             数组名[索引值]
     6     练习:定义基本数据类型的数组,有2个元素.考察他们的默认值:
     7         
     8 */
     9 public class ArrayDemo3{
    10     public static void main(String[] args){
    11         //定义一个数组
    12         int[] arr = new int[3];  
    13         //在堆空间中开辟3个空间,每个空间可以存放一个int型元素.初始值为0.
    14         //然后把首元素的地址(也就是整个数组的地址)赋值给栈空间中的变量arr
    15         
    16         //验证默认值:
    17         System.out.println(arr[0]);
    18         System.out.println(arr[1]);
    19         System.out.println(arr[2]);
    20         
    21         //如何对数组元素赋值:
    22         arr[2] = 10;
    23         System.out.println(arr[2]);
    24         
    25         arr[2] = 20;
    26         System.out.println(arr[2]);
    27         
    28     }
    29 }
    /* 
        练习:定义基本数据类型的数组,有2个元素.考察他们的默认值: 
        
        考察基本数据类型和引用数据类型的数组的默认值!
        整数:0
        浮点数:0.0
        布尔型:false
        引用数据类型:null
    
    */
    
    public class PractiseDemo{
        public static void main(String[] args){
            System.out.println("int 默认值为");
            int[] a4 = new int[2];
            System.out.println(a4[0]);
            System.out.println(a4[1]);
    
            System.out.println("byte 默认值为");
            byte[] a1 = new byte[2];
            System.out.println(a1[0]);
            System.out.println(a1[1]);        
            
            System.out.println("short 默认值为");
            short[] a2 = new short[2];
            System.out.println(a2[0]);
            System.out.println(a2[1]);        
                    
            System.out.println("chare 默认值为");
            char[] a3 = new char[]{'a','b','c'};
            System.out.println(a3[0]);
            System.out.println(a3[1]);    
            
            System.out.println("boolean 默认值为");
            boolean[] a5 = new boolean[3];
            System.out.println(a5[0]);
            System.out.println(a5[1]);        
            
            System.out.println("float 默认值为");
            float[] a6 = new float[2];
            System.out.println(a6[0]);
            System.out.println(a6[1]);    
            
            System.out.println("double 默认值为");
            double[] a7 = new double[2];
            System.out.println(a7[0]);
            System.out.println(a7[1]);
            
            System.out.println("long 默认值为");
            long[] a8 = new long[2];
            System.out.println(a8[0]);
            System.out.println(a8[1]);
                
        }
    }

    结果为:

    练习:
    1.Java中数组的初始化方式有哪两种?
    2.jvm虚拟机的内存划分成几个区域,各个区域都有什么特点?
    3.以下每条语句执行时,内存中都发生了什么变化?
    int[] arr = new int[2];
    arr[1] = 10;
    4.定义一个方法,参数是一个int数组.在方法中把所有的元素都打印出来.

     回答:

    1. 两种:
            > 定义时不指定初始值:只指定数组的长度,(动态初始化)

         动态初始化:定义数组时只指定数组的长度,里面的元素都是默认值
                  数据类型 变量名 = 初始值;
                  元素类型[] 数组名 = new 元素类型[数组长度];
                  例如:
                      定义一个数组,可以存放5个int型数据.
                      int[] arrInt = new int[5];
               
            > 定义时就指定初始值:(静态初始化)

         静态初始化:定义数组时就指定数组元素的值。
                  元素类型[] 数组名 = new 元素类型[]{元素1,元素2,...};
                  例如:
                      int[] arr = new int[]{1,2,3,5};

     2.一共有五个区域,分别是:

      1> 栈区:stack
        方法中定义的局部变量(和形参)都是在栈区:
        栈区中的变量没有初始值,使用之前必须手动赋值!!

        方法调用完毕,方法中定义的变量所占用的空间,就释放了!!

      2> 堆区:heap
        凡是new出来的对象都是在堆区!
          Scanner s = new ...
          int[] arr = new ...
        ps:堆区中的变量都有初始值!!!

          整型:0

          浮点型:0.0

          布尔型:false

          引用数据类型:null

      3> 方法区:method area
        用来存放.class字节码文件和方法定义的区域 !

    具体的说:

                    

    3. 以下每条语句执行时,内存中都发生了什么变化?
      int[] arr = new int[4]; 
      arr[3] = 10;

     

    4.定义一个方法,参数是一个int数组.在方法中把所有的元素都打印出来.

     1 import java.util.Scanner;
     2 public class PractiseDemo{
     3     public static void main(String[] args){
     4         Scanner s = new Scanner(System.in);
     5         System.out.print("请输入一个数字: ");
     6         int x = s.nextInt();
     7         list(x);
     8     }
     9     public static void list(int value){
    10         int[] arr = new int[value];
    11             for(int i =0;i<=(value-1);i++ ){
    12             System.out.println(arr[i]);
    13             }
    14     }
    15 }
     1 /*
     2     数组的遍历:traversal
     3         依次访问数组中每个元素的机制:
     4     
     5     如果程序中出现大量重复的代码,考虑优化:
     6         目前优化有两种方式:
     7             1.循环
     8             2.封装成方法
     9     
    10     
    11 */
    12 public class ArrayDemo5{
    13     public static void main(String[] args){
    14         int[] arr = {1,2,3,4,5,6,7,8,9,10};
    15         
    16         /*
    17         System.out.println(arr[0]);
    18         System.out.println(arr[1]);
    19         System.out.println(arr[2]);
    20         System.out.println(arr[3]);
    21         System.out.println(arr[4]);
    22         */
    23         
    24         //使用循环改进打印数组的元素
    25         /*
    26         for(int i = 0;i<5;i++){
    27             System.out.println(arr[i]);
    28         }
    29         */
    30         
    31         //数组的长度是我们查出来的,有可能数组是通过方法传递进来的.
    32         //必须让程序自己计算数组的长度.
    33         //数组有一个属性:length,代表的就是数组的长度(数组的元素的个数)
    34         for(int i = 0;i<arr.length;i++){
    35             System.out.println(arr[i]);
    36         }
    37         
    38     }
    39 }
     1 /*
     2     数组操作容易见到的两个问题:
     3         1.数组索引越界异常:java.lang.ArrayIndexOutOfBoundsException:
     4             0 length-1
     5                 -1 length+1
     6         2.空指针异常:java.lang.NullPointerException
     7             数组类型的变量,不再指向内存中的数组.而是指向null值.
     8             此时用数组名[索引值] 就会出现空指针异常.
     9             
    10             
    11 */
    12 public class ArrayDemo7{
    13     public static void main(String[] args){
    14         int[] arr = {1,2,3,5};
    15         
    16         // java.lang.ArrayIndexOutOfBoundsException:
    17         //运行时异常,在编译阶段不检查越界异常!!!报错信息中会提示错误的索引值!
    18         // System.out.println(arr[40]);
    19         
    20         //空指针异常:
    21         // arr = null;
    22         // System.out.println(arr[0]);//java.lang.NullPointerException:空指针异常!运行时异常:
    23         
    24     }
    25     
    26 }
     1 /*
     2 定义一个方法,参数是一个int数组.在方法中把所有的元素都打印出来
     3 */
     4 public class ArrayDemo6{
     5     public static void main(String[] args){
     6         //调用方法
     7         int[] arr = {1,2,3,5,6};
     8         
     9         printArray(arr);
    10         printArray2(arr);
    11     }
    12     //返回值类型:void
    13     //形参列表:int[] arr
    14     public static void printArray(int[] arr){
    15         //
    16         for(int i = 0;i<arr.length;i++){
    17             System.out.println(arr[i]);
    18         }
    19     }
    20     
    21     //
    22     public static void printArray2(int[] arr){
    23         //
    24         for(int i = 0;i<arr.length;i++){
    25             System.out.print(arr[i]);
    26             //判断是否是最后一个元素:(索引值是长度值-1就说名是最后一个元素)
    27             if(i != arr.length - 1){
    28                 System.out.print(",");
    29             }
    30         }
    31     }
    32     
    33     
    34 }

    /*
        求最值的思路:
        求最大值:
            先定义一个变量,初始值是数组的第一个元素!!
            然后从第二个元素开始遍历数组,
                判断:
                    如果遇到了比变量大的值,让元素的值赋值给变量.
            遍历完成后,整个数组的最大值就保存在变量中!!
            
        求最小值:
            先定义一个变量,初始值是数组的第一个元素!!
            然后从第二个元素开始遍历数组,
                判断:
                    如果遇到了比变量小的值,让元素的值赋值给变量.
            遍历完成后,整个数组的最小值就保存在变量中!!
            
    */
    public class ArrayDemo8{
        public static void main(String[] args){
            int[] arr = {9,5,2,70};
            System.out.println("最大值是: " + getMax(arr));
        }
        //获取最大值:
        //返回值类型:int
        //形参列表:int[] arr
        public static int getMax(int[] arr){
            //遍历数组,获取最大值
            int max = arr[0];
            
            //从第二个元素开始遍历数组
            for(int i = 1;i<arr.length;i++){
                //判断
                if(arr[i] > max){
                    max = arr[i];
                }
            }
            //
            return max;
        }
    }
  • 相关阅读:
    python eval lmbda
    python函数--day14-03
    深浅拷贝--day14-02
    数据结构与算法--排序
    数据结构与算法--栈(stack)与队列(queue)
    完全背包的计数问题
    [题解] Codeforces Round #568 (Div. 2) C题题解
    [题解] Codeforces Round #640 (Div. 4) C题 题解
    数据结构——程序设计(一)单链表功能的操作与实现
    [题解] Codeforces Round #708 (Div. 2) C1 题解报告
  • 原文地址:https://www.cnblogs.com/akinodoo/p/9855558.html
Copyright © 2020-2023  润新知