Java基础之函数、数组
一、函数:定义在类中的具有特定功能的一段独立小程序,也称方法。函数就是提高代码的复用性的方式体现之一。功能是由函数来体现。
主函数main保证了类的独立运行。
函数的格式:
修饰符 返回值类型 函数名(参数类型 形式参数1,参数类型 形式参数2,----)
{
执行语句;
return 返回值;
}
返回值类型:函数运行后的结果的数据类型。
参数类型:是形式参数的数据类型。
形式参数是一个变量,用于存储调用函数时传递函数的实际参数。
实际参数:传递给形式参数的具体数值。
返回值:该函数运算后的结果,该结果会返回给调用者。
Return 的作用:1、将具体的结果返给调用者。2、结束了该功能(函数)
Return可以写多条,满足某一种条件后会结束功能。例
public static int show(boolean b)
{
if (b)
return 100;
else
return 0;
}
Return结束函数功能应用
public static void show(int age)
{
if (age <0)
{
System.out.println("数值非法");
return;
}
System.out.println(age);
return;
}
而return在单独存在时,下面不能有语句,这和break、continue是类似的。
功能定义一般都有结果,若功能没有具体的结果,这是返回值类型在java中就用void关键字来表示。
如果函数的返回值类型是void,那么函数中的return语句是可以省略不写的。如main函数也是函数,结尾处肯定有return语句,只是其返回值类型是void,省略不写罢了。
如果函数有具体的返回值类型,那么必须写return语句以及具体的返回值。
函数之间是并列关系,但无论函数怎样排列,都是从主函数开始。主函数是第一个压栈。
函数内是不可以定义函数的,只可调用函数。
注意:不要把代码都写在主函数内,只要是功能,都可用函数来体现,主函数只用来调用已定义的功能,让该功能运行起来。
函数的返回值类型和参数是没有关系的。
函数定义时注意的事项:定义功能,功能中需要什么就定义什么,但是不需要的就不要定义,以免画蛇添足。至于功能结果,调用者怎么操作与我们无关,功能中不要去体现。
输出语句中,必须是运算完有具体结果数据的函数才可以被输出。若println(A函数)而A函数的返回值类型是void,则会编译失败。
为验证定义的功能是否可用,可定义一个主函数来运行检验。
例如:定义一个功能。来简化打印字符串的输出语句。
class SopDemo
{
public static void main(String[] args)
{
sop("fuck");
}
public static void sop(String str)
{
System.out.println(str);
}
}
二、定义功能的技巧:1、明确该功能的结果是什么,即明确要定义的Java函数的返回值类型。2、明确该功能是否需要未知内容来参与运算,即明确Java函数的参数列表(参数的个数,参数的类型)注意,函数参数列表里的参数是有顺序的。
练习1、定义一个功能,获取两个整数之间最大的那个。
思路:1、明确功能结果。是一个整数 int。
2、明确未知内容。是两个不确定的整数。有两个整型参数。
3、获取最大值就要通过比较来完成,if语句。
4、通过return语句返回最大值。
public static int getmax(int a,int b)
{
if (a>b)
return a;
return b;
(return a>b?a:b;)代码的简单优化
}
练习2、定义一个功能,判断两者是否相等
思路:1、结果:用boolean类型表示
2、未知内容:两个整数
public static boolean isEquals(int a,int b)
{
return a==b?true:false;(代码优化return a==b;)
}
三、函数的内存运行过程
执行主函数时,主函数就会进栈,会在栈内存中划分一片空间,名称叫main,然后逐条执行main的执行语句,执行到调用函数时,被调用的函数就会进栈,在main空间上开辟一片空间。这种进栈的方式叫做压栈。第一个进栈的直接进入栈底。被调用函数结束后,就会从内存释放,弹栈。以此类推,直至main函数结束。
四、函数的重载
定义函数为了增加其阅读性,函数名称要求直接反映出该函数功能最好。函数名称要有意义。
功能相同的函数,名称最好是一致的。
重载:在同一个类中,允许存在一个以上的同名函数,只要它们的参数个数或者参数类性不同即可。
重载的好处:方便阅读,方便调用。
特点:与返回值类型无关,只看参数列表
重载练习
public static void show(int x,char y,double z){}
下列哪个答案和给定的函数重载了?
a.public static int show(char y,int x,double z){return 1;}
重载了。参数类型不同。而且和返回值类型无关。
b.public static void show(int a,char b,double c){}
没有,和给定的函数一模一样。出现在同一类会编译失败,因为有了调用的不确定性。
c.public static void show(double z,int x,char y){}//重载了。参数类型不同。参数是有顺序的
d.public static double show(int a,char y){}//重载了,参数个数不同。
五、数组
数组:同一种类型的数据的集合。可以自动的给数组中的元素从0开始编号。这些编号叫索引,也叫脚标。
编号和数据存在对应关系。
格式:元素类型 [ ] 数组名=new 元素类型[元素个数或者数组长度]
长度为n的数组,最大索引(脚标)是n-1
特点:1、这些数据必须是同一类型。
2、存储时必须明确元素的个数。
数组其实就是可以存储固定个数并是同一类型的元素的容器。
容器:数据多时,就要容器来存储。数组是容器的一种。
new:要定义一个存储多个数据的空间,必须要使用一个关键字new。而new[ ]:新创建数组。New创建的数组也称实体。
new int [3]:定义了一个可以存储3 个int类型元素的数组。
int [ ] arr:定义一个数组,元素类型是int ,名称是arr。
arr[0]=66:名称是arr的数组,脚标是0的位置被赋值为66.
数组的定义其实也是定义变量,只不过不再是基本数据类型变量了,而是引用数据类型变量(数组、类、接口)
数组的默认初始化值:boolean类型是false。Int类型是0.
Double类型是0.0 而float类型是0.0f 而char类型是'\u0000'(空字符)
每个程序运行时,都要在内存中分配专属空间
Java内存中又划分为5个区域:1、寄存器(cpu涉及的区域)2、本地方法区(是和系统相关的代码存储区域)3、栈内存4、堆内存5、方法区。
栈内存:存储的都是局部变量。变量运算区域一结束,就被释放。
局部变量:在方法上的参数,方法内的参数,语句中的变量。
堆内存:存储的是数组和对象。堆内存中存储的都是实体。
堆的特点:1、任何实体都有内存地址值。2、堆内存中的变量都有默认的初始化值。
Int[ ] arr=new int [3];堆内存中这个实体int[3]只是把它在堆内存中的首地址赋给了栈内存中main空间中的arr变量。真正的实体并没有存储到arr变量中去。Arr变量只是持有了实体的首地址值,指向或者说引用了该实体。而基本数据类型是直接存储到变量中。
一个实体可存在多个引用的变量,即可以被多个变量所指向。
int[]arr1=new int[3];
int[]arr2=new int[3];是两个不同的数组。
int[]arr1=new int[3];
int[]arr2=arr1;将arr1所持有的实体首地址赋给arr2.让arr2也可引用该实体。
arr1[0]=30;
System.out.println(arr2[0]);结果是30
arr1=null;就是把变量所持有的实体首地址更为null值,即不再指向实体。
实体只有在不再被引用时,才会被垃圾回收器回收。