Java语言基础(北大青鸟上课课件).ppt
JAVA初级编程,第二章 Java语言基础陈峥,1,本次课程目标,理解标识符,变量和常量认识Java基本数据类型学会使用格式化输出使用Java运算符书写Java表达式理解程序控制的概念运用条件语句控制程序的执行理解并使用关键字break和continueJava中的数组垃圾回收机制理解命令行参数的使用使用新的输入方式,2,本章词汇,变量,在程序运行过程中产生的数据和结果都需要存放在内存中,而变量是Java中存储数据的基本单元变量在使用前必须声明,语法为:数据类型 标识符=值,标识符=值;标识符也称变量名,一个标识符表示一块用于存储数据的内存空间,数据类型表示该空间能存储的数据格式和大小.在声明变量的时候可以通过逗号隔开声明多个同类型的变量,数据类型,数据类型用来确定要存储在内存单元中的数据的类型;在Java中,数据类型被区分成两个种类:原始数据类型引用数据类型,Java数据类型,基本类型,引用类型,数据类型,boolean,浮点数类型,整数类型,字符类型,数组类型,接口类型,类类型,引用,char,long,int,short,byte,double,float,接口类型,类类型,数组类型,接口类型,类类型,引用,数组类型,接口类型,类类型,引用类型,引用,数组类型,接口类型,类类型,原始数据类型,原始数据类型一共为八种byte 字节型char 字符型boolean 布尔型short 短整型int 整型long 长整型float 浮点型double 双精度每种原始数据类型一次只能存放一个值,是Java中最简单的数据形式,引用数据类型,在Java中,除了上述8种原始数据类型的变量以外,其余的全都属于引用数据类型,其中包括:Array 数组Class 类Interface 接口存储在引用类型变量中的值是该变量表示的值的地址,标识符,变量、方法、数组、对象、类和接口等等都需要命名,这些名称统称为标识符;Java中对于标识符的命名规则作了如下限制:只能由英文字母、数字、下划线“_”和“$”符号组成;必须以英文字母、“_”或“$”开头,即不能以数字开头;除“_”和“$”以外,不能包含其它任何特殊字符;不能与关键字冲突;严格区分大小写。并且变量名命名规范以小写字母开头,从第二个单词开始首字母大写,作用域与生命周期,每个变量都有其作用域,离开这个作用域将无法被直接访问在Java中变量的作用域以来定义变量被声明以后便在内存中开辟了一块用于存放变量值的空间,不再使用的变量所表示的空间会被释放,这个过程我们称为变量的生命周期在Java中变量的生命周期与作用域相同,暨程序执行到某句声明语句时开辟该声明变量所在的空间,当程序执行离开该变量所在的以后,该变量则被释放销毁结束生命周期,类型转换,程序中经常会遇到要将数据类型进行转换的情况(如:在一个表达式中存在不同类型的操作数时)数据类型转换有两种情况:自动类型转换强制类型转换,自动类型转换,自动类型转换也称作隐式类型转换;将一种类型的变量赋值给另一种类型的变量时,只要满足以下条件,就会发生自动类型转换:两种类型之间相互兼容;目标类型大于源类型;如:char ch=A;int num=ch;float f=num;double d=f;/类型转换自动发生,无需显式说明,强制类型转换,强制类型转换也称作显式类型转换;如果被转换的值的数据类型大于其目标类型,将会丢失部分信息;如:int x=65;char ch=x;这样的语句将报错,因为char类型小于int类型,编译器无法将其自动转换,只能进行强制转换:int x=65;char ch=(char)x;,输出语句,如果要将某些信息打印到屏幕上,就必须使用输出语句;使用System.out.println()实现换行输出效果;使用System.out.print()实现输出但不换行效果;以上无论输出什么类型的数据,只需将数据作为参数传递给它们即可,而无需像C语言中那样,使用%s、%d之类的控制字符,但是支持/n,/t等格式符使用System.out.printf()实现C语言的输出方式,需要转换符支持,连接符,在Java中+号具备两种操作:当+号两边的操作数皆为数据类型的时候执行加法运算,结果为数据类型当+号两边任意一边的操作数为字符串的时候执行连接操作,结果为字符串类型,运算符与表达式,运算符是通过一定的运算规则操作一个或多个操作数,并生成结果的特定符号;运算符和操作数的有效组合称为表达式;Java提供了一系列丰富的运算符,包括:算术运算符赋值运算符关系运算符逻辑运算符三元运算符,算术运算符,算术运算符主要用于数学计算,一般使用数值作为操作数:,赋值运算符(一),=在程序中是赋值运算符,其作用是获取右边的值,赋给左边右边可以是任何有结果的表达式,常量或者变量左边必须是一个已声明的变量对于基本数据类型赋值很直接,是将实际的值复制一份赋给接收的变量存储,对这个值的任何后续修改都不会影响其他变量对于引用数据类型的赋值则不同,由于引用数据类型的变量实际保存的是一个指向实际值的地址,所以使用=的结果只是将地址交给接收的变量,让这个变量也引用这个空间,如果这个空间的值被修改,所有引用这块空间的变量都会受影响,赋值运算符(二),在Java中对于一般的运算表达式也提供了一种简写方式,关系运算符,关系运算符可以测试两个操作数之间的关系(但不会改变操作数的值),关系表达式的结果为boolean型true/false:,逻辑运算符,逻辑运算符与boolean型操作数一起使用:,三元运算符,三元运算符又称为条件运算符一般形式为:表达式1?表达式2:表达式3根据表达式1的结果来判断执行表达式2还是表达式3,如果表达式1的结果为true,则执行表达式2,否则执行表达式3;条件运算符在某些情况下能够替代小型的ifelse语句。,运算符的优先级,很多情况下,一个表达式由多个运算符组成,优先级决定运算符的计算顺序:,控制流语句,一般情况下,程序是从上往下依次顺序执行的;但很多时候,我们需要改变程序执行的流程,这就使用到了控制流语句;控制流语句包括:判断语句循环语句跳转语句,选择语句,选择语句也称作条件语句或判断语句;选择语句主要用来控制程序在何种情况下执行某一部分;选择语句包括:if语句ifelse语句ifelse if语句switchcase语句,循环语句,循环语句可用于重复执行相同的操作;循环语句包括:while语句dowhile语句for语句,跳转语句,跳转语句允许以非线性的方式执行程序,可以将控制权转到程序的其它部分;跳转语句包括:break语句continue语句break可以使用在循环和switch中,continue只能存在循环中break和continue可以通过标签指定跳转的位置,替代C/C+的goto语句,数组,数组用于将相同类型的数据存储在连续的存储单元中;可以通过指定数组的名称和长度来声明数组;一旦声明数组的大小,就不能再修改;数组元素通过数组名和索引来访问,索引从0开始;数组可以是一维,也可以是多维。,回顾C语言中的数组,在C语言中,从存储方式上讲,声明数组有两种情况;在栈内存中分配空间,如:int ary10;/声明有10个整型元素的数组在堆内存中分配空间,如:int*p=NULL;/声明整型指针/指针指向堆空间p=(int*)malloc(10*sizeof(int);C语言允许数组被开辟在栈或堆中-。,new关键字,在Java中,不允许将数组分配在栈内存中,只能分配在堆内存中;Java中声明数组需要将类型修饰,使用,一个表示一个维数:int ary或int ary;Java中没有类似于malloc、calloc、realloc和free等函数,取而代之的是new关键字;new是Java中内置的操作符;new操作符用来从堆中分配指定类型的内存空间,并返回相应类型的引用,其作用类似于malloc函数。int ary=new int5;,声明数组示例,public class ArrayDemo public static void main(String args)/声明整型数组的引用,类似于C中的 int*p;int ary;/为数组引用在堆内存中分配实际的内存空间/类似于C中的 p=(int*)malloc(10*sizeof(int);ary=new int10;/使用循环为数组元素赋值 for(int i=0;i ary.length;i+)aryi=i;/使用循环将数组元素逐个输出到控制台 for(int i=0;i ary.length;i+)System.out.println(aryi);,Java中声明数组的几种方式,在Java中声明数组有如下方式:,/仅声明数组的引用,但没有分配内存空间float fAry;/声明数组的同时,根据指定的长度分配内存,但数组中没有值char chAry=new char10;/声明数组并分配内存,同时将其初始化int ary1=new int1,2,3,4,5;/与前一种方式相同,仅仅只是语法相对简略int ary2=1,2,3,4,5;,数组之间赋值,int ary1=2,4,6,8,10;int ary2;ary2=ary1;,数组赋值示例,public class ArrayDemo public static void main(String args)int ary1=2,4,6,8,10;/声明并初始化数组1 int ary2;/声明数组2 ary2=ary1;/将数组1赋值给数组2 ary23=1024;/通过数组2修改其中一个元素的值/打印出数组1中的元素 System.out.println(数组1中的元素:);for(int i=0;i ary1.length;i+)System.out.println(ary1i);/打印出数组2中的元素 System.out.println(数组2中的元素:);for(int i=0;i ary2.length;i+)System.out.println(ary2i);,关于数组长度,在Java中,程序员可以不再关注数组的长度,数组自带的length属性将负责保管数组的长度;对于二维数组可以分别使用ary.length和ary0.length获取行和列的长度C语言不检查数组的边界,数组索引完全由程序员掌握;Java对数组下标越界情况强加约束;如果试图访问不在有效索引以内的元素,将会引发运行错误。,垃圾回收机制,在C语言中,分配的堆内存在使用完毕以后,必须进行释放,否则将会造成内存泄漏;同样的,在Java中由new分配的内存也将存在内存泄漏的可能;但释放内存的任务是由Java虚拟机来完成的,程序员可以不再关心此项工作;如果某块内存空间没有任何引用指向它,那么虚拟机就将其认定为垃圾;虚拟机并不是随时随地地立即回收垃圾,而是在系统比较空闲的时候,才会执行回收任务。,命令行参数,在命令行使用java命令执行程序时,可以将一些参数传递给main函数;main函数携带的String(字符串数组)类型的形参args正是为了接收这些来自命令行的参数;可以从命令行传递任意多个字符串给main函数,其间使用空格隔开,也可以不传递任何参数;这些传递进来的多个字符串最后以字符串数组的形式,供main函数中加以使用。,输入语句,在JDK5.0以前的版本从键盘接收输入是件比较复杂的IO操作而现在提供了一种方便简单的输入方式:Scanner,import java.util.Scanner;public class Demo public static void main(String args)Scanner in=new Scanner(System.in);String str=in.next();int num=in.nextInt();double d=in.nextDouble();,IO的输入方式,传统的Java命令行输入使用IO方式,import java.io.BufferedReader;import java.io.InputStreamReader;public class Demo public static void main(String args)throws Exception BufferedReader br=new BufferedReader(new InputStreamReader(System.in);String msg=br.readLine();int num=Integer.parseInt(br.readLine();double db=Double.parseDouble(br.readLine();,总结,Java中的数据类型大体上分为两种:原始数据类型和引用数据类型;变量是存储数据的基本单位;运算符和流程控制基本上与C相似;Java中数组是引用数据类型,只能存放在堆内存中;数组必须由new关键字为其分配内存;释放内存的工作由Java虚拟机的垃圾回收机制来完成;可以利用命令行参数和Scanner接收来自用户的输入。,