【大数据】学习笔记 1 Java SE 第5章 面向对象基础(上) 5.4 方法(Method)

傷城~ 2024-03-22 11:13 73阅读 0赞

【大数据】学习笔记

文章目录

    • 【大数据】学习笔记
      • 1 Java SE
        • 第5章 面向对象基础(上)
          • 5.4 方法(Method)
            • 5.4.1 方法的概念
            • 5.4.2 方法的特点
            • 5.4.3 如何声明方法
            • 5.4.4 如何调用实例方法
            • 5.4.5 实例方法使用当前对象的成员
            • 5.4.6 方法调用内存分析
            • 5.4.7 实例变量与局部变量的区别

在这里插入图片描述

1 Java SE

第5章 面向对象基础(上)
5.4 方法(Method)
5.4.1 方法的概念

方法也叫函数,是一组代码语句的封装,从而实现代码重用,从而减少冗余代码,通常它是一个独立功能的定义,

方法是一个类中最基本的功能单元。

  1. Math.random()的random()方法
  2. Math.sqrt(x)的sqrt(x)方法
  3. System.out.println(x)的println(x)方法
  4. Scanner input = new Scanner(System.in);
  5. input.nextInt()的nextInt()方法
5.4.2 方法的特点

(1)必须先声明后使用

类,变量,方法等都要先声明后使用

(2)不调用不执行,调用一次执行一次。

5.4.3 如何声明方法

【1】声明方法的位置

声明方法的位置必须在类中方法外,即不能在一个方法中直接定义另一个方法。

声明位置示例:

  1. 类{
  2. 方法1(){
  3. }
  4. 方法2(){
  5. }
  6. }

错误示例:

  1. 类{
  2. 方法1(){
  3. 方法2(){
  4. //位置错误
  5. }
  6. }
  7. }

【2】声明方法的语法格式

  1. 【修饰符】 返回值类型 方法名(【形参列表 】)【throws 异常列表】{
  2. 方法体的功能代码
  3. }

(1)一个完整的方法 = 方法头 + 方法体。

  • 方法头就是 【修饰符】 返回值类型 方法名(【形参列表 】)【throws 异常列表】,也称为方法签名,通常调用方法时只需要关注方法头就可以,从方法头可以看出这个方法的功能和调用格式。
  • 方法体就是方法被调用后要指定的代码,也是完成方法功能的具体实现代码,对于调用者来说,不了解方法体如何实现的,并影响方法的使用。

(2)方法头可能包含5个部分,但是有些部分是可能缺省的

  • 修饰符:可选的。方法的修饰符也有很多,例如:public、protected、private、static、abstract、native、final、synchronized等,后面会一一学习。其中根据是否有static,可以将方法分为静态方法和非静态方法。其中静态方法又称为类方法,非静态方法又称为实例方法。我们先学习实例方法。

返回值类型: 表示方法运行的结果的数据类型,方法执行后将结果返回到调用者

  • 基本数据类型
  • 引用数据类型
  • 无返回值类型:void

方法名:给方法起一个名字,见名知意,能准确代表该方法功能的名字

参数列表:表示完成方法体功能时需要外部提供的数据列表

  • 无论是否有参数,()不能省略
  • 如果有参数,每一个参数都要指定数据类型和参数名,多个参数之间使用逗号分隔,例如:

    • 一个参数: (数据类型 参数名)
    • 二个参数: (数据类型1 参数1, 数据类型2 参数2)
  • 参数的类型可以是基本数据类型、引用数据类型
  • throws 异常列表:可选,在异常章节再讲

(3)方法体:方法体必须有{}括起来,在{}中编写完成方法功能的代码

关于方法体中return语句的说明:

  • return语句的作用是结束方法的执行,并将方法的结果返回去
  • 如果返回值类型不是void,方法体中必须保证一定有 return 返回值; 语句,并且要求该返回值结果的类型与声明的返回值类型一致或兼容。
  • 如果返回值类型为void时,方法体中可以没有return语句,如果要用return语句提前结束方法的执行,那么return后面不能跟返回值,直接写return ; 就可以。
  • return语句后面就不能再写其他代码了,否则会报错:Unreachable code

