java方法以及与C语言对比学习

目录

方法概述

方法的概念

方法的定义和调用

无参数方法定义和调用

无参数方法例

带参数方法定义和调用

带参数方法定义和调用

参和实参

带参数方法例

如何判断用无参还是有参方法

带返回值方法的定义和调用

带返回值方法定义和调用

带返回值方法练习

方法的注意事项

方法的注意事项

方法的通用格式

方法重载

方法重载

Java与C语言方法数组的相似点以及差异

Java中的方法在很多方面与C语言的函数类似,但它们存在一些差异,以下是具体介绍:

相似之处

基本功能

参数传递

返回值

不同之处

所属关系

访问控制

C语言和Java数组的相似点

C语言和Java数组的区别

内存分配

数组大小

类型检查

数组方法

多维数组

数组初始化

数组边界检查

总结:


方法概述

方法的概念

方法(method)是程序中最小的执行单元

  • 注意:

    • 方法必须先创建才可以使用,该过程成为方法定义

    • 方法创建后并不是直接可以运行的,需要手动使用后,才执行,该过程成为方法调用

方法的定义和调用

无参数方法定义和调用

  • 定义格式:

    java 复制代码
    public static void 方法名 (   ) {
        // 方法体;
    }
  • 范例:

    java 复制代码
    public static void method (    ) {
        // 方法体;
    }
  • 调用格式:

    java 复制代码
    方法名();
  • 范例:

    java 复制代码
    method();
  • 注意:

    方法必须先定义,后调用,否则程序将报错

无参数方法例

  • 需求:设计一个方法用于打印两个数中的较大数

  • 思路:

    • ①定义一个方法,用于打印两个数字中的较大数,例如getMax()

    • ②方法中定义两个变量,用于保存两个数字

    • ③使用分支语句分两种情况对两个数字的大小关系进行处理

    • ④在main()方法中调用定义好的方法

  • 代码:

java 复制代码
public class MethodTest {
    public static void main(String[] args) {
        //在main()方法中调用定义好的方法
        getMax();
    }

    //定义一个方法,用于打印两个数字中的较大数,例如getMax()
    public static void getMax() {
        //方法中定义两个变量,用于保存两个数字
        int a = 10;
        int b = 20;

        //使用分支语句分两种情况对两个数字的大小关系进行处理
        if(a > b) {
            System.out.println(a);
        } else {
            System.out.println(b);
        }
    }
}

带参数方法定义和调用

带参数方法定义和调用

  • 定义格式:

    参数:由数据类型和变量名组成 - 数据类型 变量名

    参数范例:int a

    java 复制代码
    public static void 方法名 (参数1) {
        方法体;
    }
    ​
    public static void 方法名 (参数1, 参数2, 参数3...) {
        方法体;
    }
  • 范例:

    java 复制代码
    public static void isEvenNumber(int number){
        ...
    }
    public static void getMax(int num1, int num2){
        ...
    }
    • 注意:

      复制代码
      方法定义时,参数中的数据类型与变量名都不能缺少,缺少任意一个程序将报错
      ​
      方法定义时,多个参数之间使用逗号( ,)分隔
  • 调用格式:

    java 复制代码
    方法名(参数);
    
    方法名(参数1,参数2);
  • 范例:

    java 复制代码
    isEvenNumber(10);
    
    getMax(10,20);
    • 方法调用时,参数的数量与类型必须与方法定义中的设置相匹配,否则程序将报错

参和实参

  1. 形参:方法定义中的参数

等同于变量定义格式,例如:int number

  1. 实参:方法调用中的参数

等同于使用变量或常量,例如: 10 number

带参数方法例

  • 需求:设计一个方法用于打印两个数中的较大数,数据来自于方法参数

  • 思路:

    • ①定义一个方法,用于打印两个数字中的较大数,例如getMax()

    • ②为方法定义两个参数,用于接收两个数字

    • ③使用分支语句分两种情况对两个数字的大小关系进行处理

    • ④在main()方法中调用定义好的方法(使用常量)

    • ⑤在main()方法中调用定义好的方法(使用变量)

  • 代码:

