Java笔记1 Java编程基础<2>循环语句、函数(重载)、变量和数组的内存结构

时间:2023-01-09 19:41:39


基础

03-01-语句(while)

Tip:循环体结构                                                                          

1.代表语句:while,do while,for

while 语句格式:

while(条件表达式){

执行语句;

}

do{

执行语句;

}while(条件表达式);

do while的特点:条件无论是否满足,循环体至少被执行一次。

 

for格式:

for(初始化表达式;循环条件表达式;循环后的操作表达式){

       执行语句;

}

注意:

(1)   for里面的两个表达式运行的顺序,初始化表达式只读取一次,判断循环条件,为真就执行循环体,然后再执行循环体后的操作表达式,接着继续判断循环条件,如此重复,直到条件不满足时退出循环。

(2)   while与for可以互换,区别在于for为了循环而在for结构体内定义的变量在for循环结束时就在内存中释放,而while循环用于条件判断使用的变量在循环结束后还可以继续使用。

(3)   最简单的无限循环格式:while(true){…},for(;;){…},无限循环的原因是并不知道循环多少次,而是根据某些写条件,来控制循环。

一个可以运行的for循环示例:

int x = 1;

for(System.out.println(“a”);x<3;x++,System.out.println(“c”)){

System.out.println(“d”);

}

结果:

adcdc

 

总结:

什么时候使用循环结构?

当对某些语句执行很多次时,就可以使用循环结构。

 

03-06-语句(for语句练习-累加计数器)

Tip:练习。

1~100之间7的倍数的个数,并打印。

思路分析:...//略

实现步骤:...//略

代码实现:如下

class Fortest{

public static void mai(String[] args){

        for(inti=1,count=0;i<=100;i++){

            if(i%7==0){

                count++;

                System.out.print(i+" ");

            }

            if(i==100){

            System.out.println();

            System.out.println("1~100以内能被7整除的数共"+count+"个");

            }

        }

}

}

运行结果:

7 14 21 28 35 42 49 56 6370 77 84 91 98

1~100以内能被7整除的数共14个

 

上述代码定义的变量虽然在for循环结构体内,for循环结束后,变量就在内存中释放了,但是在循环体内却要增加了if语句判断来达到打印效果,这样就会大大降低代码的运行效率。

如果修改为下面的代码:

class Fortest{

public static void mai(String[] args){

int count = 0;

        for(int i=1;i<=100;i++){

            if(i%7==0){

                count++;

                System.out.print(i+" ");

            }

        }

System.out.println();

            System.out.println("1~100以内能被7整除的数共"+count+"个");

}

}

 

这段程序的运行效率就比上一个程序的运行效率显著提升了,但有一个小缺憾就是,变量count未在for循环结束时在内存中释放。

 

总结

在定义循环体结构时,循环体中需要的变量既可以定义在循环体外部,又可以定义在循环体内部的,要根据具体场合,在内存开销和运行效率之间有一个取舍。

 

03-08-语句(for嵌套练习)

打印正直角三角形。

代码:

for(inti=1;i<=5;i++){

for(int j=1;j<=x;j++){

System.out.println(y);

}

System.out.println();

}

 

03-09

打印9*9乘法表。

代码:

for(inti=1;i<=9;i++){

for(int j=1;j<=x;j++){

System.out.print(y+”*”+x+”=”+y*x+”\t”);

}

System.out.println();

}

 

03-10-语句(break-continue)

Tip:其他流程控制语句

break(跳出),continue(继续)

break语句:应用范围:选择语句和循环语句。

continue:运用于循环语句。

 

a.break语句结束循环体循环。

b.continue语句结束本次循环继续下次循环。

 

03-11-函数(概述)

1.函数(或方法)的定义:定义在类中的具有特定功能的一段独立小程序。

2.函数的格式:

修饰符 返回值类型 函数名(参数类型 形式参数1,参数类型 形式参数2,...){

执行语句;

return 返回值;

}