示例:

  1. package com.dingjiaxiong.test04.method;
  2. /**
  3. * @Projectname: BigDataStudy
  4. * @Classname: MethodDefineDemo
  5. * @Author: Ding Jiaxiong
  6. * @Date:2023/4/24 15:49
  7. * 方法定义案例演示
  8. */
  9. public class MethodDefineDemo {
  10. /**
  11. * 无参无返回值方法的演示
  12. */
  13. void sayHello() {
  14. System.out.println("hello");
  15. }
  16. /**
  17. * 有参无返回值方法的演示
  18. *
  19. * @param length int 第一个参数,表示矩形的长
  20. * @param width int 第二个参数,表示矩形的宽
  21. * @param sign char 第三个参数,表示填充矩形图形的符号
  22. */
  23. void printRectangle(int length, int width, char sign) {
  24. for (int i = 1; i <= length; i++) {
  25. for (int j = 1; j <= width; j++) {
  26. System.out.print(sign);
  27. }
  28. System.out.println();
  29. }
  30. }
  31. /**
  32. * 无参有返回值方法的演示
  33. *
  34. * @return
  35. */
  36. int getIntBetweenOneToHundred() {
  37. return (int) (Math.random() * 100 + 1);
  38. }
  39. /**
  40. * 有参有返回值方法的演示
  41. *
  42. * @param a int 第一个参数,要比较大小的整数之一
  43. * @param b int 第二个参数,要比较大小的整数之二
  44. * @return int 比较大小的两个整数中较大者的值
  45. */
  46. int max(int a, int b) {
  47. return a > b ? a : b;
  48. }
  49. }
5.4.4 如何调用实例方法

【1】方法调用语法格式

  1. 对象.非静态方法(【实参列表】)

例如:

  1. package com.dingjiaxiong.test04.method;
  2. /**
  3. * @Projectname: BigDataStudy
  4. * @Classname: MethodInvokeDemo
  5. * @Author: Ding Jiaxiong
  6. * @Date:2023/4/24 15:51
  7. */
  8. /**
  9. * 方法调用案例演示
  10. */
  11. public class MethodInvokeDemo {
  12. public static void main(String[] args) {
  13. //创建对象
  14. MethodDefineDemo md = new MethodDefineDemo();
  15. System.out.println("-----------------------方法调用演示-------------------------");
  16. //调用MethodDefineDemo类中无参无返回值的方法sayHello
  17. md.sayHello();
  18. md.sayHello();
  19. md.sayHello();
  20. //调用一次,执行一次,不调用不执行
  21. System.out.println("------------------------------------------------");
  22. //调用MethodDefineDemo类中有参无返回值的方法printRectangle
  23. md.printRectangle(5, 10, '@');
  24. System.out.println("------------------------------------------------");
  25. //调用MethodDefineDemo类中无参有返回值的方法getIntBetweenOneToHundred
  26. md.getIntBetweenOneToHundred();//语法没问题,就是结果丢失
  27. int num = md.getIntBetweenOneToHundred();
  28. System.out.println("num = " + num);
  29. System.out.println(md.getIntBetweenOneToHundred());
  30. //上面的代码调用了getIntBetweenOneToHundred三次,这个方法执行了三次
  31. System.out.println("------------------------------------------------");
  32. //调用MethodDefineDemo类中有参有返回值的方法max
  33. md.max(3, 6);//语法没问题,就是结果丢失
  34. int bigger = md.max(5, 6);
  35. System.out.println("bigger = " + bigger);
  36. System.out.println("8,9中较大者是:" + md.max(8, 9));
  37. }
  38. }

在这里插入图片描述

回忆之前的代码:

  1. //1、创建Scanner的对象
  2. Scanner input = new Scanner(System.in);//System.in默认代表键盘输入
  3. //2、提示输入xx
  4. System.out.print("请输入一个整数:"); //对象.非静态方法(实参列表)
  5. //3、接收输入内容
  6. int num = input.nextInt(); //对象.非静态方法()

