黑马程序员——JAVA基础之函数,重载,内存结构

时间:2021-03-05 00:38:18

 

------- android培训java培训、期待与您交流! ---------- 

 

函数:

什么是函数?
• 函数就是定义在类中的具有特定功能的一段独立小程序。
• 函数也称为方法。


函数的格式:
• 修饰符 返回值类型 函数名(参数类型 形式参数1,参数类型 形式参数2,)
{
执行语句;
return 返回值;
}


返回值类型:函数运行后的结果的数据类型。
参数类型:是形式参数的数据类型。
形式参数:是一个变量,用于存储调用函数时传递给函数的实际参数。
实际参数:传递给形式参数的具体数值。
return:用于结束函数。
返回值:该值会返回给调用者。

 

函数的特点?

定义函数可以将功能代码进行封装
便于对该功能进行复用
函数只有被调用才会被执行
函数的出现提高了代码的复用性

对于函数没有具体返回值的情况,返回值类型用关键字void表示,那么该函数中的return语句如果在最后一行可以省略不写。

注意:
•  函数中只能调用函数,不可以在函数内部定义函数。
•  定义函数时,函数的结果应该返回给调用者,交由调用者处理。

 

两个明确
•  明确要定义的功能最后的结果是什么?
•  明确在定义该功能的过程中,是否需要未知内容参与运算

 

import java.util.Scanner;

/**
*
* 需求:定义一个函数,功能是打印指定个数的乘法口诀表
*
* 明确:1.没有返回值,为void
* 2.有1个参数参与运行,类型为int
*
*/
public class HanshuDemo
{
public static void main(String [] args)
{
//从键盘扫描一个信息
Scanner in = new Scanner(System.in);
System.out.print("请输入一个正整数:");
int z = in.nextInt();//将输入信息的下一个标记扫描为一个 int
chengFa(z);//调用函数
}

//定义函数功能,输入一个正整数,打印这个数之内的乘法口诀表
public static void chengFa(int i)
{
for (int y=1;y<=i;y++)
{
for (int x=1;x<=y;x++)
{
System.out.print(x+"*"+y+"="+(x*y)+"\t");
}
System.out.println();
}
}
}


 

 

函数的重载:在同一个类中,允许存在一个以上的同名函数,只要它们的参数个数或者参数类型不同即可。

 

重载的特点:与返回值类型无关,只看参数列表。

 

重载的好处:方便于阅读,优化了程序设计。

 

什么时候用重载?
当定义的功能相同,但参与运算的未知内容不同。那么,这时就定义一个函数名称以表示起功能,方便阅读,而通过参数列表的不同来区分多个同名函数。

 

下列哪个是重载?    void show(int a,char b,double c){ }

a.
void show(int x,char y,double z){ }//没有,因为和原函数一样。

b.
int show(int a,double c,char b){ }//重载,因为参数类型不同。注意:重载和返回值类型没关系。
c.

void show(int a,double c,char b){ }//重载,因为参数类型不同。注意:重载和返回值类型没关系。

d.
boolean show(int c,char b){ }//重载了,因为参数个数不同。

e.
void show(double c){ }//重载了,因为参数个数不同。

f.
double show(int x,char y,double z){ }//没有,这个函数不可以和给定函数同时存在与一个类中。


 

内存结构

Java程序在运行时,需要在内存中的分配空间。为了提高运算效率,有对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。

 

具体有5种:栈内存,堆内存,方法区,本地方法区,寄存器。

 

栈内存:  用于存储局部变量,当数据使用完,所占空间会自动释放。堆内存:  数组和对象,通过new建立的实例都存放在堆内存中。
              每一个实体都有内存地址值。
              实体中的变量都有默认初始化值。
              实体不在被使用,会在不确定的时间内被垃圾回收器回收。

 

      在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用。

      堆内存用于存放由new创建的对象和数组。在堆中分配的内存,由java虚拟机自动垃圾回收器来管理。在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组或者对象在堆内存中的首地址,在栈中的这个特殊的变量就变成了数组或者对象的引用变量,以后就可以在程序中使用栈内存中的引用变量来访问堆中的数组或者对象,引用变量相当于为数组或者对象起的一个别名,或者代号。

      引用变量是普通变量,定义时在栈中分配内存,引用变量在程序运行到作用域外释放。而数组&对象本身在堆中分配,即使程序运行到使用new产生数组和对象的语句所在地代码块之外,数组和对象本身占用的堆内存也不会被释放,数组和对象在没有引用变量指向它的时候,才变成垃圾,不能再被使用,但是仍然占着内存,在随后的一个不确定的时间被垃圾回收器释放掉。这个也是java比较占内存的主要原因,实际上,栈中的变量指向堆内存中的变量,这就是 Java 中的指针!

       从堆和栈的功能和作用来通俗的比较,堆主要用来存放对象的,栈主要是用来执行程序的.而这种不同又主要是由于堆和栈的特点决定的

      栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量(,int, short, long, byte, float, double, boolean, char)和对象句柄。 

 --------引用http://blog.csdn.net/chengyingzhilian/article/details/7781858

 

 

------- android培训java培训、期待与您交流! ----------