[java学习笔记]java语言基础概述之函数的定义和使用&函数传值问题
1.函数
1.什么是函数?
- 定义在类中的具有特定功能的一段独立小程序。
- 函数也叫做方法
2.函数的格式
- 修饰符 返回值类型 函数名(参数类型 形式参数1, 参数类型 形式参数2…) {
执行语句(函数体);
return 返回值;
}
返回值类型:函数运行完成后输出的数据类型。
参数类型:是形式参数的数据类型。
形式参数:是一个变量,用于储存调用函数时传递给函数的实际参数。
实际参数:传递给形参的实际数据。
return:结束函数,返回数据给调用者的关键字。
返回值:该函数运行后的结果,返回给调用者。
特殊情况:函数没有具体的返回值。
这时return后直接用分号结束。(return在最后一行可以省略)
用void关键字作为返回值类型。
3.函数的特点
- 定义函数可以将功能代码进行封装
- 便于对该功能进行复用
- 函数只有被调用才会执行
- 函数的出现提高了代码的复用性
- 对于函数没有具体返回值的情况,返回值类型用关键字void表示,那么该函数中的return语句如果在最后一行,可以省略不写
- 注意:
- 函数中只能调用函数,不能在函数中定义函数,即函数不能嵌套调用
- 定义函数时,函数的结果应该返回给调用者,交由调用者处理
- 两个明确:结果&参数
4.重载(overload)
函数的功能一样,仅仅参与运算的未知内容不同时,可以利用重载定义多个函数,使用同一函数名,这样方便阅读,在调用时,虚拟机通过参数列表的不同来区分这些函数。
- 概念:
在同一个类中,允许存在一个以上的同名函数,只要它们的参数个数或者参数类型不同即可。
- 特点:
与返回值无关,只看参数列表
- 好处:
方便与阅读,优化了程序设计
- 示例:
public class Utill{ //返回两个整数的和
public static int sum(int a, int b){
return a+b;
}
//返回两个小数的和
public static double sum(double a, double b){
return a+b;
}
//返回三个整数的和
public static int sum(int a, int b, int c){
return a+b+c;
} }
不能这样定义:因为虚拟机不确定调用哪个,只能通过参数列表的类型或个数进行区分。
public class Util{ //返回两个整数的和
public static int sum(int a, int b){
return a+b;
}
//返回两个小数的和
public static double sum(int a, int b){
return a+b;
} }
2.函数传值
- java函数基本数据类型是传值,引用数据类型是传引用
- 当参数为引用时,无论函数体内进行了何种操作,都不会改变实参对象的引用
- 当参数为引用时,只有在函数体内改变了对象的内容时,才会改变实参对象的内容。
(一)基本数据类型:传值,不会改变实参的值
public class Demo{
public static void main(String[] args) { int a = 3,b = 4;
fun(a,b);
System.out.println(a+","+b); }
//试图交换a和b的值
public static void fun(int a, int b){
int temp = a;
a = b;
b = temp;
} }
运行结果为3,4
分析:当程序执行到main函数时,在栈内存中就会多出一个main方法区,里面有a=3和b=4两个变量,接着执行fun(a,b),又会在栈内存中创建一个fun的方法区,里面有a和b变量。接着把main方法的a和b变量赋值给了fun方法区的a和b变量,即fun方法区的a=3,b=4,然后在fun方法区中交换了fun方法区的a和b的值,即fun方法区的a=4,b=3,fun方法执行完毕了,fun方法区被释放。改变不了main方法区的a和b变量。
(二)对象类型参数:传引用,函数体内改变形参引用,不会改变实参的引用,但是能改变实参的内容。
public class FunDemo{
public static void main(String[] args) { Person p1 = new Person(10);
Person p2 = new Person(20); System.out.println("before,p1.age:"+p1.age);
System.out.println("before,p2.age:"+p2.age); ss(p1,p2); System.out.println("after,p1.age:"+p1.age);
System.out.println("after,p1.age:"+p2.age); }//试图交换p1和p2的引用,和改变其中一个的age属性值
public static void ss(Person p1, Person p2){
Person p = p1;
p1 = p2;
p2 = p;
p1.age = 30;
}
}
运行结果:
before,p1.age:10
before,p2.age:20after,p1.age:10
after,p2.age:30
分析:当运行到Person p1 = new Person(10);时,会在栈内存中开辟一个新空间来储存变量p1,在堆内存中创建一个Person(10)的实例,p2同理。当调用ss方法时,又会在栈内存中开辟新空间来存储形式变量p1和p2,它们分别指向堆内存中对应实际参数所指向的Person实例,在ss方法内部,交换的是形参的p1和p2的值,即交换了它们的指向。这时候,实参的指向并没有改变。然后,改变形参p1所指向的实例的内容,即改变了实参p2所指向的实例的内容。
[java学习笔记]java语言基础概述之函数的定义和使用&函数传值问题的更多相关文章
- Java学习笔记:语言基础
Java学习笔记:语言基础 2014-1-31 最近开始学习Java,目的倒不在于想深入的掌握Java开发,而是想了解Java的基本语法,可以阅读Java源代码,从而拓展一些知识面.同时为学习An ...
- [java学习笔记]java语言核心----面向对象之this关键字
一.this关键字 体现:当成员变量和函数的局部变量重名时,可以使用this关键字来区别:在构造函数中调用其它构造函数 原理: 代表的是当前对象. this就是所在函数 ...
- [java学习笔记]java语言核心----面向对象之构造函数
1.构造函数概念 特点: 函数名与类名相同 不用定义返回值类型 没有具体的返回值 作用: 给对象进行初始化 注意: 默认构造函数 多个构造函数是以重载出现的 一个类中如果 ...
- ios开发学习笔记001-C语言基础知识
先来学习一下C语言基础知识,总结如下: 在xcode下编写代码. 1.编写代码 2.编译:cc –c 文件名.c 编译成功会生成一个 .o的目标文件 3.链接:把目标文件.o和系统自带的库合并在一起, ...
- Java学习笔记-Java概述和环境配置
基础常识 软件:一系列按照特定顺序组织的计算机数据 和指令的集合 常见的软件: 系统软件:如:DOS,windows,Linux等 应用软件:如:扫雷,迅雷,QQ等 软件的出现实现了人与计算机之间的更 ...
- Java学习笔记1(基础)
计算机语言和Java 计算机语言主要由一些指令(包括数字.符号和语法等)组成,可以分为机器语言.汇编语言.高级语言三大类.Java是一种高级计算机语言,是一种可以编写跨平台应用软件.完全面向对象的程序 ...
- Java学习笔记 -- Java定时调度工具Timer类
1 关于 (时间宝贵的小姐姐请跳过) 本教程是基于Java定时任务调度工具详解之Timer篇的学习笔记. 什么是定时任务调度 基于给定的时间点,给定的时间间隔或者给定的执行次数自动执行的任务. 在Ja ...
- java学习笔记----java入门
java基础 一.java语言跨平台原理 1.什么是跨平台? 跨平台就是一个软件可以在不同的操作系统中运行,但是不需要对其修改.换句话说,java语言编写的软件在不做修改的情况下就能在不同的系统平台上 ...
- Java学习笔记——java介绍
Java开源语言 C语言闭源语言 IOS闭源系统 采用object-c语言开发 应用程序分类(从类型分类) C/S(Client Server):不联网的软件也属于C/S B/S(Browser S ...
随机推荐
- c语言下的通用数据库接口(之sqlite消化,模拟c#,java的反射)
在java/C#中都有类的反射,而C下是不存在的. java/C#中能够把表设计成类.而C下仅仅能设计成结构体形式. 在java中有hibernate来操作数据库,可是在C以下怎么设计好呢? 如今,我 ...
- MySQL内存----使用说明全局缓存+线程缓存) 转
MySQL内存使用说明(全局缓存+线程缓存) 首先我们来看一个公式,MySQL中内存分为全局内存和线程内存两大部分(其实并不全部,只是影响比较大的 部分): per_thread_buffers=(r ...
- 如何在有实体键的情况下全部显示ActionBar的Menu?
大伙都知道, 在老版本手机, 以及部分的新手机上都还残留实体键, 有了这些实体键, 默认菜单是用实体菜单键呼出的, 尽管你把android:showAsAction="always" ...
- 深入研究Block用weakSelf、strongSelf、@weakify、@strongify解决循环引用(下)
深入研究Block捕获外部变量和__block实现原理 EOCNetworkFetcher.h typedef void (^EOCNetworkFetcherCompletionHandler)(N ...
- gitlab备份与恢复操作方法
github私有仓库是收费的,有些代码不方便托管到外面的git仓库,因此就产生了自己搭建git服务器的需求. 好在有广大的开源人士的贡献,有了gitlab这一神器. 手动配置较多,直接用集成包: bi ...
- javaweb学习总结八(xml约束DTD)
一:XML约束概念 xml约束:可以编写一个文档来约束xml文件的书写规范. xml语言格式比较严谨,不可能让程序员随意编写,所以必须要有约束. 二:常用的xml约束技术 1:DTD,document ...
- 【Irrlicht鬼火引擎】掌握引擎使用流程,入门程序HelloWorld
分析 一.简述使用步骤 一般而言,对于一个简单的程序,Irrlicht引擎的一般使用步骤如下: 预处理:(1)包含 <irrlicht.h> 头文件#include <irrlich ...
- 关于Merge的整理--AndroidScreenSlidePager开源库中用到的
在做AndroidScreenSlidePager开源库练习demo的时候,发现布局文件使用的是<merge>标签而不是<FrameLayout>标签.作者给出的说法是:Cir ...
- ACM进阶
ACM队不是为了一场比赛而存在的,为的是队员的整体提高. 大学期间,ACM队队员必须要学好的课程有: l C/C++两种语言 l 高等数学 l 线性代数 l 数据结构 l 离散数学 l 数据库原理 l ...
- 使用WDS安装Windows8.1
WDS的部署 安装角色 配置 1. 选择配置服务器 2. 核对是否满足要求 3. 输入远程安装文件夹的路径 4. 选择是否使用自带的DHCP服务器 5. 可以保持默认 6. 完成配置后添加映像文件 7 ...