java 复制代码
public class MethodTest {
    public static void main(String[] args) {
        //在main()方法中调用定义好的方法(使用常量)
        getMax(10,20);
        //调用方法的时候,人家要几个,你就给几个,人家要什么类型的,你就给什么类型的
        //getMax(30);
        //getMax(10.0,20.0);

        //在main()方法中调用定义好的方法(使用变量)
        int a = 10;
        int b = 20;
        getMax(a, b);
    }

    //定义一个方法,用于打印两个数字中的较大数,例如getMax()
    //为方法定义两个参数,用于接收两个数字
    public static void getMax(int a, int b) {
        //使用分支语句分两种情况对两个数字的大小关系进行处理
        if(a > b) {
            System.out.println(a);
        } else {
            System.out.println(b);
        }
    }
}

如何判断用无参还是有参方法

先知道要做什么

然后看需要什么,如果不需要自然不需要参数

带返回值方法的定义和调用

带返回值方法定义和调用

  • 定义格式

    java 复制代码
    public static 数据类型 方法名 ( 参数 ) { 
    	return 数据 ;
    }
  • 范例

    java 复制代码
    public static boolean isEvenNumber( int number ) {           
    	return true ;
    }
    public static int getMax( int a, int b ) {
    	return  100 ;
    }
    • 注意:

      • 方法定义时return后面的返回值与方法定义上的数据类型要匹配,否则程序将报错
  • 调用格式

    java 复制代码
    方法名 ( 参数 ) ;
    数据类型 变量名 = 方法名 ( 参数 ) ;
  • 范例

    java 复制代码
    isEvenNumber ( 5 ) ;
    boolean  flag =  isEvenNumber ( 5 ); 
    • 注意:

      • 方法的返回值通常会使用变量接收,否则该返回值将无意义

带返回值方法练习

  • 需求:设计一个方法可以获取两个数的较大值,数据来自于参数

  • 思路:

    • ①定义一个方法,用于获取两个数字中的较大数

    • ②使用分支语句分两种情况对两个数字的大小关系进行处理

    • ③根据题设分别设置两种情况下对应的返回结果

    • ④在main()方法中调用定义好的方法并使用变量保存

    • ⑤在main()方法中调用定义好的方法并直接打印结果

  • 代码:

    java 复制代码
    public class MethodTest {
        public static void main(String[] args) {
            //在main()方法中调用定义好的方法并使用变量保存
            int result = getMax(10,20);
            System.out.println(result);
    
            //在main()方法中调用定义好的方法并直接打印结果
            System.out.println(getMax(10,20));
        }
    
        //定义一个方法,用于获取两个数字中的较大数
        public static int getMax(int a, int b) {
            //使用分支语句分两种情况对两个数字的大小关系进行处理
            //根据题设分别设置两种情况下对应的返回结果
            if(a > b) {
                return a;
            } else {
                return b;
            }
        }
    }

方法的注意事项

方法的注意事项

  • 方法不能嵌套定

  • void表示无返回值,可以省略return,也可以单独的书写return,后面不加数据或代码

方法的通用格式

  • 格式:

    java 复制代码
    public static 返回值类型 方法名(参数) {
       方法体; 
       return 数据 ;
    }
  • 解释:

    • public static 修饰符

      返回值类型 方法操作完毕之后返回的数据的数据类型

      如果方法操作完毕,没有数据返回,这里写void,而且方法体中一般不写return

      方法名 调用方法时候使用的标识

      参数 由数据类型和变量名组成,多个参数之间用逗号隔开

      方法体 完成功能的代码块

      return 如果方法操作完毕,有数据返回,用于把数据返回给调用者

  • 定义方法时,要做到两个明确

    • 明确返回值类型:主要是明确方法操作完毕之后是否有数据返回,如果没有,写void;如果有,写对应的数据类型

    • 明确参数:主要是明确参数的类型和数量

  • 调用方法时的注意:

    • void类型的方法,直接调用即可

    • 非void类型的方法,推荐用变量接收调用

