1、JAVA编程基础,中软总公司计算机培训中心,0,第一章 Java语言入门,提供了丰富的类库 广泛使用的网络编程语言 核心是以前被称为Oak的编程语言,旨在解决消费电子产品,James Goslingjava之父 Java技术三部分:语言,工具集,运行环境 Java家族成员:J2ME,J2SE,J2EE,1,Java语言的特点,简单性 面向对象 网络 健壮 安全 体系结构中立,可移植性 解释型 高性能 多线程 动态性,2,语言排名,3,Java 国际认证,对于JAVA程序设计员,Sun推出两项认证: Sun Certified JAVA Programmer (SCJP) Sun Certifi
2、ed JAVA Developer (SCJD),22,4,平台无关性,解释器对字节码进行解释,只要安装了java运行时系统,编写出的java程序就可以通过网络在不同平台上运行。,7,浏览器,5,程序运行过程,15,6,什么是JVM,JVM是用来定义Java字节代码在给定的计算机系统中如何被处理的一组规范。 可用软件实现,也可用硬件实现。可以在Java开发工具中,也可以在浏览器中。 编译器为JVM产生字节码(低级机器指令码),JVM执行这些命令。 所有支持Java小应用程序的Web浏览器都有内置的JVM,小应用程序在网络中传送,下载的是字节码,由建立于浏览器中的JVM进行解释。,9,7,垃圾回
3、收机制,Java提供动态分配内存。一般的语言,易发生“内存外漏“。但在Java中再也不用编程人员费神了,这是因为JVM(java Virtual Machine)内部有一种叫做垃圾收集器的线程。垃圾收集器一直在跟踪处理器空闲时期的内存状态。它可以找出不再使用的内存并自动消除。,12,8,垃圾回收机制特点:,1)程序员无权回收内存。(系统级线程跟踪每一个存储空间的分配情况) 2)系统自动完成。(在JVM空闲周期,垃圾收集线程检查,释放内存。) 3)时间不固定 4)程序员可以使本地变量失去意义,例使本地变量赋值为空 5)垃圾回收机制当运行用户线程时,不能回收内存 6)垃圾回收时必须是对象不再用.,
4、13,9,编写第一个Java程序,1、application程序 源程序 public class HelloWorld public static void main(String args) System.out.println(“Hello World!“); 编译 javac HelloWorld.java 执行 java HelloWorld 生成文档 javadoc HelloWorld.java 生成Jar包:jar -cvf h.jar Hello.class -xvf 为解压 反编译:javap HelloWorld;javap c HelloWorld,16,10,什么是a
5、pplet程序,2、applet 程序源程序:import java.applet.Applet;import java.awt.Graphics;public class Ex2 extends Applet public void paint(Graphics g) g.drawString(“hello world“,25,25); 编译:javac Ex2.java 嵌入HTML文件:运行:1)浏览器运行 2) 用工具appletviewer运行,11,Exercise,Whats wrong with this program?“public class Hellomain(Stri
6、ng args)System.out.println(“Hello“); ,12,第三章 Java语言基础,一 注释/ 单行注释/* 单、多行注释 */* 文档注释 */,39,13,Java语言基础,二、标识符可以是字母、数字、下划线、美元符不以数字开头(常考) 区分大小写不能为关键字(但可包含关键字),39,14,三.关键字,定义:是Java语言为特殊目的而保留的由ASCII字符构成的字符序列注:都是小写。,40,15,关键字列表: abstract boolean break byte case catch char class continue default do double el
7、se extends false final finally float for if implements import instanceof int interface long native new null package private protected public return short static super switch synchronized this throw throws transient true try void volatile while goto enum,四、基本数据类型, 整型 长度 表示范围 byte 1字节,8位 -2727-1 short
8、 2字节,16位 -215215-1 int 4字节,32位 -231231-1 long 8字节,64位 -263263-1常量:在内存中,缺省以int 型(四字节)存放 进制 变量赋值:同类型赋值,如果是不同类型赋值:低 高,系统自动转换高 低,必须强制类型转换,41,16,四、基本数据类型,2、浮点型float 4字节,32位 大约为+/- 3.40282347E+308double 8字节 64位 大约+/-1.79769313486231570E+308 表示:10.5(日常表示法) 0.105E/e2(科学计数法) 常量:在内存中,缺省以double型存放,42,17,四、基本数据
9、类型,3、字符型长度 范围 char 2字节 16位 065535 (0216-1)无符号整数4、逻辑型: booleantrue,false (小写),43,18,五.引用类型(3-19),除了基本数据类型外,其他的都是引用类型. 引用类型包含一个指向对象的句柄.Date d = new Date();new关键字的作用:给实例对象分配内存空间调用构造函数返回该内存空间的引用,44,19,六.值传递,1、基本数据类型传递值 class A public static void change(int a,int b) int t=a;a=b;b=t;System.out.println(“a:
10、“+a+“b:“+b); public static void main(String s) int a=5,b=6;change(a,b);System.out.println(“a:“+a+“b:“+b); ,45,20,引用类型传递引用,public class PassTestprivate int i=6;public PassTest(int m) i=m;public void setI(int n) i=n;public static voidchangeObj(PassTest pt)pt=new PassTest(22); public static void change
11、Attr(PassTest pt)pt.setI(33);public static void main(String args)PassTest t=new PassTest(44);changeObj(t);System.out.println(t.i);changeAttr(t);System.out.println(t.i); ,21,Exercise,在下列代码中运行到第九行时有多少对象符合垃圾回收条件 class Example public static void main(String args) String name; String newName=“Nick“; newN
12、ame=“Jason“; name=“Frieda“; String newestName=name; name=null; /第九行 ,Exercise,public class Foo public static void main(String args) PrintWriter out = new PrintWriter(new java.io.OutputStreamWriter(System.out),true); out.println(“Hello“); Which statement at Point X on line 1 allows this code to compi
13、le and run? A. import java.io.PrintWriter; B. include java.io.PrintWriter; C. import java.io.OutputStreamwriter; D. include java.io.OutputStreamWriter; E. No statement is needed,第三章 流程控制,目标:区分实例变量和局部变量描述实例变量是如何初始化的辨认、描述并使用运算符确认boolean表达式和它们在控制构造中的要求使用if, switch,for,while和do句型结构和break和 continue的标号形式作
14、为程序中的流程控制结构,变量,Java按作用域不同分为三类: 1)数据成员 2)方法局部变量(仅在方法内可用) 3)方法的参数 1.变量声明格式:变量类型 变量名; 2.变量名:必须为为合法标识符 3.变量作用域(同名问题)/TestScoping.java 4.初始化变量,运算符,1、算术运算符 +,-,*,/,%(x%y,x除以y的余数)+ ,- (+ -的前后缀问题)-用程序测试 class Test public static void main(String args) int i=0; System.out.println(i);System.out.println(i+);Sys
15、tem.out.println(+i);System.out.println(i); ,其它运算符,关系运算符,=,=,=,!= 结果为 true 和 false逻辑运算符&, |, ! , ,&, |,Exercise,Given: 1. public class Test 2. public static void main(String args) 3. System.out.println(63); 4. 5. What is the output?,分支语句,1if,else 2、if ,else if ,else 3switch switch(整型表达式byte,short,int
16、,char) case 值1: 语句1;break;case 值2: 语句2;break;default: 语句n;break; (表达式不能为long型),Exercise,public class IfElse public static void main(String args)if(odd(5)System.out.println(“odd“);elseSystem.out.println(“Even“); public static int odd(int x)return x%2; What is the result? A. The output is odd; B. The
17、output is even; C.An error on line 3 causes compilation to fail D.An error on line 8 causes compilation to fail,class TestSwitch void method(int x) switch(x) case 1: System.out.println(“1“);case 2: System.out.println(“2“); break;default:System.out.println(“default“); public static void main(String a
18、rgs)int x=9;/int x=1;TestSwitch t=new TestSwitch();t.method(x); /Exercise:报数游戏,Exercise,You have the following code. Which numbers will cause “Test2“ to be printed? switch(x) case 1: System.out.println(“Test1“); case 2: case 3: System.out.println(“Test2“); break; System.out.println(“Test3“); ,A. 0 B
19、. 1 C. 2 D. 3 E. 4,循环语句,1.for(初值;条件;条件改变)/可以没有 循环体; 2.while(条件)循环体; 3.do循环体;while(条件);,流控制,1.break ; for(int i=0;i1) break; System.out.println(i+“:“+j);,流控制,2.continue; 继续循环 public class TestConpublic static void main(String arg)int num=10,11,24,-12,5,-6,14,-45,78,100,36,-6;for(int i=0;i=0)continue;
20、System.out.println(“the number is “+numi); ,流控制,3、带标号的break语句L: for(int i=0;i1) break L;System.out.println(i+“:“+j);,第四章 数组,一.声明数组数组是类型相同的变量的集合,每个变量称为该数组的元素变量,简称数组元素。 Point p; char c;,c=new char5;(字符数组, 5个字符型数据),二、创建数组,注意:对于类类型,每个元素并没有指向一个具体的Point对象,还必须分别创建:,三、初始化数组,当创建一个数组时,不论在哪里创建,每个元素都已自动初始化. 希望手
21、工初始化时:int a=1,2,3,4,5;String s=“abc“,“def“;=String s=new String(“abc“),new String(“def“);,四、多维数组,数组的数组,即数组的元素又为一个数组。声明: int a; inta;int a;,Exercise,Given: byte array1,array2; byte array3; byte array4; if each array has been initialized, which statement will cause a compiler error? A. array2 = array1
22、 B. array2=array3 C. array2=array4 D. both A and B E. both A and C F. both B and C,五.数组大小的改变及复制,数组拷贝方法:,int a=1,2,3;int b=4,5,6,7,8,9;System.arraycopy(a,0,b,0,a.length);b=1,2,3,7,8,9; 注:length属性与String中length()方法的区别,第五章 面向对象的程序设计,一、面向对象程序设计过程,23,49,面向对象基本概念,对象 抽象 类 实例化 封装 关系,50,Think,请你设计一款赛车游戏。,51,
23、需求分析用一句话描述,52,用例描述,描述情况: 必须有赛车,赛车有不同品牌,不同外观 有赛道,赛道有直线赛道,曲线赛道,环状赛道等,53,如果用面向过程的方式,该怎样设计呢?,54,面向对象,自顶向下的分析和设计,我们需要哪些对象?,55,详细设计,56,面向对象语言的特点,封装 继承 多态,57,类的定义,权限 修饰 class 类名 extends 父类名 implements 接口列表 类体; 权限: public 公有类 缺省 同包类 修饰: abstract抽象类,只能被继承 final:终极类,不能被继承,27,58,对象定义,A a = new A();,a,数据成员 成员方法
24、,堆,59,类的组成,类由数据成员和方法成员组成,29,60,1、数据成员,权限 修饰 类型 变量名 =初值; 修饰:1)static 有类变量 (类名或对象名点取)无实例变量 (对象名点取)2)final 用于修饰常量 static final int N=5; /int型常量5 如果有N+出现,会有编译错误,因为常量不能被改变.,30,61,Example,public class Circle int x; public int x()return x; public void setX(int newX)x=newX; public static void main(String ar
25、gs) Circle myCircle=new Circle();Circle yourCircle=new Circle();myCircle.setX(23);yourCircle.x=10;System.out.println(“myCircle.x=“+myCircle.x();System.out.println(“yourCircle.x=“+yourCircle.x(); ,62,2、方法成员,权限 修饰 返回值类型 方法名 (形参列表) 方法体; ,32,63,方法重载与构造方法,1、方法重载 特点:1)在同一个类中2)方法名相同3)参数的个数或类型或顺序不同注意:只有返回值类
26、型不同,不叫方法重载,编译时会报错。,34,64,Example,class A int max(int a,int b)return ab?a:b;double max(double a,double b) return ab?a:b;String max(String a,String b) return a.length()b.length()?a:b);public static void main(String s)A a = new A();a.max(5,6);a.max(4.5,6.7);a.max(“abc“, “def“); ,65,构造方法:,1)方法名类名 2)一般选择
27、public访问权限 3)不能有任何修饰,无返回值类型public class Thingprivate int x;public Thing() x=5; 4)构造方法可以重载,不可继承例如:class Aint i,j; public A() i=0; j=0; pulbic A(String i,String j) i=“a“; j=“b“; pulbic A(int k) i=k; j=k; ,66,构造方法相关几个问题:,构造函数对数据完成两个功能-分配空间并初始化 创建对象时必须调用构造方法 没有构造方法时,系统提供缺省的无参构造方法 自定义构造方法后,缺省的构造方法立即失效,37
28、,67,九、import和package语句,import 包.子包.类; 或import 包.子包.*;告诉编译器从何处找到所需的类package语句在文件中第一句,且只有一句.若不写,表示在默认包里.,38,68,什么是包,从逻辑上讲,是一组相关类的集合 从物理上讲,同包即同目录(同文件系统的目录理) 1.package语句import语句注:顺序 2.设置使用一个包中的类时,必须指明包含这个类的包,所以正确设置环境变量classpath,解释器才能找到指定的类.set classpath=c:mypackage;.;c:jdk1.4lib.jar 3.使用import abc.def.A
29、; 或 abc.def.A a=new abc.def.A(); 4.JDK包的结构:lang,io,awt-event,sql,net,applet,util,22,69,第六章 类设计,一.继承(inheritance) 1.A is a B(B has a A)继承机制:在面向对象编程里,可以根据已定义的类(父类)定义一个类,也叫子类。通过extends关键字实现。它不仅具有父类的成员(属性和方法),也增加了自己的一些新的属性和方法或扩展了父类的方法,见书6-35雇员与经理的关系,这种关系也叫“is a“关系:class A extends BA(子类)is a B(父类),继承的特性,
30、单一继承:只允许继承一个类,使得代码更可靠,多个类易出现混淆的问题,如同名方法构造函数:不是成员,不能被继承,但构造子类对象时,父类构造函数被调用(初始化共同的属性)继承的特性:子类可以使用父类成员(注意权限),子类可以扩展父类成员.,定义:子类可以修改从父类继承的的方法要求:1.方法声明形式一致(名字,返回类型,参数列表)2.方法权限不允许缩小3.覆盖的方法不允许抛出比父类方法更多的异常,二、方法覆盖(override),覆盖:public class Employeeprotected String name;protected double salary;protected Date b
31、irthDate;public String getDetail()return “Name:“+name+“n“+“salary:“+salary;public class Manager extends Employeeprotected String department;public String getDetail( )return “Name“+name+“/n“+“salary:“+salary+“n“+“Manager of“+department;,class B public void f()System.out.println(“B“);class A extends B
32、 public void f(int i) System.out.println(“A“);,问题(覆盖还是重载),方法重载 (Overloading Methods),特点:1) 在同一个类中; 2) 方法名相同;3) 参数的个数或类型不同。 注意:只有返回值类型不同,不叫方法重载,编译出错。,作用: 1).点取父类中被子类隐藏了的数据成员2).点取已经覆盖了的方法3).作为方法名表示父类构造方法,称为显式调用父类构造方法注:在创建子类对象时,缺省沿继承链调用所有父类无参的构造方法,也可以用super关键字来显示调用直接父类的构造方法,三.super 关键字,class Test int j
33、=5;public Test(int i)j=i;public void methodA()System.out.println(“Test!“); class TestSuper extends Test static int j=6;public TestSuper()super(999);public void methodA()System.out.println(super.j);public void methodB()super.methodA();public static void main(String args) TestSuper ts=new TestSuper();
34、ts.methodA();ts.methodB(); ,多态性机制 具有不同的形态的能力,虽然一个对象仅有一个形态,但引用变量可以引用不同形态的对象(见书6-13页)父类引用指向子类对象多态参数:父类引用作方法参数可以指向子类的对象(6-21),四.多态性(Polymorphism),父类引用指向子类对象 注:1)引用可以点取父类中的成员(编译时指向父类成员,但运行时动态绑定到子类中的成员)2)不可以点取子类扩充的成员 例: class B public void f()System.out.println(“B“); class A extends B public void f()Syst
35、em.out.println(“A“);public void g() public class bothusepublic void dothing( )B b=new A( ); /父类b.f();/“A“b.g();/error ,“异类集合“程序: class A class B extends A class C extends A class D extends A class E public static void main(String args) A a=new A4; a0=new A();a1=new B();a2=new C(); a3=new D(); for (i
36、nt i=0;ia.length;i+ ) if ( aiinstanceof B) System.out.println(“B“); else if ( aiinstanceof C) System.out.println(“C“); else if ( aiinstanceof D)System.out.println(“D“);else if ( aiinstanceof A) System.out.println(“A“); ,能重载,不能继承 子类自动调用父类构建器class B int i; public B(int i) class A extends B public stat
37、ic void main(String args) B b1=new B(); B b2=new B(5); A a1=new A();A a2=new A(5); ,五.构建器的相关问题,六.继承中权限,七.this关键字,1)点取成员2)区分同名变量 3)调用类的另一个构造方法来初始化对象.,例: class Dotprivate int x,y,z;public Dot (int x,int y,int z)this.x=x;this.y=y;this.z=z; ,class TestThis static int i=77;public TestThis()this(88);publi
38、c TestThis(int i)this.i=i;public static void main(String args) TestThis tt=new TestThis();System.out.println(i); ,八Object类,1.equals方法和= equals用来比较两个对象是否相同,先比较类型,再比较对象内容 =比较地址,类型,内容(可比较引用类型和基本类型) 若: String s1=“abc“String s2=“abc“s1=s2; true,hashCode方法,为方便管理对象,内存中任何一个对象会有一个独立不重复的“ID“,该“ID“号为整型数值 如果俩个对
39、象equals方法返回为true,则这两个对象的hashCode值必须相等 如果两个对象equals方法返回为false,它们的hashCode值可以相等,但这会影响存储效率 对象的hashCode值在程序一次执行的过程中保持一致即可,87,2.toString()方法,把一个对象转换成字符串 可覆盖这个方法提供一些对象信息 Wrapper类的静态方法toString( )(覆盖了Object的方法)可把基本数据类型转换成字符串 编译器自动引用该方法Date now=new Date( ); System.out.println(now);/(now.toString( ),Exercise,
40、Given: class AbstractItfloat getFloat(); public class AbstractTest extends AbstractItprivate float f1 = 1.0f; private float getFloat()retrun f1; What is the result? A. Compilation is successful B. An error on line 6 causes a runtime failure C. An error at line 6 causes compilation to fail D. An erro
41、r at line 2 causes compilation to fail,Exercise,Which statement declares a variable a which is suitable for referring to an array of 50 string objects? A. char a; B. String a; C. String a; D. Object a50; E. String a50; F. Object a;,2,第七章 高级类特性,一、修饰符( static、final、abstract) 1、staticA、类变量注:static只能修饰成
42、员,不能修饰方法变量. /TestCount.java,3,修饰符-static,B、 类方法 -可用类名点取 1)非static方法中可以使用static成员 2)static方法中不能直接使用非静态成员, 编译时ERROR,因为非静态成员与实例相关,使用非静态成员通过对象点取间接使用3)static方法中不能用this,super(this与实例相关,而static 与类相关),4,Example,public class Test int x;public static void main(String args) x = 9; ,5,修饰符-static,C.static块 和数据成员
43、是并列的位置,用于类初始化 类装入时执行一次(不同的静态块按在类中的顺序执行) 不能在方法里 class TestStatic static System.out.println(“TestStatic!“);public static void main(String args) System.out.println(“Hello World!“); ,Exercise,作为参考,看一下实例初始化块: (实例初始化块在构造函数之前被处理 ) class TestStaticBlockstatic System.out.println(“静态块“);System.out.println(“实例
44、初始化块“);TestStatic()System.out.println(“构造函数“); public static void main(String arg) TestStatic t=new TestStatic(); ,7,Example,class StaticInitDemo static int i = 5;static System.out.println(“Static code i= “+ i+ ); public class Test public static void main(String args) System.out.println(“Main code:
45、i=“+ StaticInitDemo.i);,8,2.final 终极类: 不能继承(如String类.Math类) 终极方法: 不能覆盖 常量: 可用于局部变量,方法参数,成员变量。3.abstract 抽象类: 只能被继承,不能创建对象。 抽象方法:没有实现方法体,修饰符,Exercise,在下面的代码中编译时最先发生错误的行是哪个行? abstract class Base class Sub extends Base 1.class Example 2. void test() 3. Base b = new Base(); 4. Base a = new Sub(); 5. Sub
46、 c = new Sub(); 6. 7.,10,1、语法 interface 接口名 extends 接口列表接口体; 声明时:public或default 接口间继承 :可以有多个父接口 “is a“关系 类实现接口:一个类可实现多个接口,接口,11,Attention,在接口中,所有方法都是抽象的,没有一个有程序体 接口只可以定义static final成员变量 接口体:常量值: int N=5;= public static final int N=5;方法: void f(); = public abstract void f(); 由类实现的接口出现在类声明的末尾以逗号分隔的列表中
47、 public class MyApplet extends Applet implements Runnable, MouseListener,Example,下面程序是否正确? interface Example int j=7; void methodA(); class Test implements Examplevoid methodA();public static void main(String args)System.out.println(j+); ,13,定义不相关类的共同行为,而不需考虑这些类之间的层次关系 可以指明多个类需要实现的方法 通过一个接口列表实现多重继承,由于接口中的方法无方法体,代码更安全 ,多重继承的伪装. 类的公共接口:用户代码和实现接口的类之间的协议 特殊的抽象类,它内部所有的方法都是抽象方法,