Java语言基础培训材料.ppt

上传人:za****8 文档编号:15800392 上传时间:2020-09-07 格式:PPT 页数:366 大小:2.92MB
返回 下载 相关 举报
Java语言基础培训材料.ppt_第1页
第1页 / 共366页
Java语言基础培训材料.ppt_第2页
第2页 / 共366页
Java语言基础培训材料.ppt_第3页
第3页 / 共366页
点击查看更多>>
资源描述
JAVA,Java 2 Platform, Standard Edition,课程内容,JAVA,JAVA 概述,JAVA的起源,1990 年 Green项目成立 Oak 语言 1995 年JAVA诞生,Java的现状1,(1) J2SE: Java 2 Platform, Standard Edition 标准版J2SE含有基本的Java 2 SDK、工具、运行时系统(Runtime)和API,开发者可以用来编写、部署和运行Java应用程序和Applet. 当前J2SE的最新版本是JDSE1.5 update4,Java的现状2,(2) J2EE :Java 2 Platform, Enterprise Edition 企业版J2EE建立在J2SE的基础之上,他是JSP(Java Server Page),Servlet ,EJB(Enterprise JavaBean), JTS(Java Transaction Service),Java mail以及JMS(Java Message Service)等多项技术混合体,并且还含有兼容性测试套件, 主要用于开发分布式的、服务器端的多层结构的应用系统,例如电子商务网站。,Java的现状3,(3) J2M:Java 2 Platform, Micro Edition 领域应用版J2ME主要用于开发电子产品,例如,移动电话、数字机顶盒、汽车导航系统等。,JAVA术语名词解释,名词解释JVM、JRE,JVM -java virtual machine JVM 虚拟机将 java 字节码程序翻译成机器语言。然后有计算机执行。 JVM 没有其他相关的文件。. JVM 本身不足以支持java application和applet的运行。 JRE - java 运行环境 . JRE 是由JVM 和 java platform 核心类以及相关支撑文件组成。,API,Application programming interface. API 是rules (syntax) :在java技术中如何编程。 API包括数千个类公司预先编好的代码,你可以在编程中充分利用它们的功能。,JDK、J2SDK,JDK java developers kit (java开发工具包) JDK 包含JVM和其他工具,以及所有的API和相关文件。 JDK 是java 技术的旧名(1999/11以前), JDK1.1 是最后版本。 Java 2 Java 2 Platform, J2SDK java技术的新名称 SDK Software Development Kit,JVM,JRE,J2SDK 的关系,JVM plus basic APIs (what you need to distribute to people who will run your Java programs),JVM plus all APIs, compilers ,tools, and documentation (what you need in order to write java technology programs).,Java 开发工具,J2 SDK系列(Sun)命令行方式 SunOne Studio JBuilder (Borland) Visual J+ (Microsoft) Eclipse IDEA WASD JCreator,程序基本结构,由一个或多个“类”组成。 其中必须有一个“类”定义了main() 方法,该方法是自动执行的类方法,是Java应用运行的起始点。而这个类也就称之为“主类”。 HelloApplication.java public class HelloApplication public static void main(String args) System.out.println(Hello, Java world! ); ,编译与执行,编译 javac javac HelloApplication.java 产生HelloApplication.class 文件 解释执行 java java HelloApplication (隐含.class文件) Java程序文件 源文件名要与主类名同名(包括大小写) 一个类产生一个.class文件,编译、运行程序,Application:,D: javac HelloApplication.java D: java HelloApplication Hello, Java World!,程序设计方法学,面向过程的程序设计 面向过程的程序遵循面向过程的问题求解方法 其中心思想是用计算机能够理解的逻辑来描述和表达待解决的问题及其具体的解决过程。 算法+数据结构 数据结构利用计算机的离散逻辑来量化表达需要解决的问题 。 而算法则研究如何快捷、高效地组织解决问题的具体过程。 面向过程面向机器,程序设计方法学,面向对象的程序设计 面向对象问题求解关心的不仅仅是孤立的单个过程,而是孕育所有这些过程的母体系统 它能够用计算机逻辑来模拟、描述系统本身,包括系统的组成,系统的各种可能状态,以及系统中可能产生的各种过程与过程引起的系统状态切换。 面向对象的程序设计是以要解决的问题中所涉及到的各种对象为主要考虑因素。 对象是一种看问题的观点,是对现实世界各种元素的一种抽象。对象既含数据又含功能,因此具有自身处理数据的能力。对象被认为是迄今为止最接近真实事物的数据抽象,现实中的对象,现实世界中对象有两个共同的特点: 一方面,它们都有自己的状态,如一台电视机有自己的摆放位置,有关机和开机状态,此刻正在播放某一频道的电视节目等 另一方面,它们又都有自己的行为或功能,如电视机的开机、关机、调台等,对象的属性与方法,面向对象程序设计中的对象是现实世界对象的模型化,它同样具有状态和行为。 对象的状态用属性来维护, 对象的行为用方法来实现。 因此可以简单地讲,对象是面向对象的程序设计模式,它由描述状态的属性(变量)和用来实现对象行为的方法(代码)组成。 几种叫法 属性 静态属性 域 成员变量 状态 方法 动态属性 成员方法 行为,对象与类,什么是类? 类是描述对象的“基本原型”,它定义一种对象所能拥有的数据和能完成的操作,在面向对象的程序设计中,类是程序的基本单元。,子类,什么是子类? 子类是作为另一个类的扩充或修正所定义的一个类.,bicycle,(super class),Mountain bikes,Racing bikes,Tandem bikes,sub class,属性、方法和消息传递,属性:即指对象的所知道的状态 方法:指对象的功能单元。 什么是消息? 软件对象通过相互间传递消息来相互作用和通信 一个消息由三部分组成: 1. 接受消息的对象 2. 要完成方法的名字 3. 方法需要的参数,建立开发环境 Eclipse,JAVA语言基础,程序结构,java的名字空间和包,作为一种在整个Internet上动态装载模块的语言,Java特别注意避免名字空间的冲突。 全局变量不再是语言的组成部分(没有全局的属性与方法)。 所有的方法和属性都在类中定义,是类的组成部分。 每个类又是包的组成部分。 全限定名 : 包名 . 类名 . 方法名 import 打开一个包后 ,可直接指定该包中的类名。 在本类中,可以直接使用方法名及属性名。,包的概述,一个包是一组相关类的集合。 类库由若干包组成。 java.lang 语言核心类(String Integer Math) java.awt 图形用户界面 java.applet applet小程序 java.io 文件与输入输出 网络编程 java.util 实用程序类(随机数、日期、系统属性) Java API 文档,语句规则,语句种类 说明语句 如属性说明、变量说明等 表达式语句 控制语句 (条件、循环、转移) 异常处理语句 块语句(代码块,一组语句用花括号括起来) 注释 / - 只限于行内 /* - - - */ 一段注释文本 基本语句用分号结束,数据类型,数据,Java程序中所处理的数据是将各种数据类型实例化后的数据。 数据类型实例化的方法:说明语句 实例化数据的两中形式:变量与常量,数据类型与说明语句,基本数据类型说明语句: boolean b = true; short si = 128; int i , j, k = -99; long l = 123456789; char ch = J; char chc = 中 ; float f = 3.1415926f; double d = -1.04E-5; Java几乎是将字符串视为基本数据类型 String s = “你好!”;,Java 标识符: 区分大小写 组成 :字母 数字 _ $ 开头: 字母 _ $,常量,布尔常量 true false 整型常量 一般常量:32bit 长整型常量:64bit (88L) 十进制数:非0开头的正负整数 105,-23 八进制数: 0开头的正负整数 017(15), -023(-19) 十六进制:0 x开头的正负整数 0 x2F(47),-0 xa8(-168) 浮点常量 一般浮点常量(32bit) 3.14F 6.18E3F 双精度浮点数(64bit ) 7.56D 6.02E23 (D可省),数据类型转换,import java.io.*; public class Test public static void main(String args) int i=65; char c=a, cc=王; System.out.println(i); /65 System.out.println(char)i);/A System.out.println(c);/a System.out.println(int)c);/97 System.out.println(cc);/王 System.out.println(int)cc);/29579 System.out.println(char)35328);/言 ,Wrapper类,基本数据类型,Wrapper 类,boolean,Character,char,Boolean,Byte,byte,Short,short,Integer,int,Long,long,Float,float,Double,double,Integer,属性 staticint MAX_VALUE 返回int型数据的最大值 staticint MIN_VALUE 返回int型数据的最小值 构造器 Integer(int value) Integer(String s) 方法 int intValue() double doubleValue() String toString() static String toString(int i) static Int parseInt(String s) static Integer valueOf(String s),类型转换利用类/对象方法,利用类方法(静态方法) static int Integer.parseInt(“23”) static String Integer.toString(23) static double Double.parseDouble(“12.3”) static String Double.toString(12.3) 利用对象方法 Double d ; String s; d=new Double(12.3) ; /构造 s= d.toString(); Double.valueOf(“12.3”).doubleValue() ; /返回,引用类型类,定义类(新的数据类型): class MyDate int day ; int month ; int year ; 基本数据类型直接分配内存空间。 int i, j, k ; 引用类型 ? MyDate d1 ; d1 = new MyDate() ;,引用类型类,MyDate d1 = new MyDate() ;,d1.day = 28 ; d1.month = 12; d1.year = 70 ;,引用类型数组,在Java中,数组是独立的类,有自身的方法,不是变量的集合。 一个数组是数组类的一个对象。 一维数组定义 int IntArray = new int 5 ; 数组类对象引用说明( IntArray) 动态分配空间( new int 5 ) int IntArray (提倡格式) 类型 变量名,引用类型数组,int intArray = 11, 47, 93, 26, 38 分配空间+赋初值 静态初始化必须与数组定义放在一个语句中。 intArray = new int10 ; /原数组丢失。,XXXX,intArray,11,47,93,38,26,数组类,int m1 , m2 ; int a ; m1=5 ; m2=10; a=new intm1m2; for(int i=0 ; i5 ; i+) for(int j=0 ; j10 ; j+) aij = i*j ; for(int i=0 ; ia.length ; i+) for(int j=0 ; jai.length ; j+) System.out.print(aij + “ “); System.out.println(); ,引用类型字符串类,字符串类代表字符串,每一个字符串常量是该类的一个实例。 构造函数 String s = new(); String s = new(“abc”); char data= a, b, c; String s = new String(data); String s = “abc”;自动为该字符串常量创建一个 String类的实例,引用类型字符串类,int x=123; int y=x ; String s1=“abc” ; String s2 = s1 ;,123,123,0 x01234567,null,x y s1 s2,“abc”,s2=“def”,引用类型字符串,String s1 = new String(“abc”) ; String s2 = new String(“abc”) ;,0 x01234567,0 x12345678,s1 s2,“abc”,“abc”,s1 = = s2 false s1.equals(s2) true,引用类型字符串,String s1 = “abc” ; s1=s1 + “def” ;,XXXXX,“abc”,s1,字符串类-String,方法 int length() / 返回字符串长度 例:“Java与面向对象程序设计”.length() 的值为13 char charAt(int index) /返回指定位置的字符 例 Java与面向对象程序设计.charAt(2) int compareTo(String s2) /字符串比较 int compareToIgnoreCase(String s2) boolean equals(Object obj) /判断字符串相等 String toLowerCase() /将字符串转换为小写 String toUpperCase() /将字符串转换为大写 (返回新串,不改变原字符串),字符串类-String,String substring(int beginIndex) /取子串 String substring(int beginIndex, int endIndex) int indexOf(String s) /返回串s在当前串中位置 int indexOf(String s,int fromIndex) boolean startsWith(String prefix)判断该字符串是否以prefix为前缀。 boolean endsWith(String suffix) 判断该字符串是否以suffix为后缀。 char toCharArray() /将字符串转为字符数组,字符串类,Java的字符串连接运算符 + Object 的方法 toString() 实现其他对象向字符串的转换 main方法的参数 class a public static void main(String args) int x = Integer.parseInt(args0); int y = Integer.parseInt(args1); System.out.println(“x+y=“ + (x+y) ); ,字符串类StringBuffer,String类对象是不可变的字符串 StringBuffer类对象是可变的字符串,有改变字符串的若干方法。 构造函数 StringBuffer() StringBuffer(int length) /设置初始容量 StringBuffer(String s) 方法 String toString() void setCharAt(int index , char c) /修改字符,表达式语句,表达式是变量、常量及运算符的组合。 表达式既可单独组成语句,也可出现在条件测试、变量说明、方法调用的参数等场合 在表达式构件中,运算符起到关键作用。 运算符(实现操作)-运算元(操作对象) 二元运算符、一元运算符、三元运算符 表达式的结果是一个右值,即不能出现在赋值运算的左边。结果类型由参与运算的数据类型确定。 赋值是一种运算符,为编程带来灵活性(如对循环变量进行初始化)。,Java运算符,一般运算是把运算对象作为一个整体处理,而位运算是把整型数运算对象拆开,以位(bit)作为运算对象,运算符例移位,移位 带符号右移:左侧空出位全用符号位填充 不带符号右移 :左侧空出位用0填充 2x 2 3000011110011110000000011100000111 -1711101111101111001111101100111011 1281 128 / 21 = 64 2564 256 / 24 = 16 -2564 -256 / 24 = -16 128 1 128 * 21 = 256 16 2 16 * 22 = 64,运算符例,自运算符+ - j+ j- +j -j 运算符的位置决定了自运算的顺序(在表达式运算之前或在表达式运算之后。 a=3 b=5 c=(a+)*b a=4 c=15 a=3 b=5 c=(+a)*b a=4 c=20 三目条件运算符(?:) D=表达式A ?表达式B :表达式C A为真,返回表达式B A为假,返回表达式C 总是返回B,C中的长类型 例:int x=5, y=8; long z=2; long k=x3?y:z; /k=8,条件语句,if ( 条件表达式 ) 语句块; else 语句块;,多重嵌套的if语句 if (条件1) 语句块1; else if (条件2) 语句块2; else if (条件3) else 语句块n;,switch 开关语句,switch(表达式) case 判断值1:语句组1 ; case 判断值2:语句组2 break ; default:语句组n; switch 的常量和表达式可以是整型、字符型及byte型 任何两个case常量不可以有相同的值。 只能对等式进行测试,根据表达式取值的不同转向不同的分支。 每个case分支中的语句块无须用花括号括起来。 每个case分支都只是入口点 break 语句是转移语句(转出switch),Java的循环语句,while(表达式) do 语句组; 语句组; while(表达式); for ( 表达式1;表达式2;表达式3) 语句组; 表达式1:循环变量赋初值,可使用外部没有定义的循环变量 表达式2:循环条件 表达式3:循环变量修正,Java的转移语句,没有goto语句 break 从一个封闭的语句,如switch ,for 循环中跳出来 break 标号 从包含本break语句的标号指示的封闭语句中跳出来。 while (e1) aaa: while (e1) while(e2) while(e2) break; break aaa; ,Java的转移语句,continue (用在循环体中) 提前结束本次循环,即跳过后面的循环体语句,回到循环的条件测试部分继续执行。 continue 标号 提前结束标号所指循环。通常是某外层循环。 continue不是goto 语句,标号不能指向与本循环并列的循环或其他循环,也不可指向非循环语句。,Application程序人口点,public class HelloWorldApp public static void main(String args) java HelloWorldApp 执行包括main方法的主类 java HelloWorldApp args0 args1 ,例:求2100的素数,每行打印5个数字,import java.io.*; public class prime public static void main(String args) First_Loop: for(int i=2,k=0;i100;i+) for(int j=2;j=Math.sqrt(i);j+) if(i%j=0) continue First_Loop; System.out.print(i+t); k+; if(k%5=0) System.out.println(); /for /main /class,面向对象程序设计,对象,对象(object) 客观对象 现实生活中的对象可以是任何物体,例如,一台计算机、人或动植物、从最简单的整数到复杂的航天飞机等,都是现实生活中的对象,另外,一些看不见的事务、规则也是客观存在的对象。 客观对象的两个基本特点 任何一个物体都包括两个基本特点,一个是物体的内部构成(或属性),例如汽车的轮子、门和发动机等,另一个是物体的行为(或方式),既对该物体内部构成成分的操作或与外界信息的交换,例如汽车的发动、鸣号、行使和停车等。 Java的对象 OOP用对象表示现实中的物体(客观对象),有两个基本的成分与客观对象的两个基本特点相对应: 属性(data)表示对象的属性; 方法(method)表示对象的行为。,对象与过程,考虑对象 考虑过程 :前者更有意义 设计对象 设计过程:前者更富挑战性,尤其是设计可重用的对象。 面向对象的程序设计和问题求解力求符合人们日常自然的思维习惯,降低分解问题的难度和复杂性,提高整个求解过程的可控制性、可监测性和可维护性,从而达到以较小的代价和较高的效率获得较满意效果的目的。,封装-信息隐藏,“ 封装”是一种组织软件的方法。其基本思想是把客观世界中联系紧密的元素及相关操作组织在一起,使其相互关系隐藏在内部,而对外仅仅表现为与其他封装体间的接口。从而构造出具有独立含义的软件实现。 封装并不是一个新的概念,但在面向对象的程序设计中提出了一种全新的封装方法类,封装-信息隐藏,每个类里都封装了相关的数据和操作。在实际的开发过程中,类多用来构建系统内部的模块, 由于封装特性把类内的数据保护得很严密,模块与模块间仅通过严格控制的界面进行交互,使它们之间耦合和交叉大大减少,从而降低了开发过程的复杂性,提高了效率和质量,减少了可能的错误,同时也保证了程序中数据的完整性和安全性。,封装-软件复用,封装使得对象: 对内成为一个结构完整、可自我管理、自我平衡、高度集中的整体。 对外则是一个功能明确、接口单一、可在各种合适的环境下都能独立工作的有机的单元。 类的封装特性使得类可重用性大为提高,这样的有机单元特别适宜构建大型标准化的应用软件系统,可以大幅度地提高生产效率。,在程序中定义你抽象出的类,新类必须在已有类的基础上构造。 在已有类的基础上构造新类的过程称为派生。 派生出的新类称为已有类的子类。已有类称为超类(父类)。 子类继承父类的方法和属性。 当没有显式指定父类时,父类隐含为java.lang包中的Object类。,类的继承,类继承 类继承是指一个新的类继承原有类的基本特性。原来的类称为父类、超类(superclass)或基类,新的类称为原来类的子类或派生类。在子类中,不仅包含有父类的属性(数据)和方法,还可增加新的属性和功能。这种子类继承父类的方法也被称为类的派生(deriving),也就是由父类派生出子类。 子类还可以派生新的子类,这种派生过程可以进行多次,形成不同层次的类。例如,人类可分为工人、农民、学生和教师等,学生又分为大学生、中学生和小学生,教师又分为小学教师、中学教师和大学教帅,大学教师又分为助教、讲师、教授。人类的这种划分就形成了不同层次的类。 类的继承提高了程序的可复用性。根据类的继承机制,在父类中只定义各层子类都需要的属性和功能,类派生时,只增加新的属性和功能,因此父类的基本特征可被所有子类的对象共享,提高了类的重复利用率,这样,也极大地简化了软件的开发,有利于提高软件开发的效率。Java系统已开发了许多实用类库,如输入输出类(java.io.*),用户利用它们派生自己所需要的类,实现特定的输入输出功能。 对于Java而言,类的声明是使用extends子句来继承类,并且,只能继承一个类。,类的多态性,类的多态性 类的多态性(polymophism)是指一个名称有多种功能,或者相同的接口有多种实现的方法。 在Java编程语言中,类的多态性通过方法的重载(overloading)、覆盖(overriding)和接口来实现。,类的声明,类声明的完整格式为: 类修饰符class 新类名extends 超类名implement 接口名 其中,内的内容为可选项。,类修饰符,类修饰符 类修饰符决定了类在程序运行中被处理的方式。创建类时,可以接受缺省的修饰符,也可以根据需要指定一个或多个修饰符。 这些修饰符可以是一个访问修饰符(public,protected,private),加上一个或多个类型修饰符 (abstract, static,final,strictfp)。,类名,与Java的其他标识符一样,类名有如下设置:(1)以字母、字符- 或$开头。(2)只能含有大于十六进制00C0以上的Unicode字符。(3)不能使用与Java关键字相同的类名。(4)类名通常以大写字母开头,如果类名由多个单词组成,则每一个单词的开头字母也大写。,实例,abstract class Point int x=1, y=1; void move(int dx, int dy) x +=dx; y +=dy; alert(); abstract void alert(); class SimplePoint extends Point void alert() ,实例,class Employee String name ; int age ; float salary ; Employee e = new Employee( ) ; e.name=“张立” ; e.age=21; e.salary = 528.37F ;,类定义方法说明,为Employee类增加打印方法将数据和代码封装在一个单一的实体中。 class Employee String name; int age; float salary ; void print() System.out.println(name + ”年龄为: ” + age + “ 月薪为: ” + salary ); /class,对象方法的含义,Employee emp = new Employee( ) ; emp.name=“张立” ; emp.age=21; emp.salary = 528.37F ; 一旦对象被建立并被初始化,就可以调用该方法打印这个对象的数据。 emp.print() ; 对象emp执行print 方法操作自己的数据;而不是从外部操作对象的数据。 向对象发消息,让对象做某件事。,数据的隐藏-封装,属性的访问权限 private public 默认(相当于package) 使用private 修饰符修饰属性后,就不能从对象的外部直访问这些属性(类内方法仍可以访问) ,而只能通过该类的方法来操作这些属性。 私有属性公有方法 方法可以保护数据(做各种合法性检查)。 使得代码可维护性好(代码可变,接口不变),类方法的定义规则,修饰符 返回类型 方法名(参数列表) throws 异常 方法名后的小括号是方法的标志。 形式参数是方法从调用它的环境输入的数据。 返回值是方法在操作完成后返还给调用它的环境的数据。 要指定方法返回值类型。如没有返回值,类型要写 void 方法名相同,但参数不同,是不同的方法。 与类名相同的所有方法都是类的构造方法。,方法体的定义,在方法中定义的变量称为局部变量。 其生命周期:执行进入方法体时建立,退出方法时撤消。 局部变量使用之前必须初始化。 在方法体中可以访问所有的类属性,可以调用所有类中定义的方法。 方法可以递归调用。,引用类型 值传送,基本类型 值传送,地址传送,值传送与地址传送,3.14,3.14,A,B,3.14,A,B,0 x2F,0 x2F,A,B,参数传递例,public class PassTest float m_float ; void change1(int pi) pi = 100; void change2(String ps) ps=new String(“Right”) ; void change3(PassTest po ) po.m_float=100.0 ; public static void main(String args) PassTest pt = new PassTest() ;,参数传递例,int i = 22 ; pt.change1( i ) ; System.out.println(“i value is ” + i); String s = new String( “Hello” ) ; pr.change2( s ) ; System.out.println(“s value is ” + s); pt.m_float = 22.0F ; pt.change3( pt ) ; System.out.println(“Current pt.m_float is ” + pt.m_float); / main() / class,实参,形参,copy,方法中使用“this”,class Banana void f(int i) . Banana a = new Banana(), b = new Banana(); a.f(1); b.f(2); 方法如何知道是处理哪个对象? 编译做了一些内部处理: Banana.f(a,1); Banana.f(b,2); 把一个隐含的参数传给了方法指向被操作对象的引用。 因为是内部处理,引用没有标识名。 如果你在方法中想拿到这个引用 this,this,class Banana void pick() void pit() this.pick(); / pick() public class MyDate int day , month , year ; public void tomorrow() this.day = this.day + 1 ; /day = day + 1 ,this,this 只能在方法中使用,表示当前对象,或类的当前实例。 this 适用用于一些特殊的场合。 例: public class MyDate int day , month , year ; public void born() Birthday bd = new Birthday(this) ; ,this 例,class Leaf private int i = 0; Leaf increment() i+; return this; void print() System.out.println(i = + i); public class a public static void main(String args) Leaf x = new Leaf(); x.increment().increment().increment().print(); ,Overloding 重载方法名,用同一个名字来表示不同的方法。这些方法同名的原因,是因为它们的最终功能和目的都相同,但由于在完成同一功能时,可能遇到不同的具体情况,所以需要定义含不同的具体内容的方法。 方法名必须相同(是同一类中定义同名方法的情况)。 方法的参数必须不同(同名不同方法是靠不同形式的参数列表来区分,包括形式参数的个数、类型、顺序的不同)。 返回类型可以不同,但不是重载的标志。 利用“重名”现象提高程序的抽象度和简洁性。,方法的重载,例:(相同类型的工作,不同的参数) public void println(int i) public void println(float f) public void println(String s) Integer类: String toString() static String toString(int i) static String toString(int i , int radix) Double 类: String toString() static String toString(double d),构造方法,实例化对象初始化对象 类名 对象引用名 new 构造方法(); Employee emp = new Employee(); new运算符的参数就是调用类的构造方法,初始化新建的对象。 new运算符为对象分配内存空间,并返回对该对象的一个引用。 构造方法的名字必须是类的名字。 构造方法没有返回类型说明。 当没定义任何构造方法时,系统配一个隐含的构造方法(如:Employee())里面没有内容。 一旦定义了一个构造方法,隐含构造方法失效!,定义构造方法,Employee(String n, int a,float s) name = n ; if(a=18 ,对象初始化三步曲,当为对象分配内存空间后,首先将属性单元置为: 0 (数值型,字符型) false (逻辑型) null (引用型) 对象建立后,有明确的状态,属性都有值。 执行显式初始化 class a private int x=10; private String s = new String(“first”) ; private MyTime mt = new MyTime() ; 执行构造方法,构造方法之间的调用,public class Employee Employee(String n, int a,float s) name = n ; if(a=18 ,构造方法之间的调用,在一个构造方法中,当使用this 并给它一个参数列表时,this显式调用参数匹配的另一个构造方法。 在一个构造方法中,不能象调用一般方法那样调用另一个构造方法。构造方法不是用来调用的,而是new算符的参数。,继承,继承是一种由已有的类创建新类的机制,是面向对象程序设计的基石之一。 子类继承父类的非私有属性和方法,还可以定义新的属性和方法,改写父类的方法。 继承实际上是存在于面向对象程序中的两个类之间的一种关系。 Java要求每个类都有父类。(隐含为java.lang包中的Object类。 super 是对父类的引用,引用父类的构造方法、父类成员属性和方法。,继承,属性: name age salary 方法: upSalary getInfo,Employee,Engineer,Manager,Secretary,Director,属性: allowance 方法: setAllowance getInfo,属性: telephone department 方法: setTel getInfo,增加属性和方法,class Employee String name ; int age ; float salary ; void upSalary(float inc) salary = salary + inc ; class Manager extends Employee float allowance ; void setAllowance(float a) allowance = a ; class Direator extends Manager String telephone ,department ; void setTel(String tel) telephone = tel ; ,调用父类的构造方法,子类继承父类所有的属性和方法(非private),但不继承构造方法。 子类或定义自己的构造方法,或使用隐含构造方法。 为了保证安全性,在子类的所有构造方法中,必须首先调用一个父类的构造方法, 子类可在自己的构造方法中使用super() 来调用父类带参数的构造方法。super()调用语句必须是子类构造方法中的第一个可执行语句。 若子类 的构造方法中没有super()语句,系统将隐含调用父类无参数构造方法。,调用父类构造方法,在继承情况下的对象初始化: 为对象分配内存并初始化(0、null、false) 执行每一层的类的显式初始化。 执行每一层的类的构造方法(由于显式或隐式调用) 。,抽象与抽象类,程序员可以先创建一个定义共有属性和方法的一般类,再从一般类派生出具有特性的新类。 抽象类实际上是所有子类的公共域和公共方法的集合,而每一个子类则是父类的特殊化,是对公共域和方法在功能、内涵方面的扩展和延伸。,类继承树,Object,class,abstract class,class,final class,class,java单重继承,抽象类与最终类,abstract 抽象类 没有具体对象的概念类 较高层次的概括 抽象类的作用是让其他类来继承它的抽象化的特征。 在程序中不能用抽象类作为模板来创建对象。 final 最终类 该类不能有子类 。,抽象类与最终类,abstract class PhoneCard class Number_PhoneCard extends PhoneCard final class D200_Card extends Number_PhoneCard . 抽象类经常要包含某些抽象方法(方法的具体实现要在子类中实现)。 final可以与abstract一起使用吗?,抽象方法,abstract 抽象方法 仅有方法头而没有方法体的方法,为该类的子类定义一个方法的接口标准。 abstract void performDial () ; 一个抽象类的子类如果不是抽象类,则它必须为父类中的所有抽象方法书写方法体。,最终方法,final 最终方法 不能被当前类的子类重新定义的方法。 子类不能再重新定义与此方法同名的自己的方法,而仅能使用从父类继承来的方法。只能继承但不能修改。 固定了这个方法所对应的具体操作,可以防止子类对父类关键方法的错误的重定义,保证了程序的安全性和正确性。,方法覆盖(overriding),在面向对象的程序设计中,子类可以把从父类那里继承来的某个方法改写,形成同父类方法同名、解决的问题也相似、但具体实现和功能却不尽一致的新方法。 定义与父类完全相同的方法,实现对父类方法的覆盖: 完全相同的方法名 完全相同的参数列表 完全相同类型的返回值 注意:在满足上述三个条件同时,还必须保证:访问权限不能缩小,抛出的例外要相同 三个条件有一个不满足,就不是方法的覆盖,而是子类自己定义与父类无关的方法,父类的方法未被覆盖,因而仍然存在。 调用父类被覆盖的方法 super.方法名,方法覆盖-抽象方法的实现,PhoneCard类抽象了一个其子类共有的方法: abstract boolean performDial(); 这个方法代表的相同功能(拨打电话),但在不同种类的电话卡中,其具体实现是不同的。不同的子类可以重新定义 该方法。 但是所有的类中,凡是实现拨打电话这种功能的方法,尽管内容不同,却共享相同的名字performDial 由于同名的不同方法是属于不同的类,所以只需在调用方法时指明是哪个类的方法即可区分(类名.方法名或对象名.方法名)。,方法的覆盖,abstract PhoneCard类: abstract boolean performDial(); double getBalance() abstract Number_PhoneCard类: abstract boolean performDial(); double getBalance() boolean performConnection(long cn,int pw) final D200_Card类: boolean performDial() 覆盖 实现抽象方法 double getBalance() 覆盖 实现细节不同 boolean performConnection(long cn,int pw),系统类中方法覆盖例,java.lang.Object 方法1:public boolean equals(Object obj) 比较引用型变量(引用同一个对象时为真) class Myclass /继承了equals方法 String m_s ; Myclass(String s) m_s = s ; 而类String Date File Integer 都覆盖了equals方法, 当对象的类型和内容相同时为真。,系统类中方法覆盖例,class test static void main(String args) Myclass mc1 = new Myclass(“wang”); Myclass mc2 = new Myclass(“wang”); if (mc1.equals(mc2) System.out.println(“true”) ; else System.out.println(“false”) ; String s1 = new String(“wang”) ; String s2 = new String(“wang”) ; if (s1.equals(s2) System.out.println(“true”) ; else System.out.println(“false”) ; ,系统类中方法覆盖例,Object定义的方法:toString() 将一个对象转换为一个字符串表示。返回对象类型及引用地址。 System.out.println( mc1.toString() ) Myclass7a52dd00 System.out.println(mc1) ; /隐含调用toString() 很多类覆盖了该方法。如基本类型封装类将该方法改为:返回对象表示的数据的字符串形式。 Integer i1 = new Integer(123) ; System.out.println (i1);,方法重载/方法覆盖/域隐藏,方法的覆盖与方法重载的区别 重载:一个类中,同名方法(参数不同) 覆盖:子类对父类方法的覆盖(不同类的同名方法) 方法的覆盖与域的隐藏的区别: 子类隐藏父类的域只是使之不可见,父类的同名域在子类对象中仍然占有自己独立的内存空间; 而子类方法对父类同名方法的覆盖将清除父类方法占用的内存,从而使父类方法在子类对象中不复存在。,多态-Polymorphism,一个对象只有一种形式(构造函数确定的) 一个对象引用是多态的,因为它可以指向不同形式的对象。 Employee e1 = new Manager() ; e1.allowance = 300.0F ; ? e1.setAllowance(500.0F) ; ? e1.upSalary(200.0F) ; e1.getInfo() ; 子类具有父类的所有方法和属性,任何对于父类合法的操作对于子类也是合法的。 只限于父类定义的方法和域。但实际对象决定访问的属性和调用的方法。,多态应用,同质收集(collection) Employee staff = new Employee100 ; staff0 = new Manager() ; staff1 = new Director() ; 多态参数(接收通配对象) class Employee static float findTax(Employee e) Manager m = new Manager(); System.out.println(Employee.findTax(m),实例类型的判断与转换,public void method(Employee e) if( e instanceof Manager) Manager m = (Manager)e ; m.setAllowance(500.0F) ; else if (e instanceof Director) Director d = (Director)e; d.department=“d02” ; d.setTel(“9999”) ; else /employee ,实例类型转换规则,按类层次向上转换(cast upward)总是允许的,且不用转换,只需直接赋值即可。 Manager m = new Manager(); Employee e = (Employee)m ; Employee e = m ; System.out.println(e.getInfo(); 按类层次向下转换(cast downwand),编译会首先检查是否可能。 如果编译允许,运行时还要看实际的情况。在没有使用instanceof做检查的时候,对象正好不是要转换的类型,出运行错误。,类变量(静态变量),类变量为类的各实例共享的变量。 static 静态变量 ; 位于类的内存区域中,为该类的各个对象共享. 无此限定符的变量是实例变量。 class ex int i ; static int j ; static final int k=10 ; - 为节省空间, final 常量可同时 定义为static,类ex j k=10,对象1 i : 3,对象2 i : 5,类变量(静态变量),实现各实例之间的通讯。 跟踪创建的实例数。 public class Count private int serial ; /成员变量 private static int
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!