方法重载

方法重载

  • 方法重载概念

    方法重载指同一个类中定义的多个方法之间的关系,满足下列条件的多个方法相互构成重载

  • 参数不同:个数不同、类型不同、顺序不同

  • 多个方法在同一个类中

  • 多个方法具有相同的方法名

  • 多个方法的参数不相同,类型不同或者数量不同

同一个类中,方法名相同,参数不同的方法。与返回值无关。

实参和形参一一对应

  • 注意:

    • 重载仅对应方法的定义,与方法的调用无关,调用方式参照标准格式

    • 重载仅针对同一个类中方法的名称与参数进行识别,与返回值无关,换句话说不能通过返回值来判定两个方法是否相互构成重载

  • 正确范例:

    java 复制代码
    public class MethodDemo {
    	public static void fn(int a) {
        	//方法体
        }
        public static int fn(double a) {
        	//方法体
        }
    }
    
    public class MethodDemo {
    	public static float fn(int a) {
        	//方法体
        }
        public static int fn(int a , int b) {
        	//方法体
        }
    }
  • 错误范例:

    java 复制代码
    public class MethodDemo {
    	public static void fn(int a) {
        	//方法体
        }
        public static int fn(int a) { 	/*错误原因:重载与返回值无关*/
        	//方法体
        }
    }
    
    public class MethodDemo01 {
        public static void fn(int a) {
            //方法体
        }
    } 
    public class MethodDemo02 {
        public static int fn(double a) { /*错误原因:这是两个类的两个fn方法*/
            //方法体
        }
    }

从内存的角度去解释基本数据类型和引用数据类型:

基本数据类型:据值是存储在自己的空间中

特点:赋值给其他变量,也是赋的真实的值。

引用数据类型:数据值是存储在其他空间中,自己空间中存储的是地址值。

特点:赋值给其他变量,赋的地址值。

传递基本数据类型时,传递的是真实的数据,形参的改变,不影响实际参数的值

传递引用数据类型时,传递的是地址值,形参的改变,影响实际参数的值

Java与C语言方法数组的相似点以及差异

Java中的方法在很多方面与C语言的函数类似,但它们存在一些差异,以下是具体介绍:

相似之处

基本功能
  • 都是代码的封装单元,用于实现特定的功能。例如,在C语言中,可以编写一个计算两个数之和的函数:

    cs 复制代码
    int add(int a, int b) {
        return a + b;
    }

    在Java中,可以编写一个具有相同功能的方法:

    java 复制代码
    public int add(int a, int b) {
        return a + b;
    }

    这两个代码片段都实现了将两个整数相加并返回结果的功能,将相关代码封装起来,便于在程序中多次调用。

参数传递
  • 都可以接受参数。C语言函数和Java方法都可以通过参数列表接收外部传入的数据。例如,上面的add函数和方法都接收两个整数参数ab,在方法或函数内部可以使用这些参数进行计算等操作。
返回值
  • 都可以有返回值。可以指定返回值的类型,如果不需要返回值,C语言可以使用void类型,Java可以使用void关键字。例如,一个返回字符串的C语言函数和Java方法:

  • C语言

复制代码
 ```cs
 char* greet() {
     return "Hello, C!";
 }
 ```

 java
复制代码
 ```java
 public String greet() {
     return "Hello, Java!";
 }
 ```
  • 当然,也可以没有返回值,如:

    C语言

    cs 复制代码
    void printHello() {
        printf("Hello, C!\n");
    }

    java

    java 复制代码
    public void printHello() {
        System.out.println("Hello, Java!");
    }

不同之处

所属关系
  • C语言的函数是独立的,不属于任何类。它存在于全局作用域中,通过函数名就可以直接调用。

  • Java的方法必须定义在类中,它是类的一部分。例如:

    java

    java 复制代码
    public class Calculator {
        public int add(int a, int b) {
            return a + b;
        }
    }

    要调用add方法,需要先创建Calculator类的实例,然后通过实例调用方法:

    java

    java 复制代码
    Calculator calc = new Calculator();
    int result = calc.add(3, 4);