返回值类型:函数运行后的结果的数据类型。

参数类型:是形式参数的数据类型。

形式参数:是一个变量,用于存储调用函数时传给函数的实际参数。

实际参数:传递给形式参数的具体数值。

return:用于结束函数。

返回值:该值会返回给调用者。

3.注意:

(1)函数中只能调用函数,不可以在函数内部定义函数。

(2)定义函数时,函数的结果应该返回给调用者,交由调用者处理。

 

03-13-函数(应用)

1.如何定义一个函数?

(1)既然函数是一个独立的功能,那么该函数的运算结果是什么应该先明确。

(2)在明确定义该功能的过程中是否需要未知的内容参与运算。

明确函数的参数列表(参数的类型和参数的个数)。

需求:定义一个功能,完成3+4运算,并将结果返回给调用者。

分析:

(1)明确功能的结果,是一个整数的和。

(2)在实现该功能的过程中是否有位置的内容参与运算,没有。

其实这两个功能就是在明确函数的定义。

(1)是在明确函数的返回值类型。

(2)明确函数的参数列表(参数的类型和参数的个数)。

代码参考:

public static intadd(int a,int b){

return a+b;

}

public static voidadd(int a,int,b){//这个功能定义思想有问题,为什么呢?因为只为完成加法                              //运算,至于是否对和打印,那是调用者的事,不要再该功能中完成。

System.out.println(a+b);

return ;//可省略不写

}

 

03-15-函数(重载)

Tip:函数的重载

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

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

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

4.重载示例:

返回两个整数的和:

int add(int x,int y){return x+y;}

返回是三个整数的和:

int add(int x,int y,int z){return x+y+z;}

返回两个double数的和

double(double x,double y){return x+y;}

5.什么时候重载呢?

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

 

03-16-函数(重载练习)

 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){}//重载,因为参数类型不同。

注意:

(1)重载和返回值类型没有关系。

(2)参数列表的参数是有顺序之分的。

c.

void show(int a,double c,char b){}//重载,因为参数类型不同。

d.

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

e.

double show(int a,char y,double z){}//注意,这类函数不可以和给定函数同时存在一个类                                                    //中。

 

03天-17-数组(概述-内存结构)

Tip:数组的定义

1.概念:

同一种数据类型的集合。其实数组就是一个容器。

2.数组的好处:

可以自动给数组中的元素从0开始编号,方便操作这些元素。

3.格式

格式1:

元素类型[] 数组名  =  new 元素类型[元素个数或数组长度];

示例: int[] arr  =  new int[5];

格式2:

元素类型[] 数组名 = new 元素类型[]{元素,元素,...};

int[] arr = newint[]{3,5,1,7};

int[] arr ={3,5,1,7};

4.常见代码示例

in[] arr = newint[3];

System.out.println(arr[3]);

/*编译通过,运行时错误:ArayIndexOutOfBoundsException:3,操作数组时,访问到了数组中不存在的角标。

*/

 

int[] arr = newint[3];

arr = null;

System.out.println(arr[1]);

/*编译通过,运行时出错:NullPointerException,空指针异常:当引用没有任何指向值为null的情况,该引用还在用于操作实体。

*/

 

Tip:内存结构

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

1.栈内存

用于存储局部变量,但数据使用完,所占空间会自动释放。

2.堆内存

数组和对象,通过new建立的示例都会存放在堆内存中。

堆内存的三个特点:

a.每一个实体都有内存地址值。

b.实体中的变量都有默认的初始值。

c.实体不在被使用,会在不确定的时间内被垃圾回收器回收。

3.方法区,本地方法区,寄存器//本节未讲

4.堆内存中实体默认的初始化值:

int 0  double 0.0   float 0.0f   boolean false   char ‘\u000’

5.分析变量和数组在内存中的存放形式,如下图:


Java笔记1  Java编程基础<2>循环语句、函数(重载)、变量和数组的内存结构