Day05_Java basic

方法

简述:实现特定功能的代码块

格式


修饰符: 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2…){
          函数体;
          return 返回值;
}

方法格式的解释说明

  • 修饰符

    • 修饰符比较多,后面会详细介绍。目前public static

  • 返回值类型

    • 用于限定返回值的数据类型 (有可能我们执行的特定功能就是一个复杂的运算,返回值类型就是用来规定,计算结果最终的数据类型的

  • 方法名

    • (标识符) 我们自己可以定义的名字

    • 一个单词: 方法名全部小写

    • 多个单词: 第一个单词,首字母小写,从第二个单词开始,每个单词首字母大写

  • 参数类型

    • 形式参数:参数类型 参数名1,参数类型 参数名2… (和变量定义很相似) 就相当于方法中定义的变量

      扫描二维码关注公众号,回复: 613824 查看本文章
    • 实际参数(存在于方法,存在于方法调用):实际在执行方法时,形式参数的初始值 (和形式参数是赋值关系)

  • 参数名

    • 是一个变量,接收调用方法时传入的参数

  • 函数体

    • 实现方法特定功能的一条或者多条语句

  • return

    • 结束方法以及 返回 方法指定类型(返回值类型)的值,(将最终计算的结果,传递到方法调用的地方

  • 返回值

    • 程序被return带回的结果,返回给调用者

如何写一个方法呢?两个明确

  1. 返回值类型 明确功能结果的数据类型

  2. 参数列表 明确有几个参数,以及参数的类型

有明确返回值的方法调用:

  • 单独调用,没有意义

  • 输出调用,有意义,但是不够好,因为我不一定非要把结果输出

  • 赋值调用,推荐方式

方法的使用:(究竟使用哪种方式调用,取决于,方法调用使用的场景)

  1. 有返回值的方法的使用

  2. 没有返回值的方法的使用 只有一种调用方式就是直接调用 (纯粹的操作,不关心操作结果)

方法定义的注意事项:

  1. 方法不能嵌套定义,方法之间是平行关系

  2. 方法定义,在运行代码不会自动运行,必须通过方法调用的方式来执行我们的方法代码,方法不调用不执行

  3. 方法定义的时候参数之间用 逗号 隔开

  4. 方法调用的时候不用在传递数据类型 不要这样调用方法: add(int x, int y)

  5. 如果方法有明确的返回值,一定要有return带回一个值 //有返回值的方法

  • 为什么我们的代码没有调用main方法,main总是可以执行呢?main不是我们的代码调用,是虚拟机来调用的。



       //第一种调用形式-直接调用,直接通过方法名调用,一般不使用这种方式,来进行方法调用
       // x, y 就是我们的实际参数
       add(x, y);

       //第二种,方法调用的方式-输出调用,输出调用也不太好
       System.out.println(add(x, y));

       //第三种调用方式,赋值调用(通常我们使用的最多的方法调用形式就是,赋值调用)
       int result = add( x, y);
       System.out.println(result);

public class MethodDemo1 {

  public static void main(String[] args) {
   
      //没有返回值的方法调用,因为没有返回值,所以我们不关心方法的返回结果
      // 1.直接调用
          test(10);
      // 2.输出调用 对于没有返回值的方法,不能使用输出调用
      System.out.println(test(10));

      // 3. 赋值调用 对于没有返回值的方法,不能使用赋值调用
      //   void 不是任何变量的类型,void只有一种使用场景,在定义无返回值的方法的时候,指明方法是没有返回值的
        void i =test(10);

  }


  public static int add(int a, int b) {

      //实现方法的特定功能:两数求和
      // c 变量中就存储了计算的最终结果
      int c = a + b;

      //通过return 语句将最终的计算结果,传递给调用者使用
      return c;
  }

  // 定义没有返回值的方法,即使方法没有返回值,我们也必须在方法定义中指明没有返回值
  // 通过一个特殊的类型: void
  public static void test(int add) {

      System.out.println("i = " + add);
  }

}

方法调用过程图解


方法重载

产生的原因,只是方便使用者来使用方法

定义

在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数\参数类型不同\参数顺序不同)

编译器,在区分不同方法的时候:一定不仅仅只用方法名来区分,方法名+参数列表

注意:在区分不同方法的时候,并不考虑方法的返回值

哪些重载方式:

  1. 参数个数:

  2. 参数类型不同:

  3. 参数顺序不同: 是指参数列表中的参数的类型顺序不同

方法重载特点

  1. 与返回值类型无关,只看方法名和参数列表

  2. 在调用时,虚拟机通过参数列表的不同来区分同名方法


public class Overload{

  public static void main(String[] args) {

      // 2数相加的功能
      int add = add(10, 20);

      // 3数相加
      int i = add3(10, 20, 30);

      //4数相加
      int i1 = add3(10, 20, 30, 40);

      // + 不管是字符串拼接也好还是,数值加法也好
      System.out.println(1 + 2);
      System.out.println("1" + "2");

      //两数求和的调用,利用方法重载,可以使得用户调用方法的时候更方便
      int d = add(10,20);
      add(10, 20, 30);
      add(10, 20, 30 ,40);

        add(10, 20);
  }

  public static int add(int a, int b) {

      //实现方法的特定功能:两数求和
      //c 变量中就存储了计算的最终结果
      int c = a + b;

      //通过return 语句将最终的计算结果,传递给调用者使用
      return c;
  }

  public static int add(int a, int b, int c) {
      int d = add(a, b) + c;
//       return d;

      return add(a, b) + c;
  }


  public static int add(int a, int b, int c, int d) {
      return add(a, b, c) + d;
  }

    //编译器在区分不同的方法时,并不考虑返回值
//   public static void add(int a, int b, int c, int d){
//
//   }


  // 第二种重载方式:参数类型不同
  public static double add(int a, float b) {
      return a + b;
  }

  //第三种重载方式: 参数顺序不同(类型顺序,而不是形式参数的名称的顺序)
  public static double add(float a, int b) {
      return a+b;
  }

}

数组

数组概念

  1. 数组是存储同一种数据类型多个元素的集合。也可以看成是一个容器。

  2. 数组既可以存储基本数据类型,也可以存储引用数据类型。(对象的地址)

数组的特征图解

数组的定义格式

有两种定义格式,但是,我们推荐大家使用的是第一种格式

格式1:数据类型[] 数组名;

格式2:数据类型 数组名[ ];

数组的初始化

数组初始化概述:
  1. Java中的数组必须先初始化,然后才能使用。

  2. 所谓初始化:就是为数组中的数组元素分配内存空间,并为每个数组元素赋值。

数组的初始化方式
  • 动态初始化:初始化时程序猿只指定数组长度,由系统为数组分配初始值。 (自己指定数组的元素个数, 初值系统指定)

  • 静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度。 (不能指定数组中的元素个数,可以指定每一个数据的初始值)

数组的动态初始化:

格式:数据类型[] 数组名 = new 数据类型[数组长度]

数组长度其实就是数组中元素的个数。

数组的静态初始化:

格式1:数据类型[ ] 数组名 = new 数据类型[]{元素1,元素2,…};

格式2,简便写法,限制,声明数组的同时。 int[] arr = {1,2,3};

静态初始化图解

动态初始化图解1

动态初始化图解2

数组操作常见的两个小问题

数组索引越界

ArrayIndexOutOfBoundsException

访问到了数组中的不存在的索引时发生。

一般我们初始化一个数组完成之后(包含的元素个数有限,是n个),数组的索引应该是有一个范围[0 - n-1],如果访问数组的索引超出了[0 - n -1]这个范围,就会数组索引越界

空指针异常

NullPointerException

数组引用没有指向实体,却在操作实体中的元素时。

空指针异常是指:当引用变量的值为null(空,没有),访问这个引用变量所指向的对空间

空指针异常图解


java为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。

  • 栈:存储局部变量 以及 栈帧 局部变量:就是在方法体中定义的局部变量

  • 堆: 存储new出来的东西,比如数组

  • 方法区:字节码文件内容等

  • 本地方法栈(系统相关) 本地方法:指非java语言实现,c,c++,JNI,非Java语言

  • 程序计算器:指明当前正在执行的Java指令(100多条指令,00011110),就是一个数,用来指明当前程序执行第几条java指令。

1.栈内存中存储的是局部变量 1.new出来的东西
2. 栈内存中的东西,显示初始化之后,在使用(代码初始化) 2. 堆上的数据天生有初值 —— byte short int long 0 ;——float,double 0.0 ;—— boolean false ——引用数据类型 null
3.栈中的变量,一旦方法运行完之后,栈中的局部变量的内存空间会立马被系统回收 3.堆中变量,使用完毕之后就变成垃圾,但是这些资源不是立马被系统回收,当系统中的垃圾回收器运行的时候被回收

int[] a = new int[3];

普通的基本类型数据:存的就是数值

引用变量:地址

java:是没有办法直接操作空间,只能通过引用变量,间接访问空间

存在的目的:程序只能通过引用变量,间接访问。

 

猜你喜欢

转载自www.cnblogs.com/liaoguanwang/p/9029026.html
今日推荐