访问控制
  • C语言的函数没有访问控制修饰符,所有函数默认都是公开的,可以在程序的任何地方调用。

  • Java的方法有访问控制修饰符,如publicprivateprotected等。public方法可以被任何其他类访问,private方法只能在定义它的类内部访问,protected方法可以被同一包内的类以及所有子类访问。例如:

    java

    java 复制代码
    public class MyClass {
        private void privateMethod() {
            // 仅在MyClass类内部可以调用
        }
        protected void protectedMethod() {
            // 同一包内类以及子类可以调用
        }
        public void publicMethod() {
            // 任何其他类都可以调用
        }
    }
  1. 重载

    • C语言不支持函数重载。函数名必须唯一,参数列表不同也不能定义同名函数。

    • Java支持方法重载。可以在同一个类中定义多个同名方法,只要它们的参数列表(参数的类型、个数或顺序)不同即可。例如:

      java

      java 复制代码
      public class MyClass {
          public void print(int num) {
              System.out.println("整数:" + num);
          }
          public void print(double num) {
              System.out.println("浮点数:" + num);
          }
          public void print(String str) {
              System.out.println("字符串:" + str);
          }
      }

      这样可以根据传入参数的不同类型调用相应的方法。

总的来说,Java的方法在继承了C语言函数基本功能的基础上,融入了面向对象编程的特性,如必须属于类、具有访问控制等,使其在类的封装和继承等场景中发挥重要作用。

C语言和Java数组的相似点

  1. 基本概念:两者都是用于存储多个相同类型数据的集合。可以将多个数据项组织在一起,通过索引进行访问和操作。

  2. 声明方式:都可以指定数组的类型和大小(除了C语言的动态数组)。例如,声明一个包含5个整数的数组:

    • C语言:int arr[5];

    • Java:int[] arr = new int[5];int[] arr = {0, 0, 0, 0, 0};

  3. 索引访问:都使用索引来访问数组元素,索引从0开始。例如,访问第一个元素:

    • C语言:arr[0]

    • Java:arr[0]

  4. 遍历方式:都可以使用循环结构(如for循环)来遍历数组中的每个元素。例如,遍历并打印数组中的所有元素:

    • C语言:

      cs 复制代码
      for (int i = 0; i < 5; i++) {
          printf("%d ", arr[i]);
      }
    • Java:

      java 复制代码
      for (int i = 0; i < arr.length; i++) {
          System.out.print(arr[i] + " ");
      }

C语言和Java数组的区别

内存分配

  • C语言 :数组可以是静态分配的(在栈上分配内存,大小在编译时确定)或动态分配的(使用malloccalloc等函数在堆上分配内存,大小在运行时确定)。例如,动态分配数组:

    java 复制代码
    int* arr = (int*)malloc(5 * sizeof(int));

    使用完毕后需要手动释放内存:

    cs 复制代码
    free(arr);
  • Java :数组总是动态分配的,内存由Java虚拟机(JVM)自动管理。创建数组时使用new关键字,例如:

    java 复制代码
    int[] arr = new int[5];

    当数组不再被引用时,JVM的垃圾回收器会自动回收内存,不需要手动释放。

数组大小

  • C语言:数组的大小在声明时必须确定,除非使用动态内存分配。一旦分配,数组大小不能改变。

  • Java :数组的大小在创建时确定,但可以通过创建新的数组并复制元素来实现动态效果。Java还提供了ArrayList等集合类,可以动态改变大小。

类型检查

  • C语言:类型检查较弱。可以将一个数组指针赋值给另一个不同类型的指针,但需要显式类型转换。例如:

    cs 复制代码
    int arr1[5];
    double* ptr = (double*)arr1;  // 显式类型转换
  • Java:类型检查严格。数组类型在编译时检查,不能将一个数组引用赋值给另一个不同类型的数组引用。例如:

    java 复制代码
    int[] arr1 = {1, 2, 3, 4, 5};
    double[] arr2 = arr1;  // 编译错误

