方法(C语言中称为函数)

方法:由多条语句组成,可以重复使用的,完成一个或多个功能的代码集合;方法只能声明在类中,不能声明在其他方法中
语法格式:
[访问修饰符] 返回值类型 方法名([参数列表]){
//代码块
}
注:这里的中括号[]代表括号里的内容可以写也可以不写,如果写,中括号不用写

例如:
/*** 演示方法的声明和调用* @author 学霸联盟 - 赵灿*/
public class MethodDeclareDemo {/*** 声明了一个没有参数的方法,方法名为m1* 方法体也是空的,表示这个方法什么都没做*/void m1(){}/*** 声明了一个带两个参数的方法,方法名为m2* 这里的两个参数,本质就是声明变量,称为形式参数,简称形参* 当这个方法被调用时,按照形参的顺序,传入对应数据类型的值或变量* 被传入的值称为实际参数,简称形参* 该方法的方法体中有一条输出语句,输出传入两个参数的值,这就是方法的功能*/void m2(String name, int age){System.out.println("姓名:" + name + "  年龄:" + age);}/*** 这也是一个方法,方法名是main,有一个String[]类型的参数* 只不过这个方法比较特殊,是程序的入口*/public static void main(String[] args){//创建一个MethodDeclareDemo类的对象MethodDeclareDemo mdd = new MethodDeclareDemo();//调用方法m1,m1这个方法什么都没有做mdd.m1();/** 调用方法m2,由于m2声明了参数,调用时必须传入实参* "张三"和18就是传递给方法m2的实参* 参数传递过程相当于赋值操作* 程序执行mdd.m2("张三", 18);这条语句时* 会将"张三"赋值给形参name(相当于String name = "张三")* 18赋值给形参age(相当于int age = 18)*/mdd.m2("张三", 18);}
}
运行结果:姓名:张三  年龄:18

方法的参数:就是在方法的小括号中声明的变量,这个变量称为:形式参数,简称:形参;用于接收调用时传入的值(实参),形参的使用范围是整个方法,多个参数中间用英文格式的逗号隔开;当带有参数的方法被调用时,必须对应方法声明时编写的参数类型和顺序,给这个方法传入实际的值;这个实际值称为实际参数(简称:实参);
返回值类型:必须写,如果一个方法不需要返回值,返回值类型写void
返回值:方法执行完毕后,返回给调用者的结果;使用关键字return返回,并且返回的值要和返回值类型匹配;格式:return 返回值;
关键字return:用在方法中,作用是结束整个方法;

例如:某人要去手机店买一部手机,那么他需要先给钱,然后获得手机。其中给的钱就是实参,手机就是返回值

实例:
/*** 样式方法的返回值类型和返回值* @author 学霸联盟 - 赵灿*/
public class Person {/** 声明一个方法名为buy的方法,有一个类型为double的形式参数money* 返回值的类型是String,那么在方法中必须使用关键字return,返回一个String类型的值*/String buy(double money) {// 声明String类型的变量phoneString phone;// 判断传入的钱是否大于6000if (money > 6000) {// 如果大于6000,就给变量phone赋值为“苹果手机”phone = "苹果手机";} else {// 如果不大于6000,就给变量phone赋值为“华为手机”phone = "华为手机";}/** 因为当程序执行到方法调用语句时,程序会跳转到被调用的方法中执行* 当方法被执行完之后,又会返回到方法调用语句处* 所以方法中使用关键字return返回的结果被称为返回值* 当方法声明的返回值类型不是void时,方法中必须使用return语句返回一个返回值* 此处phone就是返回值*/return phone;}/** 声明一个不带参数的方法,方法名为call* 声明返回值类型为void代表这个方法没有返回值* 方法中也可以写return语句,也可以不写* 如果写return后面只能跟英文格式的分号; 即:return;*/void call() {/** 此处声明一个String类型的变量myPhone,来接收buy方法的返回值* 因为buy的返回值类型是String,所有此处用String类型的变量接收* 相当于String myPhone = phone(buy方法中return后面的phone)* 当程序执行buy(1000.0);语句调用buy方法时,程序会跳到buy方法中执行* 直到遇到buy方法中的return语句后* 再返回到此处执行赋值语句(将buy方法返回的结果赋值给变量myPhone)*/String myPhone = buy(1000.0);System.out.println("使用\"" + myPhone + "\"拨打电话...");/** return语句可有可无* 需要注意的是,执行return语句后方法就结束了* 所以return语句后面还有语句的话就不会被执行*/return;//以下位置(此处开始至方法的右大括号之间)再写代码就会提示错误}public static void main(String[] args) {//创建一个人类的对象Person person = new Person();/** 程序由main方法进入执行* 执行到此处调用call方法,程序会跳到call方法中执行* 当call方法中遇到return或所有代码都执行完成(未写return语句时)后* 再回到当前位置,执行后面的输出语句*/person.call();//call方法执行完成后,继续执行此句System.out.println("main方法的最后一句代码");}
}
运行结果:
使用"华为手机"拨打电话...
main方法的最后一句代码

方法调用语句

语法格式: 对象名.方法名();或 类名.静态方法名();(下面讲到)
例如上例中用到的 person.call();

方法传参

值传递(基本数据类型)

将实参变量中保存的值复制一份,赋值给形参变量;赋值之后实参变量和形参变量没有任何关系,修改任何一个变量,另一个变量都不会发生变量

引用传递(引用类型,String除外)

将实参变量中存储的对象的内存地址复制一份赋值给形参变量,此时实参变量和形参变量中保存的是同一个对象的内存地址;使用任何一个引用对对象的属性进行修改,再次使用任何一个引用访问对象被修改的属性时都会发生变化。

/*** 声明汽车类Car* @author 学霸联盟 - 赵灿*/
class  Car{//声明一个String类型的变量nameString carName;//声明一个变量color代表汽车的颜色,并赋值String  color = "无色";
}
/*** 声明汽车工厂类CarFactory* @author 学霸联盟 - 赵灿*/
class CarFactory{/*** 声明一个结账的方法* 用于测试参数的值传递* 参数money用于接收用户付款*/void settlement(double money){System.out.println("用户付款:" + money);//修理费150double repairs = 150;//对变量money进行修改,得到收取修理费剩余的钱money = money - repairs;System.out.println("应找零:" + money);}/*** 声明一个修改汽车颜色的方法* 用于测试参数的引用传递* 参数car用于接收被修改颜色的汽车*/void setColor(Car car) {// 将接收到的汽车的颜色设置成黑色car.color = "黑色";}
}/*** 演示值传递和引用传递* * @author 学霸联盟 - 赵灿*/
public class ParameterTransferDemo {// 声明一个main方法,作为程序的入口public static void main(String[] args) {System.out.println("------------ 引用传递 ------------");//使用关键字new创建汽车对象,并将对象在内存中的地址赋值给变量cCar c = new Car();c.carName = "小c";System.out.println("刚刚创建出来的汽车\"" + c.carName + "\"的颜色是:" + c.color);//创建汽车工厂对象cfCarFactory cf = new CarFactory();//引用传递:将变量c中存储的地址,传递给setColor方法的参数carcf.setColor(c);//输出结果汽车的名字还是小c,这表明汽车还是原来的汽车,但是颜色已经变了System.out.println("通过汽车工厂修改后\"" + c.carName + "\"的颜色是:" + c.color);System.out.println("------------- 值传递 -------------");double myMoney = 200;System.out.println("付款前我的钱是:" + myMoney);//值传递:调用结算的方法settlement,将myMoney的值传给参数moneycf.settlement(myMoney);System.out.println("付款后我的钱是:" + myMoney);/** 前面说过,方法的传参相当于用实参给形参赋值* 下面这段代码中,变量c1代表上面的变量c* 变量c2代表setColor方法中的参数car*/System.out.println("------------ 引用传递 ------------");//创建一个汽车对象,并将汽车对象在内存中的地址赋值给变量c1Car c1 = new Car();//设置名称c1.carName = "小c1";//由于引用类型变量中存储的是对象在内存中的地址//所以引用类型的变量也称为引用Car c2 = c1;System.out.println("修改前汽车c1的名称:" + c1.carName + "  颜色:" + c1.color);System.out.println("修改前汽车c2的名称:" + c2.carName + "  颜色:" + c2.color);//对c2的修改会影响c1,c1跟着变化c2.color = "黑色";System.out.println("修改后汽车c1的名称:" + c1.carName + "  颜色:" + c1.color);System.out.println("修改后汽车c2的名称:" + c2.carName + "  颜色:" + c2.color);System.out.println("------------- 值传递 -------------");double m1 = 200;double m2 = m1;System.out.println("修改前m1的值:" + m1);System.out.println("修改前m2的值:" + m2);//对m2的修改不会影响m1m2 = m2 - 150;System.out.println("修改后m1的值:" + m1);System.out.println("修改后m2的值:" + m2);}
}
运行结果:
------------ 引用传递 ------------
刚刚创建出来的汽车"小c"的颜色是:无色
通过汽车工厂修改后"小c"的颜色是:黑色
------------- 值传递 -------------
付款前我的钱是:200.0
用户付款:200.0
应找零:50.0
付款后我的钱是:200.0
------------ 引用传递 ------------
修改前汽车c1的名称:小c1  颜色:无色
修改前汽车c2的名称:小c1  颜色:无色
修改后汽车c1的名称:小c1  颜色:黑色
修改后汽车c2的名称:小c1  颜色:黑色
------------- 值传递 -------------
修改前m1的值:200.0
修改前m2的值:200.0
修改后m1的值:200.0
修改后m2的值:50.0

构造方法(构造器)

使用new关键字创建对象时会被调用,一般用于初始化类中的一些变量。
语法格式: [访问修饰符] 类名([参数列表]){ //方法体 }

实例:
/*** 演示构造方法* @author 学霸联盟 - 赵灿*/
public class CustomerDemo {String name;/*** 构造方法的方法名必须严格和类名一致* 不能有返回值类型* 如果不写,系统自动提供一个没有参数的构造方法* 如果写了,无论写的构造方法带不带参数,系统都不再系统无参构造*/CustomerDemo(String str) {//初始化:第一次赋值name = str;}public static void main(String[] args) {/** 通过new创建对象时,会先将变量name加载到内存中,然后执行构造方法* 由于在CustomerDemo类中声明了带一个String类型参数的构造方法* 所以系统将不会再为CustomerDemo类提供无参的构造方法了* 所以使用new创建对象时必须传入参数*/CustomerDemo cd = new CustomerDemo("abc");//输出结果:abcSystem.out.println(cd.name);}
}
运行结果:abc

注意: 1、没有返回值类型,方法名和类名完全一致(包括大小写也必须一致)
2、使用new创建对象时,先将在堆中创建一块内存空间,将属性加载到这块内存空间中,然后执行构造方法
3、如果不写构造方法,系统会自动提供一个无参的构造方法
4、如果写了构造方法,系统将不再提供无参构造
5、如果构造方法前写了返回值类型,该方法便不是构造方法了,只不过是一个名字和类名相同的普通方法

构造方法和普通方法的区别

1、 返回值类型:构造方法没有返回值类型,普通方法必须有(如果不需要返回值,写void)
2、 方法名:构造方法的方法名和类名完全一致(包括大小写也必须一致),普通方法的方法名自定义
3、 构造方法可以使用关键字this、super调用,new操作时也会调用,普通方法是用对象名.方法名();的方法调用
4、 一个类中,如果不写构造方法,系统会自动提供一个无参的构造方法;如果写了构造方法,系统将不再提供无参构造;
5、 如果构造方法前写了返回值类型,该方法便不是构造方法了,只不过是一个名字和类名相同的普通方法

方法的重载:@Overload

方法重载是描述同一个类中,相同方法名之间的关系。
无论是普通方法还是构造方法,都可以被重载。
例如:一个类中包含多个构造方法和多个同名的方法

/*** 演示方法的重载(overload)* @author 学霸联盟 - 赵灿*/
public class OverloadDemo {String str;/** 创建了两个构造方法,这两个构造方法就构成了重载*/OverloadDemo(){}OverloadDemo(String s){str = s;}/** 创建了两个普通方法* 两个方法的方法名相同,参数列表不同* 他们也构造了方法重载* 但是如果两个方法名相同,参数列表也相同,就会导致方法同名的错误*/void m1(){}void m1(String s){str = s;}public static void main(String[] args) {//这种方式创建对象时会调用类的无参构造OverloadDemo od1 = new OverloadDemo();//这种方式创建对象,会调用类中带一个String类型参数的构造方法OverloadDemo od2 = new OverloadDemo("abc");//输出结果:nullSystem.out.println(od1.str);//输出结果:abcSystem.out.println(od2.str);}
}
运行结果:
null
abc

方法重载需要满足的条件:

1、在同一类中
2、方法名相同
3、参数列表不同

版权声明:本文为博主原创文章,未经博主允许不得转载。

I学霸官方免费教程八:Java基础之方法(函数)相关推荐

  1. I学霸官方免费教程二十八:Java排序算法之选择排序和冒泡排序

    选择排序 步骤一.选取一组数据中起始位置(下标)上的数据,和其后的各个位置(下标)上数据进行比较:如果起始位置(下标)上的数据大(升序)或小(降序),就将两个位置上的数据进行交换:这样完成一轮比较之后 ...

  2. java集合课程,I学霸官方免费课程三十三:Java集合框架之Map集合

    I学霸官方免费教程三十三:Java集合框架之Map集合 Map接口 Map集合采用键值对(key-value)的方式存储数据,其中键不可以重复.值可以重复. 常用类有HashMap.TreeMap和P ...

  3. Nuke10最新官方免费教程大全打包12G超大下载

    Nuke10最新官方免费教程大全打包12G超大下载 链接:https://pan.baidu.com/s/1ZOUf2tPVpFiraH7gtoK9MQ  提取码:w3em  南无阿弥陀佛 

  4. Java基础学习——方法

    Java基础学习--方法 前言 本文将介绍有关Java面向对象编程的知识之一:方法:其中包括方法的概念,三类方法的格式.方法的重载以及方法的内存 方法的概念 方法是程序中最小的执行单元 方法定义:将一 ...

  5. Java教程,Java基础教程,2020年全新Java基础学习教程

    时代在变化,Java的知识也在不断的变化,今天分享一下2020年Java全新的基础教程,想学习Java的小伙伴,看这个!全新哦,涵盖了2019年新增知识,并且视频完全源于课堂实录哦! 本套JAVA课程 ...

  6. 八门神器java版本_【修改教程】java基础知识字符串处理_八门神器

    [Java基础知识]字符串处理1.获取字符串的长度 String s = "AIDE"; System.out.println(s "长度为:" s.lengt ...

  7. Java基础02 方法与数据成员

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在Java基础01 从HelloWorld到面向对象,我们初步了解了对象(obje ...

  8. JAVA基础——toString()方法,java基础面试笔试题

    我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...

  9. java基础9 main函数、this、static、super、final、instanceof 关键字

    一.main函数详解 1.public:公共的.权限是最大的,在任何情况都可以访问   原因:为了保证jvm在任何情况下都可以访问到main法 2.static:静态,静态可以让jvm调用更方便,不需 ...

最新文章

  1. 边缘计算+SDN:为物联网腾飞插上翅膀
  2. linux基本命令之rsync
  3. javascript中not defined、undefined、null以及NaN的区别
  4. openstack之neutron linuxbridge + vlan组网
  5. Spring Cloud【Finchley】实战-02订单微服务
  6. RxSwift之UI控件UIPickerView扩展的使用
  7. python os.walk
  8. P4178 Tree
  9. 标签蛋白_His标签蛋白镍柱纯化后总有一条杂带怎么办?
  10. python中产生随机数模块_Python中random模块生成随机数详解
  11. java 流 存放在哪_java IO流学习
  12. 怎样下载企业通讯录Excel模板
  13. prolog寻找三角形个数
  14. Android平台上使用气压传感器计算海拔高度
  15. oracle 无法归档日志,报all online log need archiving
  16. CITA v0.15 Release
  17. 短视频开发,录制视频添加背景音乐功能实现
  18. camera测试标准
  19. 水质监测系统解决方案
  20. 批处理怎么调用计算机名,Reg命令使用详解 批处理操作注册表必备

热门文章

  1. 通信值勤维护管理条例_加强固定通信台站值勤管理及建设探析.doc
  2. 常见后置处理器的使用
  3. 语不惊人死不休-一针见血的名言
  4. 【OmniPlan】Mac上的项目管理软件推荐OmniPlan3
  5. 什么是JSON字符串
  6. MySQL模糊查询%
  7. Spring ——Bean(IOC)容器
  8. java中的Arrays.sort()的几种用法
  9. 鸿蒙2016机型,华为官方公布可升级鸿蒙的手机型号,多达67款,这下不用愁了!...
  10. WPS如何并排放置两张图片_「WPS办公助手」想做出高级又好看的 PPT,这个炫酷的功能你可别错过...