【2】形参和实参

  • 形参(formal parameter):在定义方法时方法名后面括号中声明的变量称为形式参数(简称形参)即形参出现在方法定义时。
  • 实参(actual parameter):调用方法时方法名后面括号中的使用的值/变量/表达式称为实际参数(简称实参)即实参出现在方法调用时。
  • 调用时,实参的个数、类型、顺序顺序要与形参列表一一对应。如果方法没有形参,就不需要也不能传实参。
  • 无论是否有参数,声明方法和调用方法是==()都不能丢失==

【3】返回值问题

方法调用表达式是一个特殊的表达式:

  • 如果被调用方法的返回值类型是void,调用时不需要也不能接收和处理(打印或参与计算)返回值结果,即方法调用表达式只能直接加;成为一个独立语句。
  • 如果被调用方法有返回值,即返回值类型不是void,

    • 方法调用表达式的结果可以作为赋值表达式的值,
    • 方法调用表达式的结果可以作为计算表达式的一个操作数,
    • 方法调用表达式的结果可以作为另一次方法调用的实参,
    • 方法调用表达式的结果可以不接收和处理,方法调用表达式直接加;成为一个独立的语句,这种情况,返回值丢失。

    package com.dingjiaxiong.test04.method;

    /**

    • @Projectname: BigDataStudy
    • @Classname: MethodReturnValue
    • @Author: Ding Jiaxiong
    • @Date:2023/4/24 15:54
      */

    public class MethodReturnValue {

    1. public static void main(String[] args) {
    2. //创建对象
    3. MethodDefineDemo md = new MethodDefineDemo();
    4. //无返回值的都只能单独加;成一个独立语句
    5. //调用MethodDefineDemo类中无参无返回值的方法sayHello
    6. md.sayHello();
    7. //调用MethodDefineDemo类中有参无返回值的方法printRectangle
    8. md.printRectangle(5, 10, '@');
    9. //有返回值的
    10. //(1)方法调用表达式可以作为赋值表达式的值
    11. int bigger = md.max(7, 3);
    12. System.out.println("bigger = " + bigger);
    13. //(2)方法调用表达式可以作为计算表达式的一个操作数
    14. //随机产生两个[1,100]之间的整数,并求和
    15. int sum = md.getIntBetweenOneToHundred() + md.getIntBetweenOneToHundred();
    16. System.out.println("sum = " + sum);
    17. //(3)方法调用表达式可以作为另一次方法调用的实参
    18. int x = 4;
    19. int y = 5;
    20. int z = 2;
    21. int biggest = md.max(md.max(x, y), z);
    22. System.out.println("biggest = " + biggest);
    23. //(4)方法调用表达式直接加;成为一个独立的语句,这种情况,返回值丢失
    24. md.getIntBetweenOneToHundred();
    25. }

    }

在这里插入图片描述

5.4.5 实例方法使用当前对象的成员

在实例方法中还可以使用当前对象的其他成员。在Java中当前对象用this表示。

  • this:在实例方法中,表示调用该方法的对象
  • 如果没有歧义,完全可以省略this。

【1】使用this.

案例:矩形类

  1. package com.dingjiaxiong.test04.method;
  2. /**
  3. * @Projectname: BigDataStudy
  4. * @Classname: Rectangle
  5. * @Author: Ding Jiaxiong
  6. * @Date:2023/4/24 15:56
  7. */
  8. public class Rectangle {
  9. int length;
  10. int width;
  11. int area() {
  12. return this.length * this.width;
  13. }
  14. int perimeter() {
  15. return 2 * (this.length + this.width);
  16. }
  17. void print(char sign) {
  18. for (int i = 1; i <= this.width; i++) {
  19. for (int j = 1; j <= this.length; j++) {
  20. System.out.print(sign);
  21. }
  22. System.out.println();
  23. }
  24. }
  25. String getInfo() {
  26. return "长:" + this.length + ",宽:" + this.width + ",面积:" + this.area() + ",周长:" + this.perimeter();
  27. }
  28. }

