黑马程序员_day04_Java基础之函数、数组

来源:互联网 发布:坚持健身100 天 知乎 编辑:程序博客网 时间:2024/06/01 17:50
----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

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在单独存在时,下面不能有语句,这和breakcontinue是类似的。

功能定义一般都有结果,若功能没有具体的结果,这是返回值类型在java中就用void关键字来表示。

如果函数的返回值类型是void,那么函数中的return语句是可以省略不写的。如main函数也是函数,结尾处肯定有return语句,只是其返回值类型是void,省略不写罢了。

如果函数有具体的返回值类型,那么必须写return语句以及具体的返回值。

函数之间是并列关系,但无论函数怎样排列,都是从主函数开始。主函数是第一个压栈。

函数内是不可以定义函数的,只可调用函数。

注意:不要把代码都写在主函数内,只要是功能,都可用函数来体现,主函数只用来调用已定义的功能,让该功能运行起来。

函数的返回值类型和参数是没有关系的。

函数定义时注意的事项:定义功能,功能中需要什么就定义什么,但是不需要的就不要定义,以免画蛇添足。至于功能结果,调用者怎么操作与我们无关,功能中不要去体现。

输出语句中,必须是运算完有具体结果数据的函数才可以被输出。若printlnA函数)而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]:定义了一个可以存储int类型元素的数组。

int [ ] arr:定义一个数组,元素类型是int ,名称是arr

arr[0]=66:名称是arr的数组,脚标是0的位置被赋值为66.

数组的定义其实也是定义变量,只不过不再是基本数据类型变量了,而是引用数据类型变量(数组、类、接口)

数组的默认初始化值:boolean类型是falseInt类型是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值,即不再指向实体。

实体只有在不再被引用时,才会被垃圾回收器回收。


原创粉丝点击