Java语言程序设计第1章课件.ppt
Java 语言程序设计第一章第一章Java语言基础知识语言基础知识清华大学清华大学 郑郑 莉莉1本章主要内容本章主要内容lJava语言与面向对象的程序设计语言与面向对象的程序设计lJava程序概述程序概述l基本数据类型与表达式基本数据类型与表达式l数组的概念数组的概念l数组的创建和引用数组的创建和引用2Java语言与面向对象的程序设计语言与面向对象的程序设计l面向对象的程序设计思想面向对象的程序设计思想lJava语言的特点语言的特点lJava类库类库3面向对象的程序设计思想面向对象的程序设计思想l将客观事物看作具有状态和行为的对将客观事物看作具有状态和行为的对象,通过抽象找出同一类对象的共同象,通过抽象找出同一类对象的共同状态和行为,构成类。状态和行为,构成类。l面向对象语言的基本特征面向对象语言的基本特征抽象和封装继承性多态性4Java语言的特点语言的特点l面向对象面向对象l安全性安全性Java不支持指针Java的内部安全措施l平台无关性平台无关性l多线程多线程Java是第一个在语言级提供内至多线程支持的高级语言l内存管理内存管理Java对内存自动进行管理并进行垃圾回收5Java与与C+的区别的区别lJava中没有中没有#include和和#define等预处理功能,等预处理功能,用用import语来句包含其它类和包;语来句包含其它类和包;lJava中没有中没有structure,union及及typedef;lJava中没有不属于类成员的函数,没有指针和多中没有不属于类成员的函数,没有指针和多重继承,重继承,Java只支持单重继承;只支持单重继承;lJava中禁用中禁用goto,但,但goto还是保留的关键字;还是保留的关键字;lJava中没有操作符重载;中没有操作符重载;lJava中没有自动类型转换,要求强制转换;中没有自动类型转换,要求强制转换;lJava中没有全局变量,可以在类中定义公用、静中没有全局变量,可以在类中定义公用、静态的数据成员实现相同功能;态的数据成员实现相同功能;.6Java类库类库l类类包含实现特定功能的方法l方法有返回信息类是用来构成Java程序的模块lJava包含标准类库包含标准类库经过编译的,可在程序中使用的Java代码标准库。称为Java APIs(Application Programming Interfaces)7Java程序概述程序概述lJava开发环境开发环境lApplication举例举例lApplet举例举例8Java程序程序编译和解释编译和解释9Java程序程序一次编写,各处运行一次编写,各处运行10Java平台平台lJavaAPIs(应用程序应用程序接口接口)经过编译的,可在程序中使用的Java代码标准库。lJavaVM(虚拟机)(虚拟机)Java 程序由Java虚拟机程序执行(或解释执行)。11Java2SDK(Java2(platform)softwareDevelpingkit)lJava2SDK标准版标准版(J2SE)开发工具 运行环境 附加库 Applets 和 Applications 的演示12Java2运行环境运行环境l包括包括:Java 虚拟机组成Java 2 平台API的类。帮助文档。l不包括不包括:编译器和调试器等开发工具。13编译编译,没有绝对地址没有绝对地址将将.class文件装载到文件装载到内存内存Java源程序源程序(.java文件文件)Java编译器编译器Java Bytecode(.class文件文件)系统执行平台系统执行平台Bytecode 解释器解释器Bytecode 载入器载入器字节码校验器字节码校验器不存在伪造的指针不存在伪造的指针不违反访问权限不违反访问权限不非法访问对象不非法访问对象不导致操作栈溢出不导致操作栈溢出 Java的编译与执行的编译与执行14Java虚拟机虚拟机JavainterpreterJust-in-timecompilerRuntime SystemOperating SystemHardwarel不同的操作系统有不同的虚不同的操作系统有不同的虚拟机。它类似一个小巧而高拟机。它类似一个小巧而高效的效的CPUCPU。lBytecodeBytecode代码是与平台无关代码是与平台无关的是虚拟机的机器指令。的是虚拟机的机器指令。lJavaJava字节代码运行的两种方字节代码运行的两种方式式:Interpreter(Interpreter(解释方式解释方式)Just-in-time(Just-in-time(即时编译即时编译):):由代码生成器将字节代码转由代码生成器将字节代码转换成本机的机器代码,然后换成本机的机器代码,然后可以以较高速度执行可以以较高速度执行.15Java开发环境开发环境JDK:Java2 SDK Standard Edition V1.4(http:/ Bytecode。lJava:Java解释器,执行已经转换成Bytecode的java应用程序。lJdb:Java调试器,用来调试java程序。lJavap:反编译,将类文件还原回方法和变量。lJavadoc:文档生成器,创建HTML文件。lAppletviwer:Applet解释器,用来解释已经转换成Bytecode的java小应用程序。Java开发工具包括开发工具包括19设置环境变量:设置环境变量:PATH=c:jdk1.4.0bin;CLASSPATH=.;c:jdk1.4.0LIB;c:javaexamplesapplicationsWindowsNT/2000/XP:控制面板:控制面板/系统系统/高级高级/环境变量环境变量C:Jdk1.4.0binlibjavacjavaappletviewer用户类文件所在目录用户类文件所在目录c:javaexamplesapplications当前目录当前目录jre demo20集成环境集成环境lJcreatorLElhttp:/ code=.class width=400 height=40029一个简单实例一个简单实例publicclassex1_1publicstaticvoidmain(Stringargs)finalintPRICE=30;finaldoublePI=3.141592654;intnum,total;doublev,r,h;num=10;total=num*PRICE;System.out.println(total);r=2.5;h=3.2;v=PI*r*r*h;System.out.println(v);变量声明变量声明变量变量文字量文字量常量声明常量声明30基本数据类型基本数据类型l浮点运算浮点运算比较运算符(关系运算符)l算术比较运算符 ,and=l算术相等比较运算符=and!=算术运算符l一元运算符+和-l+,-*,/,和%(取余)l自增/自减运算符+/-l移位运算符,and l位运算符,&,|,and 条件运算符?:类型转换运算符字符串连接运算符+36基本数据类型基本数据类型l布尔类型和布尔值布尔类型和布尔值布尔类型表示一个逻辑量,有两个取值:true和false例如:boolean is_salaried;boolean is_hourly;is_salaried=true;/将 is_salaried设置为trueis_hourly=false;/将is_hourly设置为false 37基本数据类型基本数据类型l布尔运算符布尔运算符关系运算符=and!=逻辑“非”运算符!逻辑运算符&,和|条件“与”和条件“或”运算符&和|条件运算符?:字符串连接运算符+38String字符串字符串lString是一个类是一个类lString类类JDK标准类集合中的一部分标准类集合中的一部分String animal=walrus;39文字量文字量l直接出现在程序中并被编译器直接使直接出现在程序中并被编译器直接使用的值用的值.40文字量文字量l布尔文字量布尔文字量布尔类型只有两个值,由文字量 true 和 false表示43文字量文字量l字符文字量字符文字量一个字符文字量表示为一个字符或者一个转义序列,用单引号括起l例如 a Z 格式字符 b backspace BS t horizontal tab HT n linefeed LF f form feed FF r carriage return CR double quote single quote backslash 44文字量文字量l字符串文字量字符串文字量由零个或多个字符组成,以双引号括起每一个字符都可以用转义序列来表示 例如:/空字符串 /只包含 的字符串 This is a string /有16个字符的字符串 This is a +string/字符串常量表达式,由两个字符串常量组成 45表达式表达式l表达式是由一系列变量、运算符、方法调表达式是由一系列变量、运算符、方法调用构成的,表达式可以计算出一个值来用构成的,表达式可以计算出一个值来l程序中的很多工作是通过计算表达式的值程序中的很多工作是通过计算表达式的值来完成的。来完成的。有时需要的是表达式的副作用,例如赋值表达式将数值赋给变量更多时候起作用的是表达式的值,这个值可以用作函数的参数,或更大的表达式的操作数,或者影响语句的执行顺序46算术运算符算术运算符l运算符运算符+和和-例如:i+;-j;l一元运算符一元运算符+和和l加法运算符加法运算符+和和-l乘法运算符乘法运算符*,/,和和%47赋值运算符赋值运算符l简单赋值运算符简单赋值运算符=l符合赋值运算符符合赋值运算符*=/=%=+=-=&=|=E1 op=E2 等效于 E1=(T)(E1)op(E2),其中T 是 E1的类型48赋值运算符赋值运算符l举例举例a=5表达式的值为 5a=b=c=5 表达式的值以及 a,b,c 的值都是 5 a=5+(c=6)表达式的值是 11,a 是 11,c 是 6a=(b=4)+(c=6)表达式的值是 10,a是10,b是4,c是6a=(b=10)/(c=2)表达式的值是 5,a是5,b是10,c是2a+=a-=a*a 等效于 a=a+(a=a-a*a)49关系运算符关系运算符l关系表达式的类型永远是布尔类型关系表达式的类型永远是布尔类型(bool).l算术比较运算符算术比较运算符,and=l类型比较运算符类型比较运算符instanceof例如:e instanceof Point/Point 是一个类50相等关系运算符相等关系运算符l数字相等运算符数字相等运算符=and!=l布尔相等运算符布尔相等运算符=and!=l引用相等运算符引用相等运算符=and!=51逻辑运算符逻辑运算符l“与与”运算运算&如果两个操作数的值都为true运算结果为true;否则,结果为false.l“或或”运算运算|如果两个操作数的值都为false运算结果为false;否则,结果true52条件运算符条件运算符?:表达式表达式1 1?表达式?表达式2 2:表达式:表达式3 3l首先计算表达式首先计算表达式1l如果表达式如果表达式1的值为的值为truetrue,则选择表达式则选择表达式2的值的值l如果表达式如果表达式1的值为的值为falsefalse,则选择表达式则选择表达式3的值的值53逻辑逻辑“非非”运算符运算符!!操作数!操作数l操作数的类型必须是布尔类型操作数的类型必须是布尔类型l如果操作数的结果为如果操作数的结果为falsefalse,则表达式则表达式的结果为的结果为 truetrue,如果操作数的结果为如果操作数的结果为truetrue则表达式的结果为则表达式的结果为 false false54类型转换和提升类型转换和提升l每个表达式都有类型每个表达式都有类型l如果表达式的类型对于上下文不合适如果表达式的类型对于上下文不合适有时可能会导致编译错误有时语言会进行隐含类型转换55类型转换和提升类型转换和提升l扩展转换扩展转换byte,short,int,long,float,double char从一种整数类型到另一种整数类型,或者从float到double的转换不损失任何信息从整数类形向float或double转换,会损失精度l窄化转换窄化转换double,float,long,int,short,byte,char窄化转换可能会丢失信息56类型转换和提升类型转换和提升l字符串转换字符串转换任何类型(包括null类型)都可以转换为字符串类型57类型转换上下文类型转换上下文l赋值转换赋值转换将表达式类型转换为制定变量的类型l方法调用转换方法调用转换适用于方法或构造函数调用中的每一个参数l强制转换强制转换将一个表达式转换为类型转换运算符指定的类型例如 (float)5.0l字符串转换字符串转换只当一个操作数是String类型时适用于+运算符的操作数58类型转换上下文类型转换上下文l数字提升数字提升 将算术运算符的操作数转换为共同类型一元数字提升一元数字提升l如果一个操作数是 byte,short,或 char类型,一元数字提升通过扩展转换将它转换为int类型二元数字提升二元数字提升l二元数字提升作用在特定操作符的操作数上*,/,%,+,-,=,=,!=,&,|and?:l在必要时使用扩展转换来转换操作数类型59标准输入标准输入/输出简介输出简介l标准输入流标准输入流System.inl标准输出流标准输出流System.outl例如例如System.out.println(Hello world!);60数组的概念数组的概念l数组由同一类型的一连串对象或数组由同一类型的一连串对象或者基本数据组成,并封装在同一者基本数据组成,并封装在同一个标识符(数组名称)下。个标识符(数组名称)下。l数组是对象数组是对象动态初始化可以赋值给Object类型的变量在数组中可以调用类Object 的所有方法61数组的概念数组的概念l数组元素数组元素数组中的变量被称作数组的元素元素没有名字,通过数组名字和非负整数下标值引用数组元素。每个数组都有一个由 public final 修饰的成员变量:length,即数组含有元素的个数(length可以是正数或零)62数组声明与引用数组声明与引用l声明(声明(Declaration)Type arrayName;或Type arrayName;例如int ai;float r,af;63声明与引用声明与引用l构造构造arryName=new Typenumber of componets;number of componets 可以是常量或变量。例如 int ai;ai=new int10;或者 int ai=new int 10;64声明与引用声明与引用l初始化初始化缺省情况下,数组元素为它们所属类型的缺省值。数字元素缺省初始化为0。程序可以在数组被构造之后改变数组元素值。Java 语言允许构造数组的同时初始化数组。例如int ai=1,2,3,4,5;65声明与引用声明与引用l引用引用通过下面的表达式引用数组的一个元素:arrayNameindex数组下标必须是 int,short,byte,或者 char.下标从零开始计数.元素的个数即为数组的长度,可以通过 arryName.length引用 元素下标最大值为 length-1 66声明与引用声明与引用int data=new int10;int data=new int10;ldata-1非法的非法的ldata10非法的非法的ldata1.5非法的非法的ldata0合法的合法的ldata9合法的合法的67声明与引用声明与引用intvalues=newint7;intindex;index=0;valuesindex=71;index=5;valuesindex=23;index=3;values2+2=valuesindex-3;68例子例子classGausspublicstaticvoidmain(Stringargs)intia=newint101;for(inti=0;iia.length;i+)iai=i;intsum=0;for(inti=0;iia.length;i+)sum+=iai;System.out.println(sum);输出输出:505069对象数组对象数组l例子例子public class ArrayOfStringsDemo public class ArrayOfStringsDemo public static void main(String args)public static void main(String args)String anArray=String anArray=String One,String Two,String Three;String One,String Two,String Three;for(int i=0;i anArray.length;i+)for(int i=0;i anArray.length;i+)System.out.println(anArrayi.toLowerCase();System.out.println(anArrayi.toLowerCase();70字符串引用构成的数组字符串引用构成的数组StringstrArray;strArray=newString8;strArray0=Hello;71数组名是一个引用数组名是一个引用例子例子public class Arrays public static void main(String args)int a1=1,2,3,4,5;int a2;a2=a1;for(int i=0;i a2.length;i+)a2i+;for(int i=0;i a1.length;i+)System.out.println(a1+i+=+a1i);72数组的复制数组的复制public static void public static void arraycopyarraycopy(Object(Objectsourcesource,intintsrcIndexsrcIndex,Object,Objectdestdest,int,intdestIndexdestIndex,int,intlengthlength )source73数组的复制数组的复制例子例子public class ArrayCopyDemo public static void main(String args)char copyFrom=d,e,c,a,f,f,e,i,n,a,t,e,d;char copyTo=new char7;System.arraycopy(copyFrom,2,copyTo,0,7);System.out.println(new String(copyTo);74二维数组二维数组int gradeTable;int gradeTable;gradeTable 0 1 gradeTable 0 1 为为42gradeTable 3 4 gradeTable 3 4 为为93gradeTable 6 2 gradeTable 6 2 为为7875二维数组的声明和构造二维数组的声明和构造lintmyArray;myArray 可以存储一个指向2维整数数组的引用。其初始值为null。lintmyArray=newint35;建立一个数组对象,把引用存储到myArray。这个数组所有元素的初始值为零。lintmyArray=8,1,2,2,9,1,9,4,0,3,0,3,0,0,7;建立一个数组并为每一个元素赋值。76二维数组的长度二维数组的长度class unevenExample2class unevenExample2 public static void main(String arg)public static void main(String arg)int uneven=int uneven=1,9,4,1,9,4,0,2,0,2,0,1,2,3,4 ;0,1,2,3,4 ;System.out.println(Length is:+System.out.println(Length is:+uneven.length);uneven.length);77每行的长度每行的长度classunevenExample3publicstaticvoidmain(Stringarg)/声明并构造一个声明并构造一个2维数组维数组intuneven=1,9,4,0,2,0,1,2,3,4;78/数组的长度数组的长度(行数行数)System.out.println(Lengthofarrayis:+uneven.length);/数组每一行的长度(列数)数组每一行的长度(列数)System.out.println(Lengthofrow0is:+uneven0.length);System.out.println(Lengthofrow1is:+uneven1.length);System.out.println(Lengthofrow2is:+uneven2.length);79二维数组的实现二维数组的实现intmyArray;myArray=newint3;myArray0=newint3;intx=0,2;inty=0,1,2,3,4;myArray1=x;myArray2=y;80多维数组多维数组l例子例子MultiDimArray.java(Thinking in Java 第4章)81