测试类

  1. package com.dingjiaxiong.test04.method;
  2. /**
  3. * @Projectname: BigDataStudy
  4. * @Classname: TestRectangle
  5. * @Author: Ding Jiaxiong
  6. * @Date:2023/4/24 15:56
  7. */
  8. public class TestRectangle {
  9. public static void main(String[] args) {
  10. Rectangle r1 = new Rectangle();
  11. Rectangle r2 = new Rectangle();
  12. System.out.println("r1对象:" + r1.getInfo());
  13. System.out.println("r2对象:" + r2.getInfo());
  14. r1.length = 10;
  15. r1.width = 2;
  16. System.out.println("r1对象:" + r1.getInfo());
  17. System.out.println("r2对象:" + r2.getInfo());
  18. r1.print('#');
  19. System.out.println("---------------------");
  20. r1.print('&');
  21. System.out.println("---------------------");
  22. r2.print('#');
  23. System.out.println("---------------------");
  24. r2.print('%');
  25. }
  26. }

运行结果

在这里插入图片描述

【2】省略this.

  1. public class Rectangle {
  2. int length;
  3. int width;
  4. int area() {
  5. return length * width;
  6. }
  7. int perimeter(){
  8. return 2 * (length + width);
  9. }
  10. void print(char sign) {
  11. for (int i = 1; i <= width; i++) {
  12. for (int j = 1; j <= length; j++) {
  13. System.out.print(sign);
  14. }
  15. System.out.println();
  16. }
  17. }
  18. String getInfo(){
  19. return "长:" + length + ",宽:" + width +",面积:" + area() +",周长:" + perimeter();
  20. }
  21. }
5.4.6 方法调用内存分析

方法不调用不执行,调用一次执行一次,每次调用会在栈中有一个入栈动作,即给当前方法开辟一块独立的内存区域,用于存储当前方法的局部变量的值,当方法执行结束后,会释放该内存,称为出栈,如果方法有返回值,就会把结果返回调用处,如果没有返回值,就直接结束,回到调用处继续执行下一条指令。

栈结构:先进后出,后进先出。

  1. package com.dingjiaxiong.test04.method;
  2. /**
  3. * @Projectname: BigDataStudy
  4. * @Classname: MethodMemory
  5. * @Author: Ding Jiaxiong
  6. * @Date:2023/4/24 15:58
  7. */
  8. public class MethodMemory {
  9. public static void main(String[] args) {
  10. Rectangle r1 = new Rectangle();
  11. Rectangle r2 = new Rectangle();
  12. r1.length = 10;
  13. r1.width = 2;
  14. r1.print('#');
  15. System.out.println("r1对象:" + r1.getInfo());
  16. System.out.println("r2对象:" + r2.getInfo());
  17. }
  18. }

在这里插入图片描述

在这里插入图片描述

5.4.7 实例变量与局部变量的区别
  1. 声明位置和方式
    (1)实例变量:在类中方法外
    (2)局部变量:在方法体{}中或方法的形参列表、代码块中
  2. 在内存中存储的位置不同
    (1)实例变量:堆
    (2)局部变量:栈
  3. 生命周期
    (1)实例变量:和对象的生命周期一样,随着对象的创建而存在,随着对象被GC回收而消亡,
    而且每一个对象的实例变量是独立的。
    (2)局部变量:和方法调用的生命周期一样,每一次方法被调用而在存在,随着方法执行的结束而消亡,
    而且每一次方法调用都是独立。
  4. 作用域
    (1)实例变量:通过对象就可以使用,本类中“this.,没有歧义还可以省略this.”,其他类中“对象.”
    (2)局部变量:出了作用域就不能使用
  5. 修饰符(后面来讲)
    (1)实例变量:public,protected,private,final,volatile,transient等
    (2)局部变量:final6
  6. 默认值
    (1)实例变量:有默认值
    (2)局部变量:没有,必须手动初始化。其中的形参比较特殊,靠实参给它初始化。

发表评论

表情:
评论列表 (有 0 条评论,73人围观)

还没有评论,来说两句吧...

相关阅读