数组方法

  • C语言 :标准库中没有专门的数组方法。需要手动编写函数来实现数组的排序、查找等操作。例如,排序可以使用qsort函数:

    cs 复制代码
    qsort(arr, 5, sizeof(int), compare);

    其中compare是一个比较函数。

  • Java :提供了丰富的数组方法,如Arrays.sort()用于排序,Arrays.binarySearch()用于二分查找,Arrays.copyOf()用于复制数组等。例如:

    java 复制代码
    Arrays.sort(arr);
    int index = Arrays.binarySearch(arr, 3);
    int[] newArr = Arrays.copyOf(arr, 10);  // 复制并扩展数组

多维数组

  • C语言:多维数组在内存中是连续存储的。例如,二维数组:

    cs 复制代码
    int arr[2][3] = {
        {1, 2, 3},
        {4, 5, 6}
    };

    内存布局是连续的:1, 2, 3, 4, 5, 6

  • Java:多维数组是数组的数组。例如,二维数组:

  • 二维数组的静态初始化

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

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

    java 复制代码
    int[][] arr = {
        {1, 2, 3},
        {4, 5, 6}
    };

    内存布局是每个一维数组单独分配内存,二维数组是一个包含一维数组引用的数组。这种结构使得Java的多维数组可以是不规则的,即每行的长度可以不同:

    java 复制代码
    int[][] arr = {
        {1, 2, 3},
        {4, 5},
        {6, 7, 8, 9}
    };

数组初始化

  • C语言:可以在声明时初始化数组,未初始化的元素默认为0(对于全局数组)或未定义(对于局部数组)。例如:

    cs 复制代码
    int arr[5] = {1, 2, 3};  // 未初始化的元素为0
  • Java :可以在声明时初始化数组,未初始化的元素默认为0(对于整数数组)、false(对于布尔数组)、null(对于对象数组)等。例如:

    java 复制代码
    int[] arr = {1, 2, 3};  // 未初始化的元素为0

数组边界检查

  • C语言:没有内置的数组边界检查。访问数组时,如果索引越界,程序可能会崩溃或产生未定义行为。例如:

    cs 复制代码
    int arr[5];
    arr[10] = 1;  // 越界访问,可能导致程序崩溃
  • Java :有严格的数组边界检查。访问数组时,如果索引越界,会抛出ArrayIndexOutOfBoundsException异常。例如:

    java 复制代码
    int[] arr = new int[5];
    arr[10] = 1;  // 抛出ArrayIndexOutOfBoundsException

总结:

  • 相似点:C语言和Java数组都是用于存储多个相同类型数据的集合,都可以通过索引访问和遍历。

  • 区别:C语言数组在内存管理、类型检查、数组方法、多维数组等方面较为灵活但需要手动管理,而Java数组在内存管理、类型检查、数组方法等方面更为严格和自动化,提供了更多的内置方法和动态特性。

相关推荐
小龙报几秒前
《C语言疑难点 --- C语内存函数专题》
c语言·开发语言·c++·创业创新·学习方法·业界资讯·visual studio
TDengine (老段)6 分钟前
TDengine 数学函数 CRC32 用户手册
java·大数据·数据库·sql·时序数据库·tdengine·1024程序员节
心随雨下25 分钟前
Tomcat日志配置与优化指南
java·服务器·tomcat
Kapaseker31 分钟前
Java 25 中值得关注的新特性
java
wljt35 分钟前
Linux 常用命令速查手册(Java开发版)
java·linux·python
撩得Android一次心动38 分钟前
Android 四大组件——BroadcastReceiver(广播)
android·java·android 四大组件
canonical_entropy41 分钟前
Nop平台到底有什么独特之处,它能用在什么场景?
java·后端·领域驱动设计
chilavert31844 分钟前
技术演进中的开发沉思-174 java-EJB:分布式通信
java·分布式
学习_学习_再学习1 小时前
ffmpeg学习记录
学习·ffmpeg
Shylock_Mister1 小时前
ESP32堆栈空间优化全攻略
c语言·嵌入式硬件·物联网