1、电子商务解决方案设计- 31 -资料内容仅供参考,如有不当或者侵权,请联系本人改正或者删除。电子商务解决方案设计教案实验一: java基础(一)一、 java入门 Java SE: java standard edition Java ME: java micro edition Java EE: java enterprise editionJava 是由sun公司推出( 但 被oracle公司收购, 收购价格: 74亿美元) 从j2se、 j2me、 j2ee的演变, 从jdk5.0开始称为se、 me、 ee。1、 jdk的下载与安装Jdk:java development kit (
2、java 开发包) Jre:java runtime environment(java执行环境)Jdk包含了jre。下载过程见课堂演示。安装完成后运行: java version如能显示版本信息, 即表明java安装成功。Jdk1.4 jdk1.5(5.0) jdk1.6(6.0)设置环境变量: classpath path JAVA_HOME2、 第一个java程序编写程序时能够是记事本、 ultraedit(高级文本编辑工具)、 IDE( integrated development environment) 。例1-1: Test类public class Test public sta
3、tic vod main(String args) System.out.println(”hello world!”);3、 java程序的编译与执行Java程序的执行过程分为两步: ( 1) 编译: javac 文件名.java( 2) 执行: java 文件名( 这是一个后缀为class的字节码文件) 注意: 修改过的原文件, 要重新执行上述的( 1) ( 2) 步骤。JVM(java virtual machine java虚拟机)来执行字节码文件。二、 原生数据类型1、 Java中的数据类型: 1) 原生数据类型 ( Primitive Data Type) 2) 引用类型( 对象类
4、型) ( Reference Type) 2. 变量与常量: 所谓常量, 就是值不会变化的量; 所谓变量, 就是值能够变化的量。3. 变量定义与赋值: ( 1) 变量类型 变量名; 变量名 = 变量值; int a; a = 2; ( 2) 变量类型 变量名 = 变量值; int a = 1; = 表示赋值, 将等号右边的值赋给了左边的变量。 4、 变量名命名规则: 在Java中, 变量名以下划线、 字母、 $符号开头, 而且后跟下划线、 字母、 $符号以及数字。总之, Java中的变量名不能以数字开头。5、 注释: 注释是给人看的, 不是给计算机看的。Java中共有3种类型的注释: 1) 单
5、行注释: 以/开头, /后面的所有内容均被当作注释处理。 2) 多行注释: 以/*开头, 以*/结束, 中间的所有内容均被当作注释处理。关于多行注释, 需要注意的是, 多行注释不能嵌套。 3) 另一种多行注释。用于产生Java Doc帮助文档。暂且不介绍。/* 注释内容*/6、 Java中的原生数据类型共有8种: 1) 整型: 使用int表示。( 32位) 2) 字节型: 使用byte表示。( 表示-128127之间的256个整数) 。 3) 短整型: 使用short表示。( 16位) 4) 长整型: 使用long表示。( 64位) 5) 单精度浮点型: 使用float表示。所谓浮点型, 指的
6、就是小数, 也叫做实数, 比如1.2。 6) 双精度浮点型: 使用double表示。双精度浮点型表示的数据范围要比单精度浮点型大。 7) 字符型: 使用char表示( char是character的缩写) 。所谓字符, 就是单个的字符表示, 比如字母a, 或者中文张, 外面用单引号包围上。比如char a = B; char b = 张; 8) 布尔类型, 使用boolean表示。布尔类型只有两种可能值, 分别是true与false。7、 变量使用过程中应注意的问题: 1) Java中的所有浮点类型默认情况下都是double。不能将double类型的值赋给float类型的变量, 即便该doub
7、le类型的值处于float类型的范围内也是不能够的。总之, 能否成功赋值取决于等号右边的值类型与等号左边的变量类型是否一致。 2) 如何将double类型的值赋给float类型的变量? 答案就是(1)强制类型转换, 将double类型的值强制转换为float类型。(2)使用java语言的支持。 强制转换的语法: 类型 变量名 = ( 类型) 变量值; 3) 变量在使用前必须要赋值; 变量必须要声明其类型方可使用; 变量在使用前必须要定义, 而且只能定义一次。 4) 如下代码无法经过编译: int a = 1; short b = a; a是int类型, b是short类型, int类型表示的数
8、据范围要比short类型大, 不能将表示范围大的值赋给表示范围小的变量。 5) 如下代码能够经过编译: short a = 1; int b = a; a是short类型, b是int类型, int类型表示的数据范围要比short类型大, 能够将表示范围小的值赋给表示范围大的变量。 总结: 能够将表示范围小的值赋给表示范围大的变量; 但不能直接将表示范围大的值赋给表示范围小的变量, 只能经过强制类型转换实现。 上述内容验证见实例: test、 variable1、 variable2三、 运算符1、 算术运算符: 1) 当有若干个变量参与运算时, 结果类型取决于这些变量中表示范围最大的那个变量
9、类型。比如, 参与运算的变量中, 有整型int, 有双精度浮点型double, 有短整型short, 那么最后的结果类型就是double。 2) int a = 1; int b = 2; double c = (double)a / b; 上面的代码中, a与b都是整型, 可是经过(double)a这种转换将a转换为一个匿名的变量, 该变量的类型是double, 可是要注意: a本身依旧是int类型, 而不是double类型, 这样, (double)a / b就是double类型除以int类型, 结果自然是double类型。 3) 取模运算符: 使用%表示。 int a = 5; int
10、b = 3; int c = a % b; 上面代码的运行结果是2, 因为5除以3结果是1余2。 取模的规律: 取模的结果符号永远与被除数的符号相同 int a = 5; int b = -3; int c = a % b; 被除数是5, 那么取模的结果是2 int a = -5; int b = 3; int c = a % b; 被除数是-5, 那么取模的结果是-2。上述内容验证见实例: variable32、 关系运算符: 关系运算符: 大于( ) 、 小于( =) 、 小于等于( =) , 关系运算的结果是个boolean值。 见实例: OperatorTest3、 逻辑运算符: 重点
11、讲解两个, 逻辑运算符本身也返回一个boolean值。 1) 逻辑与: 使用&表示, 逻辑与是个双目运算符( 即有两个操作数的运算符) , 只有当两个操作数都为真的时候, 结果才为真; 其余情况结果均为假。逻辑与表示的而且的意思。 2) 逻辑或: 使用|表示, 逻辑或也是个双目运算符, 只有当两个操作数都为假的时候, 结果才为假; 其余情况结果均为真。逻辑或表示或者的意思。 见实例: LogicTest4、 关于变量的自增与自减运算。 1) 关于int b = a+, 作用是将a的值先赋给b, 然后再让a自增1。 2) 关于int b = +a, 作用是将a的值先自增1, 然后将自增后的结果赋
12、给b。 见实例: Variable45、 条件运算符( 三元表示式) , 其形式为: type d = a ? b : c; 具体化形式为: int d = 2 1 ? 3 : 4; 注意: 轻量级的文本编辑器: UltraEdit、 Editplus、 vi、 vim、 gvim 见实例: Test2四、 流程控制语句1、 if 语句 第一种形式: if(布尔表示式) /待执行的代码 第二种形式: if(布尔表示式) /待执行的代码 else /待执行的代码 第三种形式: if(布尔表示式) /待执行的代码 else if(布尔表示式) /待执行的代码 else if(布尔表示式) /待执行
13、的代码 else /待执行的代码 见实例: IfTest2、 switch语句: switch(变量) /此处的变量类型就当前所学内容来看, 只能为4种类型: byte, short, int, char。 case 常量1: /待执行的代码 break; case 常量2: /待执行的代码 break; case 常量3: /待执行的代码 break; default: /待执行的代码 虽然case语句中的break是可选的, 但在绝大多数情况下, 如果没有break, 程序的逻辑就会发生错误, 因此, 一般情况下都需要加上break。见实例: SwitchTest3、 循环控制语句Java
14、中的循环控制语句一共有3种, 分别是while, do while以及for循环。 1) while循环, 形式为: while(布尔表示式) /待执行的代码 2) dowhile循环, 新式为: do /待执行的代码 while(布尔表示式); while与dowhile之间的区别: 如果布尔表示式的第一次判断就为false, 那么while循环一次也不执行; dowhile循环则会执行一次。如果布尔表示式第一次判断为true, 那么while循环与dowhile循环等价。 3) for循环( 使用最多的一种循环) , 形式为: for(变量初始化; 条件判断; 步进) /待执行的代码 fo
15、r循环的执行过程: a) 执行变量初始化。 b) 执行条件判断。如果条件判断结果为假, 那么退出for循环, 开始执行循环后面的代码; 如果条件判断为真, 执行for循环里面的代码。 c) 执行步进。 d) 重复步骤b。 上述内容见实例: WhileTest、 DoWhileTest、 ForTestbreak语句: 经常见在循环语句中, 用于跳出整个循环, 执行循环后面的代码。 2. continue语句: 经常见在循环语句中, 用于跳出当前的这个循环( 或者是跳出本次循环) , 开始下一次循环的执行。 实验二: java基础(二)一、 面向对象程序设计( Object Oriented P
16、rogramming, OOP; Object Oriented Design, OOD) 什么是面向对象? 在面向对象程序设计中有两个重要的概念: 类( class) 与对象( object) 。 1、 类: 类是一种抽象的概念, 类中包含了数据( 一般使用名词来表示) 与对数据的操纵( 一般使用动词来表示) 。比如说人就是一种抽象的概念, 人具有姓名、 年龄、 身高等数据, 还有吃饭、 跑步等操纵数据的动作。 2、 对象: 对象是一种具体的概念, 是类的一种具体表示方式。比如说人是一个类, 而张三、 李四、 王五等具体的人就是对象。 3、 类所包含的内容, 类一共包含两部分内容: a) 数
17、据, 数据在类中称作属性( Property或者Attribute) 或者叫成员变量( Member variable) 。 b) 对数据的操纵, 这种操纵在类中称作方法( method) 。 二、 类及方法的定义面向对象程序设计的三大基本特征: 继承、 封装、 多态 封装: 类包含了数据与方法, 将数据与方法放在一个类中就构成了封装。 1、 类的定义: 修饰符 class 类的名字 /类的内容( 包含了属性与方法) 2、 方法的定义: 修饰符 返回类型 方法名称( 参数1, 参数2, 参数3) /方法体 注意: 1) main方法是整个Java程序的入口点, 如果类的定义中没有main方法,
18、 则程序无法执行。 2) 方法定义不能嵌套, 也就说不能在一个方法中定义另外一个方法。方法只能定义在类中。 3) 关于方法的执行: 首先需要定义方法, 接下来就能够使用方法( 调用方法) , 当方法调用完毕后, 方法能够返回值。方法到底是否返回值是由方法的定义决定的。 4)如果一个java源文件中定义了多个类, 那么这些类中最多只能有一个类是public的, 换句话说, 定义的多个类能够都不是public的。 Main方法要放在public类中, 如果没有public类, 那Main方法放在哪个类中都能够。3、 生成对象: 经过类来生成对象( 一般使用new关键字来生成对象) 。 public
19、 class Person 类名 变量名 = new 类名(); Person person = new Person(); Person person2 = new Person(); Person person3 = new Person();4、 方法的调用: 方法调用需要经过对象来完成, 方法调用的形式是: 对象变量.方法名(参数值1, 参数值2, 参数值3.); 关于方法的注意事项: 1) 在方法定义中, 方法的返回类型与return后面的变量或常量类型保持一致。 2) 在方法调用时, 给方法传递的参数需要与方法定义时的参数保持一致( 参数个数一致, 参数类型一致) 。 3) 方法定
20、义时的返回类型与接收方法返回值的变量类型保持一致。 public int add(int a, int b) return a + b; 方法定义时的参数叫做形式参数。 int a = test.add(8, 3); 方法调用时所赋予的具体值叫做实际参数。 4) 关键字void表示方法不返回值。 如果方法不返回值, 那么声明方法的时候使用void关键字, 在方法定义中能够有两种情况实现不返回值: a) 不使用return语句。 b) 使用return, 但return后面没有任何值或者变量, return后面只有一个分号, 表示退出方法, 返回到方法的调用端。 使用方式: return;上述内
21、容见实例: Test5、 属性的定义和使用: 类中的属性又叫做成员变量( member variable) , 属性用英文表示为property或者attribute。 对象( Object) 又叫做实例( Instance) 。生成一个对象的过程又叫做实例化。 1)命名约定 a) 类: 首字母大写, 如果一个类名由多个单词构成, 那么每个单词的首字母都大写, 中间不使用任何的连接符。比如Person类, MemberTest类。 b) 方法: 首字母小写。如果一个方法由多个单词构成, 那么第一个单词的所有字母全都小写, 从第二个单词开始, 每个单词的首字母大写。比如add, addThree
22、Int。 c) 属性: 命名约定与方法相同。比如age, ageOfPerson。 2)属性需要定义在类中, 又叫做成员变量; 而定义在方法中的变量叫做局部变量。 3)定义属性 public class Person 修饰符 类型 属性名称; 4)使用属性与方法一样, 使用.运算符。首先需要生成类的实例, 然后使用实例+”.”的方式来使用属性。 比如: Person person = new Person(); person.age 局部变量使用前必须要声明并赋初值; 成员变量使用前必须要声明, 但能够不赋初值。 5)成员变量与局部变量的联系与区别: a) 无论是成员变量还是局部变量, 使用前
23、都需要声明( 定义) 。 b) 对于局部变量来说, 使用前必须要初始化; 对于成员变量来说, 使用前能够不初始化。如果没有初始化成员变量就开始使用, 那么每个类型的成员变量都有一个默认的初始值 i. byte、 short、 int、 long类型的初始值为0 ii. float、 double类型的初始值为0.0 iii. char类型的初始值u0000 iv. boolean类型的初始值为false 上述内容见实例: Person6、 引用类型( reference type) : 引用类型是用在对象上的。一个对象能够被多个引用所指向, 但同一时刻, 每个引用只能指向唯一的一个对象。如果一
24、个对象被多个引用所指向, 那么无论哪个引用对对象的属性进行了修改, 都会反映到其它的引用当中。 上述内容见实例: People在该实例中用画图表示。注意: 1) 如果一个类包含了属性与方法, 那么该类的每一个对象都具有自己的属性, 但无论一个类有多少个对象, 这些对象共享同一个方法。 2) 关于方法参数传递的总结: 对于Java中的方法参数传递, 无论传递的是原生数据类型还是引用类型, 统一是传值( pass by value) 。 3) 什么类型的引用就能指向什么类型的对象, 比如People类型的引用就能指向People类型的对象, 但不能指向Student类型的对象。比如: People
25、 people = new People(); / 正确 People people = new Student(); /错误上述内容见实例: ParamTest三、 构造方法: 构造方法( Constructor) : 构造方法用于完成对象属性的初始化工作。1、 构造方法的特点: a) 构造方法的名字必须与类名完全一致( 包含大小写) b) 构造方法没有返回值, 连void也不能出现。 c) 如果在定义一个类的时候, 没有为类声明构造方法, 那么Java编译器会自动为类添加一个没有参数且方法体为空的构造方法( 默认的构造方法) d) 如果在定义一个类的时候, 为类声明了构造方法, 那么Jav
26、a编译器就不会再为类添加构造方法了。 e) 不能显式调用类的构造方法, 构造方法一般是经过new关键字隐式调用。 2、 new关键字在生成对象时完成了三件事情: a) 为对象开辟内存空间。 b) 调用类的构造方法。 c) 将生成的对象的地址返回。 3、 默认的构造方法: 构造方法没有参数且方法体为空。 使用new来生成对象的时候, 后面的小括号()表示构造方法的参数列表, 如果构造方法不接收参数, 那么小括号中的内容为空; 如果构造方法接收参数, 那么小括号中的实际参数就需要与构造方法定义中的形式参数保持一致( 参数数量一致、 参数类型一致、 按照顺序逐一赋值) 。 上述内容见实例: Pers
27、onTest四、 方法的重构和重载( overload) 1、 方法的重构: 如果在子类中定义的方法与其直接超类( 父类) 的某个方法有相同的名称和参数, 则称该子类重构了该超类( 父类) 的该方法。方法重构( Override) : 子类与父类的方法返回类型一样、 方法名称一样, 参数一样, 这样我们说子类与父类的方法构成了重写关系。 2、 方法的重载: 同一个类中, 定义了两个或多个方法名字相同, 但方法参数不同, 这就表明了方法间的重载关系。方法参数不同有两层含义: 1) 参数个数不同。2) 参数类型不同。 注意: 方法的返回值对重载没有任何影响。 上述内容见实例: OverLoadTe
28、st、 OverLoadTest2注意: 方法重构与方法重载之间的关系: 重载发生在同一个类内部的两个或多个方法。重构发生在父类与子类之间。 五、 继承( Inheritence) : 1、 定义及格式: Java是单继承的, 意味着一个类只能从另一个类继承( 被继承的类叫做父类【基类, base class】, 继承的类叫做子类) , Java中的继承使用extends关键字。 格式: class 类名 extends 类名2、 注意: 1) 父类有的, 子类也有 2) 父类没有的, 子类能够增加 3) 父类有的, 子类能够改变 4) 构造方法不能被继承 5) 方法和属性能够被继承 6) 在
29、定义一个类的时候, 如果没有显式指定该类的父类, 那么该类就会继承于java.lang.Object类( JDK提供的一个类, Object类是Java中所有类的直接或间接父类) 。 上述内容见实例: Child、 InheritenceTest六、 多态: 多态( Polymorphism) : 我们说子类就是父类( 玫瑰是花, 男人是人) , 因此多态的意思就是: 父类型的引用能够指向子类的对象。 但要注意的是: 这个父类型的引用在执行所指向子类的方法时, 该方法一定是父类中存在的方法。上述内容见实例: PolyTest七、 接口( interface) : 1、 接口的地位等同于clas
30、s, 接口中的所有方法都是抽象方法。在声明接口中的方法时, 能够使用abstract关键字, 也能够不使用。一般情况下, 都会省略掉abstract关键字。2、 类能够实现接口。实现使用关键字implements表示, 代表了某个类实现了某个接口。一个类实现了某个接口, 那么该类必须要实现接口中声明的所有方法。 Java是单继承的, 也就是说某个类只能有唯一一个父类; 一个类能够实现多个接口, 多个接口之间使用逗号分隔。上述内容见实例: Test3八、 一些关键字: 1、 static关键字: 能够用于修饰属性, 也能够用于修饰方法, 还能够用于修饰类( 后面的课程讲) 1) static修饰
31、属性: 无论一个类生成了多少个对象, 所有这些对象共同使用唯一一份静态的成员变量; 一个对象对该静态成员变量进行了修改, 其它对象的该静态成员变量的值也会随之发生变化。如果一个成员变量是static的, 那么我们能够经过 类名.成员变量名 的方式来使用它( 推荐使用这种方式) 。上述内容见实例: StaticTest2) static修饰方法: static修饰的方法叫做静态方法。对于静态方法来说, 能够使用类名.方法名的方式来访问。注意: 不能在静态方法中访问非静态成员变量; 能够在静态方法中访问静态的成员变量。能够在非静态方法中访问静态的成员变量。总结: 静态的只能访问静态的; 非静态的能
32、够访问一切。见实例: StaticTest52、 final关键字: final能够修饰属性、 方法、 类。1) final修饰类: 当一个类被final所修饰时, 表示该类是一个终态类, 即不能被继承。2)final修饰方法: 当一个方法被final所修饰时, 表示该方法是一个终态方法, 即不能被重写( Override) 。3)final修饰属性: 当一个属性被final所修饰时, 表示该属性不能被改写。上述内容见实例: FinalTest、 FinalTest2、 FinalTest3 3、 包( package) 。用于将完成不同功能的类分门别类, 放在不同的目录( 包) 下。包的命名
33、规则: 将公司域名反转作为包名。.com, com.myjjx( 包名) , 对于包名: 每个字母都需要小写。如果定义类的时候没有使用package, 那么Java就认为我们所定义的类位于默认包里面( default package) 。1)编译带有package声明的Java源文件有两种方式: a) 直接编译, 然后根据类中所定义的包名, 逐一手工建立目录结构, 最后将生成的class文件放到该目录结构中( 很少使用, 比较麻烦) 。b) 使用编译参数d, 方式为javac d . 源文件.java, 这样在编译后, 编译器会自动帮助我们建立好包所对应的目录结构。2)有两个包名, 分别是aa
34、.bb.cc与aa.bb.cc.dd, 那么我们称后者为前者的子包。见实例: PackageTest4、 导入( import) , 将使用package分离的各个类导入回来, 让编译器能够找到所需要的类。1)import的语法: import com.myjjx.PackageTest1;2)import com.myjjx.*, 表示导入com.myjjx包下面的所有类。3)import aa.bb.*并不会导入aa.bb.cc包下面的类。这时需要这样写: import aa.bb.*;import aa.bb.cc.*;4) 关于package、 import、 class的顺序问题:
35、a) 首先需要定义包( package) , 可选b) 接下来使用import进行导入, 可选c) 然后才是class或interface的定义。5) 如果两个类在同一个包下面, 那么则不需要导入, 直接使用即可。见实例: PackageTest1、 ImprotTest5、 instanceof: 判断某个对象是否是某个类的实例。语法形式: 引用名instanceof 类名( 接口名) , 返回一个boolean值。见实例: InstanceofTest九、 访问修饰符( access modifier) 。1、 public( 公共的) : 被public所修饰的属性和方法能够被所有类访问
36、。2、 protected( 受保护的) : 被protected所修饰的属性和方法能够在类内部、 相同包以及该类的子类所访问。3、 private( 私有的) : 被private所修饰的属性和方法只能在该类内部使用4、 默认的( 不加任何访问修饰符) : 在类内部以及相同包下面的类所使用。见实例: A、 B、 C、 D十、 java.lang.Object类。java.lang包在使用的时候无需显式导入, 编译时由编译器自动帮助我们导入。API ( Application Programming Interface) , 应用编程接口。十一、 String类1、 对于String对象的相等
37、性判断来说, 请使用equals()方法, 而不要使用=。2、 当使用+拼接字符串时, 会生成新的String对象, 而不是向原有的String对象追加内容。3、 String I = new String(”aaa”);和 String I = ”aaa”返回的地址不同, 因为它们存储在不同的空间。见实例: StringTest、 StringTest2十二、 数组: ( Array) : 相同类型数据的集合就叫做数组。1、 如何定义一维数组。type 变量名= new type数组中元素的个数;能够按照下列方式定义长度为10的数组: int a = new int10;或者int a =
38、new int10;2、 数组中的元素索引是从0开始的。对于数组来说, 最大的索引=数组的长度1。见实例: ArrayTest3、 定义数组的第3种方式: type 变量名= new type逗号分隔的初始化值列表;4、 Java中的每个数组都有一个名为length的属性, 表示数组的长度。length属性是public, final, int的。数组长度一旦确定, 就不能改变大小。见实例: ArrayTest5、 int a = new int10, 其中a是一个引用, 它指向了生成的数组对象的首地址, 数组中每个元素都是int类型, 其中仅存放数据值本身。用画图表示! 见实例: Array
39、Test2注意: 一维数组中存放原生数据类型和引用类型时的不同。练习: 1、 ArrayTest36、 二维数组。二维数组是一种平面的二维结构, 本质上是数组的数组。1)二维数组的定义方式: type a = new type23;2) 二维数组的初始化: 逗号分隔的初始化值列表, 逗号分隔的初始化值列表;见实例: ArrayTest4、 ArrayTest5练习: ArrayTest5、 BubbleSortTest附: 一、 包装类( Wrapper Class) 。针对于原生数据类型的包装。所有的包装类( 8个) 都位于java.lang包下。Java中的8个包装类分别是: Byte,
40、Short, Integer, Long, Float, Double, Character, Boolean。她们的使用方式都是一样的, 能够实现原生数据类型与包装类型的双向转换。见实例: IntegerTest实验三: 一、 IDE( Integrated Development Environment) , 集成开发环境。 1、 NetBeans。2、 JBuilder。 3、 MyEclipse( 日蚀、 月蚀) 1) 例: 在myeclipse中编写一个能打印”hello world”字符串的程序, 大家注意和以前文本编辑器的比较。2)保存即编译、 错误提示、 运行、 显示行号、 基
41、本属性修改、 class文件的存放路径( 不再关心) 、 compiler编译器的修改。二、 集合框架: 1、 存储数据对象的集合。集合中存放的依然是对象的引用而不是对象本身。 图: 集合的接口2、 集合的实现类: ArrayList1)集合当中只能放置对象的引用, 无法放置原生数据类型, 我们需要使用原生数据类型的包装类才能加入到集合当中。 2)集合当中放置的都是Object类型, 因此取出来的也是Object类型, 那么必须要使用强制类型转换将其转换为真正的类型( 放置进去的类型) 。 实例见: ArrayListTest1、 ArrayListTest2、 ArrayListTest3 ArrayListTest4、 ArrayListTest5