当前位置: 首页 > news >正文

Java方法详解

方法是类或对象的行为特征的抽象,方法是类或对象最重要的组成部分。值得指出的是Java里的方法不能独立存在,所有的方法都必须定义在类里。
不论是从定义方法的语法来看,还是从方法的语法功能来看,都不难发现方法和函数之间的相似性。
实际上,方法确实是由传统的函数发展而来的,方法与传统的函数有着显著不同:在结构化编程语言里,函数是一等公民,整个软件由一个个函数组成;在面向对象编程与压力,类才是一等公民,整个系统由一个个的类组成。

在同一个类的一个方法调用另外一个方法时,如果被调方法是普通方法则默认使用this作为调用者;如果被调用方法是静态方法,则默认使用类作为调用者。也就是说,表面上看起来某些方法可以被独立执行,但实际上还是使用this或者类来作为调用者。

方法的参数传递机制

如果声明方法时包含了形参声明,则调用方法时必须给这些形参指定参数值,调用方法时必须给这些形参指定采纳数值,调用方法时实际传给形参的参数值也被成为实参。
Java里方法的参数传递方式只有一种:值传递。所谓值传递,就是将实际参数值得副本传入方法体内,而参数本身不会受到任何影响。

public class Test {
    public static void swap(int a, int b) {
        int temp = a;
        a = b;
        b = temp;
        System.out.println("交换时a的值是" + a + ";b的值是" + b);
    }
    public static void main(String[] args) {
        int a = 6;
        int b = 9;
        swap(a,b);
        System.out.println("交换后a的值是" + a + ";b的值是" + b);
    }
}

交换时a的值是9;b的值是6
交换后a的值是6;b的值是9
从上面运行结果可以看出,swap()方法里的变量a和b,并不是swap方法里的a和b.swap()方法的a和b只是main方法里变量a和b的复制品。

上面举的例子是基本类型的参数传递,Java对于引用类型的参数传递,一样采用的是值传递方式。但许多出初学者可能对引用类型的参数传递产生一些误会。请看下面的代码:

class DataWrap {
    int a;
    int b;
}

public class Test {
    public static void swap(DataWrap dw) {
        int tmp = dw.a;
        dw.a = dw.b;
        dw.b = tmp;
        System.out.println("swap方法里a的成员变量的值是" + dw.a + ";b成员变量的值是" + dw.b);

    }
    public static void main(String[] args) {
        DataWrap dw = new DataWrap();
        dw.a = 6;
        dw.b = 9;
        swap(dw);
        System.out.println("交换结束后,a成员变量的值是" + dw.a + ";b成员变量的值是" + dw.b);
    }
}

swap方法里a的成员变量的值是9;b成员变量的值是6
交换结束后,a成员变量的值是9;b成员变量的值是6
上面这种参数传递的方式是不折不扣的值传递方式,系统一样复制了dw的副本传入swap()方法,但关键在于dw只是一个引用变量,所以系统复制了dw变量,但并未复制DataWrap对象。
当程序在swap()方法中操作dw参数时,由于dw只是一个引用变量,故实际操作的还是堆内存中的DataWrap对象。

形参个数可变的方法

如果在定义方法时,在最后一个形参类型后加三点(...),则表明该形参数可以接受多个参数值,多个参数值被当做数组传入。

public class Test {
    public static void show(int a, String...books) {
        for (String tmp: books) {
            System.out.println(tmp);
        }
    }
    public static void main(String[] args) {
        show(5, "Java", "Pyton", "JavaScript");
    }
}

Java
Pyton
JavaScript
从上面show方法代码体来看,形参个数可变的参数本质就是一个数组参数,也就是说,下面两个方法签名的效果签名完全一样。
个数可变的形参只能处于形参列表的最后。一个方法中最多只只能包含一个参数可变的形参。个数可变的形参本质就是一个数组类型的形参。

方法重载

Java允许同一个类里定义多个同名方法,只要形参列表不同就行。如果同一个类中包含了两个或两个以上方法的方法名相同,但形参列表不同,则被称为方法重载。
Java中程序确定一个方法需要三个要素。

  • 调用者,也就是方法的所属者,既可以是类也可以是对象。
  • 方法名,方法的标志。
  • 形参列表,当调用方法时,系统会根据传入的实参列表匹配。

相关文章:

  • Introduction to Information Retrieval
  • 前端代码异常日志收集与监控
  • 结构体内存对齐具体解释
  • PyOpenCL图像处理:两张图片不带权重叠加
  • 17.Azure备份(MARS)代理(上)
  • Cocos Code IDE里xcodeprojectlua脚本更新
  • 《小账本》开发日志 第六天
  • 『PyTorch x TensorFlow』第八弹_基本nn.Module层函数
  • 解决-webkit-box-orient: vertical;(文本溢出)属性在webpack打包后无法编译的问题
  • Linux快速构建LAMP网站平台
  • python 装饰器(一)
  • kali:加速WEP黑客攻击,ARP请求重播攻击
  • DM8127-UART驱动
  • 利用表格分页显示数据的js组件datatable的使用
  • RAID磁盘阵列种类及区别
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • 07.Android之多媒体问题
  • Android框架之Volley
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • CSS实用技巧
  • django开发-定时任务的使用
  • Iterator 和 for...of 循环
  • Java 内存分配及垃圾回收机制初探
  • JavaScript设计模式系列一:工厂模式
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • Protobuf3语言指南
  • Python实现BT种子转化为磁力链接【实战】
  • Shadow DOM 内部构造及如何构建独立组件
  • vue 个人积累(使用工具,组件)
  • Vue官网教程学习过程中值得记录的一些事情
  • 阿里云购买磁盘后挂载
  • 编写符合Python风格的对象
  • 力扣(LeetCode)22
  • 设计模式走一遍---观察者模式
  • 首页查询功能的一次实现过程
  • Linux权限管理(week1_day5)--技术流ken
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • ​比特币大跌的 2 个原因
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • #QT(串口助手-界面)
  • #WEB前端(HTML属性)
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • #在 README.md 中生成项目目录结构
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (安卓)跳转应用市场APP详情页的方式
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (转)c++ std::pair 与 std::make
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • .Net Core webapi RestFul 统一接口数据返回格式