《Java程序设计教程 (2).ppt》由会员分享,可在线阅读,更多相关《Java程序设计教程 (2).ppt(348页珍藏版)》请在三一办公上搜索。
1、1,Java程序设计Programming in Java,同济大学软件学院唐剑锋,2,引用声明,本课件部分内容引自雍俊海于Java程序设计教程.北京:清华大学出版社,2007中所提供的课件,3,课程选用教材,雍俊海.Java程序设计教程.(第二版)北京:清华大学出版社,2007.,4,参考资料,Bruce EckelThinking in JavaCay Horstmann Core Java 2 Volume 1 FundamentalsKathy SierraHead First Java林信良JAVA JDK6 学习笔记张孝祥Java就业培训教程孙卫琴JAVA面向对象编程SUNJava
2、 API Document,Java中的MSDN,5,教学内容,第01章 绪论第02章 结构化程序设计第03章 面向对象程序设计第04章 数组、字符串、向量与哈希表第05章 泛型、枚举与for语句的简化写法第06章 异常处理、递归和单体程序设计方法第07章 文件与数据流,6,教学内容,第08章 Swing图形用户界面程序设计第09章 小应用程序(Applet)(有兴趣可自学)第10章 编程规范和程序调试(务必自学)第11章 多线程程序设计第12章 网络程序设计(自学)第13章 多媒体与图形学程序设计(有兴趣可自学)第14章 数据库程序设计,7,第 1 章 绪论,Java简介开发环境的建立简单J
3、ava程序的编写Java程序的工作原理,8,1.1 Java历史简介,SUN公司1)1991:Oak用于智能消费型电子产品的语言James Gosling市场需求发展没有预料的快,差一点就要取消2)1993:网络的发展,挽救了这个项目为网页增加了“动态的内容”,即动态网页设计3)1994:Oak应用于网络,称为Java4)1995:Java正式公布,Stanford University Network,9,JDK版本的名称,10,Java产品分类,J2SE:Java2 Platform,Standard EditionJ2SE是Java2的标准版,即桌面版本,用于开发普通桌面应用程序。J2E
4、E:Java2 Technology,Enterprise EditionJ2EE是Java2的企业版,主要用于进行企业级的团体合作开发,Internet和服务器级程序的开发。J2ME:Java2 Micro Edition 主要用于手机、PDA等移动通讯设备、嵌入式设备或消费性电器的开发。,11,Java现状,Java现在常用来:1)开发大规模的商业运用软件2)增强网络服务的功能3)开发智能消费型电子产品的应用软件(例如手机),12,1.2 为什么采用Java语言(特点),Java语言白皮书A simple,object-oriented,distributed,interpreted,ro
5、bust,secure,architecture-neutral,portable,high-performance,multi-threaded,dynamic language.,13,为什么采用Java语言 特点,简单性:Java的语法比 C/C+简单网络特性面向对象平台无关性/可移植性Write Once,Run Anywhere(?)鲁棒性安全性多线程性解释性,14,Java与C+的比较,Java使用了类似C+的语法,而去除了C+中的复杂内容,以实现其简单、鲁棒、安全、可移植等特性,具体如下:全局变量无条件转移指令goto指针内存管理数据类型的一致性,15,1.3 建立Java开发环
6、境的步骤,1)下载J2SE安装程序2)运行J2SE安装程序,安装J2SE3)设置环境变量:运行路径(path)类路径(classpath)4)下载J2SE的在线帮助文档,16,(1)下载与(2)安装指南,http:/例如,安装:JavaTM 2 SDK,Standard Edition选择所需的版本选择对应的操作系统,17,编译器及一些工具,演示程序,用于本地方法的文件,Java运行时环境文件,库文件,安装完成后的JDK目录结构,一些示例程序,18,bin目录中的几个主要程序,JavacJavaAppletviewerJavadocJdbJavahJavap,19,(3)设置环境变量,假设 J
7、ava SDK 安装在 C:j2sdk设置:path=%path%;C:j2sdkbinclasspath=.;C:j2sdklib,20,21,(4)下载J2SE的在线帮助文档,下载 Java 2 SDK在线帮助文档 From:SunSun 中国技术社区http:/,22,1.4.1 开发Java程序的基本流程,使用文本编辑器(Notepad,Editplus,UltraEdit,)编写Java源程序,并命名为 xxx.java点击“开始”“运行”,cmd,进入dos状态,进入Java源程序所在目录编译源程序javac xxx.java,得到字节码文件(.class文件)运行程序java x
8、xx,由java解释器解释执行,23,两种类型的Java程序,应用程序(Application)小应用程序(Applet),24,例 1:J_HelloJava(应用程序),public class J_HelloJava public static void main(String args)System.out.println(Java语言,您好!);System.out.println(我将成为优秀的Java程序员!);/方法main结束/类J_HelloJava结束,25,例 1:J_HelloJava(应用程序),/功能描述:/在控制台窗口中输出:/“Java语言,您好!”和/我将成
9、为优秀的Java程序员!/,26,编译&执行,27,程序分析,类定义Java程序的基本组成部分是类(class),如本例中的J_HelloJava类。一个源文件中最多只能有一个public类。main()方法Java Application程序的入口是main()方法。它有固定的书写格式:public static void main(String args),28,例 2(略):J_HelloApplet.java,Applet小应用程序Applet 子类的实例java.applet.Applet、运行方式包含小应用程序的HTML文件被打开运行方法appletviewer(小应用程序的测试工
10、具)网页浏览(IE和Netscape等),29,例 2:J_HelloApplet.java,/在一个网页上显示:/小应用程序,您好!/,30,通过文本编辑器(如:UltraEdit)创建并编写Java源文件,/文件名:J_HelloJava.java;开发者:雍俊海import java.awt.Graphics;import javax.swing.JApplet;public class J_HelloApplet extends JApplet public void paint(Graphics g)g.clearRect(0,0,getWidth(),getHeight();/清除
11、背景 g.drawString(小应用程序,您好!,10,20);/方法paint结束/类J_HelloApplet结束,31,通过文本编辑器(如:UltraEdit)创建并编写HTML文件,简单招呼小应用程序例程,32,编译源文件&运行小应用程序,33,1.4.2 Java程序的工作原理,34,1.4.2 Java程序的工作原理,35,安全性,字节码的运行要经过三步:加载代码:由class loader 完成;校验代码:由bytecode verifier 完成;执行代码:由 runtime interpreter完成。,36,开发工具介绍,1、JCreator(教学使用)JCreator
12、是一个Java程序开发工具,也是一个Java集成开发环境(IDE)。JCreator的设计接近Windows界面风格,用户对它的界面比较熟悉。其最大特点是与我们机器中所装的JDK完美结合,是其它任何一款IDE所不能比拟的。JCreator是一种初学者很容易上手的java开发工具,缺点是只能进行简单的程序开发,不能进行企业J2EE的开发应用。Xinox Software公司的JCreator,分为为LE和Pro版本。LE版本功能上受到一些限制,是免费版本。Pro版本功能较全,是共享软件。,37,开发工具介绍,2、Eclipse号称未来能进行任何语言开发的IDE集大成者。Eclipse是一个开放源
13、代码的项目,任何人都可以下载Eclipse的源代码,并且在此基础上开发自己的功能插件。可以无限扩展,而且有着统一的外观,操作和系统资源管理,这也正是Eclipse的潜力所在。,38,39,开发工具介绍,3、NetBeans4、JBuilder5、,40,第2章 结构化程序设计,标识符和关键字数据类型、直接量和变量运算符控制结构结构化程序设计,41,2.1.1 Java中的标识符,标识符可以用来标识变量名、类名、类中的方法名和文件名等.标识符组成:(1)字母,(2)数字,(3)下划线“_”和(4)美元符号“$”;首字符必须是(1)字母,(2)下划线“_”和(3)美元符号“$”;所有标识符是区分大
14、小写的;除去关键字、false、true和null;,42,问:是/不是 标识符?,myVariable 9pinsMYVARIABLE i a+ctesting1-2-3,_myvariablejava¨My Variable$myvariable _9pins Its猫,Eg:判断一个字符是否可以做Java标识符的起始字符或后继字符,43,public class J_Identifier public static void main(String args)char c=猫;if(Character.isJavaIdentifierStart(c)(字符+c+可以做标识符的首字符
15、);else(字符+c+不可以做标识符的首字符);if(Character.isJavaIdentifierPart(c)(字符+c+可以做标识符除首字符外的组成字符);else(字符+c+不可以做标识符除首字符外的组成字符);/方法main结束/类J_Identifier结束,J_Identifier.java,44,2.1.2 Java关键字,具有特殊含义的字符序列例如:public、static和class等具有特殊用途,不能作为变量名、方法名和类名,45,Java关键字(50个),46,2.2 Java中的数据类型,47,基本数据类型,48,Java直接量,Java直接量包括基本数据类
16、型直接量、字符串(String)直接量和null 布尔(boolean)直接量只有两个:true 和 falsec,u0061,u0051 和 u005a 是char直接量.34是int直接量1.5,45.6,76.4E8和-32.0是double直接量34L是long直接量1.5F,45.6f,76.4E8F和-32.0F是float直接量“Hello World!”是String直接量null是引用数据类型的直接量,49,字符直接量,可采用如下四种表示方法整数直接量单引号括起来的单个字符 A 人单引号括起来的Unicode字符 u0061单引号括起来的转义字符 r n t,50,2.2.3
17、 变量,变量在计算机内部对应着一个存储单元,而且总是具有某种数据类型:基本数据类型或引用数据类型。每个变量均具有:名字、类型、一定大小的存储单元以及值。,51,变量,如果变量的数据类型是基本数据类型,则在变量的存储单元中存放的是具体的布尔值或数值。如果变量的数据类型是引用数据类型,则在变量的存储单元中存放的是引用值。引用值一般用来指向某个具体的对象。如果引用值是null,则该引用值不指向任何对象。,52,变量,图例:int sum=0;String s=“Hello World!”;,53,补充:内存管理简介,堆(heap),栈(stack),数据段(data segment),代码段(cod
18、e segment),堆(heap),栈(stack),数据段(data segment),堆(heap),栈(stack),代码段(code segment),数据段(data segment),堆(heap),栈(stack),代码所占空间,静态变量字符串常量,New产生的空间,局部变量,54,类型转换,隐式类型转换强制类型转换使用强制类型转换运算符()boolean不能与其它基本类型数据进行相互转换,byteshort,char int long float double,55,2.3 Java运算符,算术运算符关系运算符布尔逻辑运算符位运算符赋值类运算符条件运算符其他运算符,56,1.
19、算术运算符,算术运算符包括:+,-,*,/,+,-,%没有指数运算Math.pow(2.0,3.0);/2.03.0整数除法:截去余数7/5 结果为 1取模:返回余数(可对浮点数进行运算)7%5 结果为 2,57,问题?,-7/5=-7%5=7%-5=5.5%1.0=,-1-220.5,58,2.关系运算符,六个关系运算符:、=、=和!=例如:1 2;/false3.5!=1;/true 51.5=23.0;/true540=654;/true24=3*8;/trueboolean test1=(10 10);/test1=false;,59,3.布尔逻辑运算符,六个布尔逻辑运算符:&(逻辑与
20、AND)|(逻辑或OR)(逻辑异或XOR)!(逻辑非NOT)单目运算符,即只有一个操作数&(条件与AND)|(条件或OR),60,短路规则(&和|),如果从第一个操作数可以推断出表达式结果,就不再计算第二个操作数例如:if(x=2),61,逻辑运算(&和|),两个操作数均会被运算(即不采用短路规则)用不用短路规则,副作用不同 例如:(birthday=true)|(+age=65),Eg:J_Boolean.java,62,4.位运算符,位运算符包括:&、|、和 带符号右移不带符号右移移位操作是:先将整数写成二进制形式,然后按位操作,最后产生一个新的数注意:只用于整数,63,5.赋值类运算符,
21、赋值类运算符包括:=、+=、-=、*=、/=、,64,6.条件运算符,条件运算符“?:”的表达式形式为“op1?op2:op3”op1:布尔表达式例如:int k=(i=0)?1:-1);,65,条件运算符,public int compare(Date date)return year date.year?1:year date.month?1:month date.day?1:day date.day?-1:0;,66,7.其他运算符,其他运算符包括:(类型)、.、()、instanceof和new例如:int a=51;char c=(char)a;,67,算符优先,不同的运算符具有不同
22、的优先顺序可以用()来改变优先顺序或使表达式更容易理解例如:a+b+c/3(a+b+c)/3,68,控制结构,if/else if/else while for do while switch case break continue,69,控制结构,顺序结构Java最基本的结构选择结构三种类型:if、if/else和switch 循环结构三种类型:for、while和do/while,70,if语句,if语句的格式:if(布尔表达式)语句或if(布尔表达式)一条或多条语句,建议采用,71,if-else语句,if-else语句的格式:if(布尔表达式)语句1或语句块1else 语句2或语句块2
23、,72,多分支选择结构switch语句,switch(表达式)case 值1:语句组1 break;case 值2:语句组2 break;case 值n:语句组n break;default:语句组(n+1),要求属于:char,byte,short,intCharacterByteShortIntegerenum,73,for循环语句,格式:for(表达式1;表达式2;表达式3)语句或语句块也可写成:表达式1;while(表达式2)语句或语句块 表达式3;,74,while循环语句,while循环语句格式为:while(布尔表达式)语句或语句块当条件(布尔表达式)为true,则不断地执行语句
24、或语句块“while”循环中止条件是布尔表达式变为false如果布尔表达式一开始就为false,则不执行循环体,75,do/while循环语句,先执行,后判定条件即循规环体至少执行1次格式do 语句或语句块while(布尔表达式);好的编程风格:总是以“”引导循环体,即使语法上并不需要,76,break语句,switch语句中的break语句:终止swtich语句的执行,跳到switch后的语句;代码块中的break语句:在Java中,可以为一段代码加上个标号,并用把这段代码括起来,这就是代码块,格式为:标号:代码段;程序中可用break 标号;来跳出该代码块,转到该块后的第一个语句去执行,如
25、:,77,break语句,a:/标记代码块ab:/标记代码块bc:/标记代码块c break b;/跳出b块/这段代码不会被执行/c结束/这段代码也不会被执行/b结束/从这里开始执行/a结束,78,continue语句,continue语句用来结束本轮循环,跳过循环体中下面尚未执行的语句,接着进行终止条件的判断,以决定是否继续循环。对于for语句,在进行终止条件的判断前,还要先执行迭代语句。它的格式为:continue;也可以用continue跳转到括号指明的外层循环中,这时的格式为continue outerLable;,79,continue语句,outer:for(int i=0;i10
26、;i+)/外层循环inner:for(int j=0;j10;j+)/内层循环if(ij)continue outer;/跳到outer循环中,/即跳出outer的本轮循环,80,break&continue,J_Break.javaJ_ContinueLoopSingle.javaJ_ContinueLoopNested.java,81,第3章 面向对象程序设计,类、域、方法和实例对象继承性多态性包(package)封装性关键字abstract、static、final和this接口内部类变量作用域范围和参数传递方式面向对象程序设计基本思想,82,面向对象程序设计整体介绍,面向对象程序设计(
27、OOP)将数据(属性)和方法(行为或功能)封装到类(class)中数据与方法常常是紧密相关的对象(object):类的实例对象或类本身三个基本特性:封装性、继承性和多态性,83,3.1 类,类(class)是实例对象的模板类的定义格式:类修饰词 class 类名 extends 父类名 implements 接口名称列表 类体,84,定义中的相关说明,类修饰词:public abstract final strictfp类名的要求extends关键字java.lang.Object简介implements关键字类体:成员域构造方法成员方法,85,类的成员域,用于表示和存储类所需要的数据域修饰词
28、列表 类型 变量名变量名列表域修饰词:public protected private static final transient volatileeg:int m_radius=0;private Student m_s1;,86,与C+程序不同:每个方法都必须隶属于某个类方法定义的格式:方法修饰词 返回类型 方法名(方法的参数列表)方法体 方法修饰词:public protected privateabstract static final synchronized strictfp,方法定义,87,方法定义,返回类型:返回数据的数据类型除了构造方法,一般要求返回类型:要么为void,要
29、么为某种数据类型最多只能返回一个值方法名:任何一个合法的标识符参数列表:用逗号(,)分隔开,88,返回控制,如果没有值返回:return;/退出该方法或者遇到该方法的最后一个“”,则退出该方法如果有值返回:return 表达式;/退出该方法返回该表达式的值,89,构造方法在创建新的实例对象时起作用构造方法通常用来初始化实例对象例如:初始化成员域或设置工作环境构造方法的特点:与类同名没有返回值?如果加上了返回值可以含有多种构造方法(重载)但必须具有不同的参数列表,构造方法,演变为普通成员方法,90,默认的构造方法,如果没有显式地定义类的构造方法,则系统会为该类定义一个默认的构造方法。默认构造方法
30、不含任何参数。该方法首先调用其父类的不含任何参数的构造方法,然后初始化新生成的实例的各个成员域变量默认值:基本数值类型:0;boolean:false;引用数据类型:null最好自己写构造方法一旦在类中定义了构造方法,系统就不会再创建这个默认的不含参数的构造方法。,91,创建类的实例对象,new 构造方法名(构造方法调用参数列表)eg:类Integer有构造方法 public Integer(int value)new Integer(11)Integer m_i=new Integer(11),92,实例对象的生成,首先在内存中创建该实例对象进行实例对象的初始化带初始化的变量,进行初始化然后
31、调用类的构造方法完成初始化(如果有赋值操作)将实例对象的地址写入引用该实例对象的变量中。,93,实例对象的使用,成员运算符.变量名.成员域名变量名.成员方法名(方法参数),94,Java中的垃圾回收机制,垃圾:不再被Java程序所用的内存基本原理:在适当的时机自动回收不再被Java程序所用的内存垃圾的判定对于一个实例对象,如果没有任何引用指向该实例对象,则该实例对象所占据的内存是不再被Java程序所用的内存。,95,Java中的垃圾回收机制,eg:Integer a=new Integer(11);a=null;,注意分析此时的内存情况,96,Java中的垃圾回收机制,JVM自定义了一套垃圾回
32、收算法,以提高垃圾回收的效率。一般不会立即回收不保证回收时间不保证回收顺序System.gc()方法向JVM申请尽快进行垃圾回收,但不保证立刻回收。,97,Java中的垃圾回收机制,protected void finalize()Object类中定义的方法实例对象所占据的内存即将被回收之前,通常调用该方法。Java不保证在回收实例对象之前一定会调用该方法,Eg:J_Finalize.java,98,99,补充:包装类,类 Integer、Float、Boolean等封装了一个对应的基本类型包装类对应于8种基本数据类型,有8个包装类作用?用于需要使用class类型作为参数的场合包装类中封装了多
33、种实用功能,方便使用,100,3.2 继承性,继承性 软件重用的一种方法根据已有的类创建新的类采纳了旧的类的属性(域)及其行为(方法)增加了新的能力子类继承父类子类增加了新的成员域或新的成员方法有时可以理解成:(但不绝对!)子类对象是一种特殊的父类对象,101,实现继承的方式,类修饰词 class 类名 extends 父类名 implements 接口名称列表 类体子类继承父类(及所实现接口)的成员域和成员方法继承关系具有传递性默认的父类,102,继承时构造方法间的约束关系,子类构造方法必须调用其直接父类的构造方法且该调用是子类构造方法的第一条语句调用方式super(参数列表);参数列表能够
34、与父类中的某个构造方法匹配,否则出错;未显式调用时,则自动调用父类的默认构造方法;此时,若父类无默认构造方法,则出错。,Eg:J_Teacher.java,103,子类和父类间的类型转换,子类型数据父类型数据(隐式转换)J_Teacher tom=new J_Teacher()J_Employee a=tom;此类转换时也可加强制转换运算符System.out.println(J_Employee)tom).m_workYear);,104,子类和父类间的类型转换,父类型数据子类型数据(显式转换)J_Teacher tom=new J_Teacher()J_Employee a=tom;J_T
35、eacher b=(J_Teacher)a;J_Employee a=new J_Employee()J_Teacher b=(J_Teacher)a;,注意过程:T E T,105,子类和父类间的类型转换,无继承关系的类型之间,一般不能进行类型转换。子类的实例对象同时也是父类的实例对象。由父类构造方法创建的实例对象一般不是子类的实例对象。,106,关键字:instanceof,运算符:instanceof功能:判断某个引用指向的实例对象是否是某种引用类型的实例对象例如:if(p instanceof Circle)上面的条件为 true,当且仅当引用p所指向的对象是类Circle(或其子类)
36、的实例对象,107,instanceof 的常见用法,先判断一个引用表达式所指向的实例对象是否是目标类型的实例对象,如果是,再进行类型转换及后续操作,避免引用类型转换的runtime error。eg:J_Employee a=new J_Employee()J_Teacher b;if(a instanceof J_Teacher)b=(J_Teacher)a;else b=new J_Teacher();,108,多重继承,在有些计算机语言中,允许一个类有多个直接父类。这种继承关系称为多重继承Java不支持多重继承Java 允许一个类有多个直接父接口(interface),109,3.3
37、多态性,优点:代码重用简化设计、简化代码便于程序扩展,110,多态性及其种类,多态性:在类的定义中出现多个构造方法或出现多个同名的成员方法对成员方法,还包括在子类中出现与父类型同名的方法多态性的类型:静态的多态性重载(overload)动态的多态性重写(override)/覆盖类定义中不建议出现同名的成员域,111,3.3.1 静态的多态性(重载),在编译时就能够被识别针对的是同一个类内的同名方法,也包括一个类对其父类同名方法在功能上的重载。要求同名的方法有不同的参数列表(方法签名)eg:public int square(int x)return x*x;public double squa
38、re(double x)return x*x;,Eg:J_Student.java,112,识别重载方法,识别标志:参数的个数、类型、数据类型的排列顺序返回值不能做为识别的标志参数名不能做为识别的标志特例:,public void add(int i,double i);public void add(double i,int j);add(1.0,1);add(1,1.0);add(1.0,1.0);add(1,1);,TestOverload.java,113,3.3.2 动态多态性(覆盖),在程序运行时才被识别在子类和父类的类体中均定义了具有基本相同声明的非静态成员方法不含static关
39、键字基本相同:方法名相同、参数个数相同、类型相同、且子类成员方法具有相同或更广的访问控制方式。子类中重写父类的方法,Eg:J_Teacher.java,114,动态多态性(覆盖),作用:通过父类型的引用调用子类型的成员方法实现条件:存在继承关系子类中重写了父类的成员方法父类引用指向子类对象只针对非静态成员方法。静态成员方法不具有动态多态性。,115,super关键字,作用:动态多态性导致子类成员屏蔽了父类成员,需要考虑如何访问父类成员。使用方式:super.父类型的成员域super.m_workYear;super.父类型的成员方法(参数列表)super.mb_printInfo();supe
40、r(父类构造方法的参数列表)super();,116,this关键字,作用:调用同一个类的成员域或成员方法,解决命名冲突。使用方式:this.当前类的成员域;this.当前类的成员方法;this关键字在实际开发中的用途,117,3.4 包,可以将一组相关的类或接口封装在包(package)里,从而更好地管理已经开发的Java代码,118,包声明语句,package 包名;package语句如果出现,应当是源程序文件中的第一条语句包名可以是一个标识符,也可以是若干个标识符通过.连接而成,通常采用后者一般形式:所在单位的Internet域名的倒序eg:package tools;package,1
41、19,相关的编译,编译参数javac d 路径名 xxx.java如果为当前路径,则路径名为.在指定路径根据包名生成层次目录结构Java中的软件包以目录的形式进行管理,120,包的导入,采用import语句导入,该语句是源程序中除包声明之外的最前面若干条语句格式:import 包名.*;import 包名.类型名;import static 包名.类型名.静态成员方法名;Eg:import fruit.*;import fruit.Apple;import fruit.Grape;,121,注意事项,每个软件包都有一个包名,包与包之间没有嵌套关系,任何包不会包含其它包。Eg:有packagep
42、ackage tools;package press;import tools.*import press.*,122,classpath,classpath由一些软件包的根路径组成,之间用;隔开(windows平台)import时根据classpath中的路径进行搜索eg:classpath=.;c:j2sdklib,123,实例,J_Employee.javaJ_Teacher.javaJ_University.java,124,备注,当不采用import导入所需要的包时,可通过在程序中直接使用所用类/方法的全名。eg:有package tools,其中有类Calc,Noteimport
43、tools.*;Calc a=new Calc();等同于tools.Calc a=new tools.Calc();,125,Java 包,Java系统提供了很多已经写好的包数学计算、输入/输出、字符串操作尽量利用已有的包、避免重复工作包java.lang基本软件包,自动导入提供了Java程序所需要的最基本的类和接口,126,3.5 封装性,作用:使得各模块的外在表现仅仅为对一些成员域的访问方式和一些成员方法的调用方式,屏蔽具体实现方式。Java中的封装性通过访问来控制对类:使用类的成员,派生出子类,生成对象对成员域:读取/改变成员域的值对成员方法:调用成员方法对构造方法:使用构造方法创建实
44、例对象,127,类(非内部类)的访问控制方式,公共模式(public)能够被所有软件包使用默认模式(default)只能在同一个软件包内部使用(同包可见)对类成员的访问首先必须能够访问类,然后由该成员的访问控制方式决定能否访问。,128,类成员的访问控制方式,成员(域或方法)的访问控制方式:1)public2)private3)protected4)default(缺省方式),129,成员的访问控制方式:public,则该成员可以被任何类中的方法访问表明对外开放的方式少量(或者没有)public 域部分 public 方法,130,成员的访问控制方式:private,目的:隐藏具体的实现细节只
45、有同一个类的成员方法才能访问私有成员域常常是private 采用 public“get”方法读取数据采用 public“set”方法写数据eg:Eclipse中提供了为指定成员变量生成Setter和Getter方法的功能,131,成员的访问控制方式:protected,介于public 和private之间同一个包内的所有类的所有方法都能访问该成员如果不在同一个包内的类的方法要访问该成员,则该类必须是该成员所在的类的子类,132,成员的访问控制方式:default,只有在同一个包内的类的方法才能访问该方法,133,类成员封装性总结,134,3.6.1 修饰词abstract,Java允许类、接
46、口或成员方法有抽象属性成员变量、构造方法不允许抽象属性abstract 类 必须被继承abstract方法必须被重写,135,修饰词abstract,抽象成员方法方法修饰词列表 返回类型 方法名(参数列表);抽象成员方法不含有方法体即:只提供方法的头部,但不提供实现的部分,也不允许实现eg:public abstract double getArea();,136,修饰词abstract,抽象类用abstract修饰的类一般用于对多个类的特征进行归纳,提取共同特征后形成更一般的抽象类抽象类不能被实例化抽象类中可以包含抽象方法,为所有子类定义一个统一的接口,但并不是必须的;一旦某个类中包含抽象方
47、法,则这个类必须声明为抽象类,137,修饰词abstract,抽象类的子类除非声明为抽象类,否则必须实现抽象类中所声明的全部抽象方法优点:利用动态多态性,对抽象类的引用变量进行操作,方便扩展eg:abstract class J_Shapepublic int m_shapeID=0;public abstract double getArea();,138,3.6.2 关键字static,类的成员变量和成员方法可以为static属性除内部类之外,普通类不具有静态属性构造方法不能是静态的静态成员变量public static int countT;静态成员方法public static voi
48、d main(String args),Eg:J_Book.java,139,各类访问和调用方式,非静态方法中访问非静态成员变量成员变量名this.成员变量名非静态方法中访问静态成员变量成员变量名this.成员变量名类名.成员变量名,教材P88-P89描述有误,需更正,140,各类访问和调用方式,非静态方法中调用非静态成员方法成员方法名this.成员方法名非静态方法中调用静态成员方法成员方法名this.成员方法名类名.成员方法名,141,各类访问和调用方式,静态方法中访问非静态成员变量/方法不允许直接访问先创建实例对象,通过该对象进行访问静态方法中访问静态成员变量成员变量名类名.成员变量名静态
49、方法中调用静态成员方法成员方法名类名.成员方法名,142,3.6.3 关键字final,可以修饰的对象:final 域:不能修改public static final double PI=;final 方法:不能重写final 类:不能继承public final class System要求:不能同时具有abstract属性,143,关键字final,对具有final属性的成员变量同时具有static属性:必须定义时赋值public static final double PI=;不具有static属性:定义或构造方法中赋值public final double PI;构造方法中赋值,144
50、,3.7 接口(interface),类,抽象类,成员方法的属性为public abstract,成员变量的属性为public static final,引入关键字interface,只包含成员方法和成员变量,接口,abstract,145,接口的定义,一个接口可以有多个父接口public interface Runnablepublic abstract void run();一个.java文件中可以有多个接口,但最多只能有一个public的接口习惯上,将每个接口定义在一个.java文件中,类修饰词 class 类名 extends 父类名,接口修饰词,interface,接口名,exten