




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、接口与包接口与包什么是包(什么是包( package )l包的作用类似于C的函数库,但是C的函数库很容易出现重名的问题,包在一定程度上解决了这个问题。l一个包通常包含很多个功能相近的类。lJDK里面已经包含了N个功能强大的包,所以当你要实现一个功能,首先记得去查一下JDK的文档,看看有否对应功能的包。l编程语言的优劣都是相对而言的,大家觉得Java功能很强大,其实是因为SUN公司的JDK免费赠送了众多功能强大的包。包包1l包的命名lSUN公司建议用域名的逆序,因为域名是唯一的。如:.xmul包的结构l一个包被映射为一个目录,包里面的每个类,则映射到目录中的某一个文件,如:com.p
2、renhall.mypackage这个包被展开后,就是包包2l打包lpackage packagename;l上面这一行一般出现在Java源文件的第一行,表示这个文件的所有类,都将被打包到packagename中。l不同源文件的packagename可以相同,Java会根据packagename将相同包的class压缩在一起,生成一个扩展名为jar的包。l顺便说一下,jar包其实是zip格式的压缩文件包包3l使用包l要使用一个包里的某个类,必须首先导入limport javax.swing.JOptionPane;l如果要使用一个包里的多个类,用这个limport javax.swing.*;
3、l*表示导入这个包的所有类l注意包之间没有嵌套关系,例如java.awt和java.awt.geom是两个完全独立的包。这个其实很好理解,因为java.awt这个包,仅仅包含java/awt这个目录下的class文件,而java/awt/geom则是另外一个目录了。包的命名规范包的命名规范l包的名称一般全部采用小写l包名的前缀一般是域名单词序列的逆序l实例lcom.sun.englcom.apple.quicktimeledu.cmu.cs.bovik.cheese文件的命名规范文件的命名规范l必须与该文件中public类的类名同名l后缀必须是 .java类类/接口的命名规范接口的命名规范l类
4、名一般是名词/名词词组:每个单词的首字母大写,其它字母小写l类名应当尽量简单,而且其含义能够尽量准确地刻画该类的含义l一般采用全称尽量少用缩写词 (除非该缩写词被广泛使用)l实例lClocklTimelImageSprite方法的命名规范方法的命名规范l方法名一般是l动词/动词性词组l首字母小写l中间单词的首字母大写,其它字母小写l尽量应用简单的、常用的单词l实例lrun( );lgetBackground( );lgetTime( );变量的命名规范变量的命名规范l变量名的首字母小写l中间单词的首字母大写,其它字母小写l变量名的首字母尽量不要用字符: _ 或 $l变量名应当简短、有含义、且便
5、于记忆l变量名常常由表示其所扮演的角色与数据类型组成l实例lint i; char c; double widthBox;lPoint startingPoint, centerPoint;lName loginName;常量的命名规范常量的命名规范l常量名一般全大写,单词之间用下划线分隔 (“_”)l实例:lstatic final int MIN_WIDTH = 4;lstatic final int MAX_WIDTH = 999;源文件编辑源文件编辑l尽量不要用TAB排版l行数/每行的字符数不宜过多l缩排方式(Indentation)l多用空白符/行l友情提示:通常Java的开发环境都
6、会提供源代码的格式化/重排功能,如果使用记事本编辑源代码,建议去下载一个叫astyle的源代码重排工具(DOS命令行工具)。UltraEdit有捆绑这个工具,并提供了GUI界面的调用方式。文件组织文件组织l源程序文件一般采用如下的组织顺序:l最开始一般是注释lpackage 和 import 语句l类和接口的定义搞一个复杂一点的例子先热身搞一个复杂一点的例子先热身l我们想做一个类Circle表示平面直角坐标系上的一个圆(解析几何还记得吧.)。l然后我们想做一个求面积的成员函数。l我们还要假定所有的Circle的成员变量都是private的,所有的成员函数都是public的,下面开始动手设计这个
7、类。操作步骤操作步骤 1l先搭一个空架子总是没有问题的:class Circle操作步骤操作步骤 2l设计一下成员变量,这里三个足够了:class Circle private double r; /r是半径 private double x,y; /(x,y)是圆心坐标操作步骤操作步骤 3l然后是构造函数,这里先搞两个:class Circle private double r; private double x,y; public Circle() x=0; y=0; r=1; public Circle(double x, double y, double r) this.x=x; th
8、is.y=y; this.r=r; /一不小心用到了this,阿门,this是啥知道不? 操作步骤操作步骤 4l然后是面积函数:class Circle private double r; private double x,y; public Circle() x=0; y=0; r=1; public Circle(double x, double y, double r) this.x=x; this.y=y; this.r=r; public double getArea() return (Math.PI*r*r); Eclipse测试程序测试程序l综合一下以上的所有步骤:l先建一个工
9、程,名字随意,再建一个类,名字叫Circle,然后把Circle的代码贴上;l再建一个类,名字随意,例如叫Test,勾上自动生成main函数的选项;l现在你的工程里应该有两个java源文件,两个类,其中一个是用来测试的类,所以它有main函数,Circle类由于没有main函数,所有它是不能运行的。因此启动运行的主类是Test。Test类的写法类的写法public class Testpublic static void main(String args) Circle c1 = new Circle();System.out.println(c1.getArea();Circle c2 =
10、new Circle(3.0,4.0,5.0);System.out.println(c2.getArea();Circle的改进的改进lCircle类显然不完善,例如你在Test类里,如果想知道c1的x,y,r三个成员分别是多少,可能吗?如果你想在Test类里,随时修改c1的半径,可能吗?l答案显然不行,所以,Circle其实还有很多的成员函数需要添加。l这里就不演示了,自己动手试试。研究一下对象的引用研究一下对象的引用l一个类的成员函数(static除外),是不是一定要new才能被使用呢?例如GUI编程中经常有这种语句:lContainer container = getContentPa
11、ne(); container.add(new Button(hello button);l这个container好像就没有new对吧?怎么就可以抓来用呢?难道随便get一下也能用?l其实这个container已经被new过了,只是你没有看见而已。get一下相当于做对象的引用。这么说好像很复杂,看一个例子:对象的引用对象的引用 Iclass A public int x;public class Testpublic static void main(String args) A a = new A(); a.x = 1; System.out.println(a.x=+a.x); A b =
12、 a; /注意这里注意这里b不是不是new出来的出来的 b.x = 10; System.out.println(b.x=+b.x); System.out.println(a.x=+a.x); a.x = 100; System.out.println(a.x=+a.x); System.out.println(b.x=+b.x);这个例子的输出是:a.x=1b.x=10a.x=10a.x=100b.x=100对象的引用对象的引用 IIl总结一下,如果一个对象不是new出来的(例子中的b),而是直接用一个已经new出来的对象(例子中的a)给它赋值,那么这个对象b就叫做a的引用。l引用的对象之
13、所以可以使用,不需要new,其实是因为它所指向的对象和赋值给它的对象是同一个它所指向的对象和赋值给它的对象是同一个!也就是它只是给原来的对象又起了一个名字而已。l顺便再提一次,对象作为函数参数的时候,实参都是通过引用传递引用传递的方式传给形参的。再谈多态性再谈多态性当继承发生的时候,多态性就来了当继承发生的时候,多态性就来了方法覆盖方法覆盖l当子类和超类定义了同样的函数时,就产生了方法覆盖,如:public class Circle extends GeometricObject /* Override the toString method defined in GeometricObjec
14、t */ public String toString() return super.toString() + nradius is + radius; l当覆盖发生时,在子类中,超类中的函数会被自动屏蔽;如果非要调用超类的函数,只能借助于super关键字。覆盖和重载是不同的覆盖和重载是不同的l下图中的函数p,左边是覆盖,右边是重载l覆盖的特征:函数名相同,参数列表相同l重载的特征:函数名相同,参数列表不同来一个例子来一个例子class A protected int x; public void f() x-; class B extends A int x; void f() /覆盖了超类
15、的覆盖了超类的f() this.x+; /这里用的是自己的这里用的是自己的x,也可以直接写,也可以直接写x+ super.x = 100; /这里用的是超类继承来的这里用的是超类继承来的x super.f(); /这里用的是超类继承来的这里用的是超类继承来的f() void f(int i) /重载了继承来的函数重载了继承来的函数f(),注意二者的参数列表不同,注意二者的参数列表不同 i+; 有个复杂点的例子有个复杂点的例子class A void fun() System.out.println(“A”); class B extends A void fun() System.out.pr
16、intln(“B”); class C extends B void fun() System.out.println(“C”); class Test public static void main(String args) A a; B b = new B(); C c = new C(); a=b; a.fun(); / 此处将输出Ba=c; a.fun(); / 此处将输出C 解释一下解释一下lJava 的动态多态性这种机制遵循一个原则:当超类(父类)对象的引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法;l当然,这个被调用的方法必须是必须是在超类中定
17、义过的,也就是说被子类覆盖的方法。你可能会问,如果这个方法没有被覆盖呢?Good question还有个例子还有个例子class A void fun() System.out.println(“A”); class B extends A void funB() System.out.println(“B”); class C extends B void funC() System.out.println(“C”); class Test public static void main(String args) A a; B b = new B(); C c = new C(); a=b;
18、 a.fun(); / 此处将输出Aa=c; a.fun(); / 此处将输出A 从编程角度来看抽象类从编程角度来看抽象类抽象类抽象类l假设我们用GeometricObject这个类作为几何形状的基类,以便可以在GeometricObject的基础上派生出Circle类、Rectangle类等等具体的几何图形。l显然,GeometricObject这个类应该包含几何形状的一些共性:颜色、是否填充、创建日期、toString()函数、可以被求周长、可以被求面积l下面我们来设计这个类:面积和周长的困惑面积和周长的困惑l颜色、是否填充、创建日期等函数不难写出相应的Java代码。但是这里有两个函数是没
19、法写代码的,这就是面积和周长函数。这是因为面积和周长跟具体形状有关,在没有具体的形状之前,这两个属性没法计算。l现在的问题是,作为一个基类GeometricObject,如果没有设计getArea和getPerimeter函数,显然属于重大设计失误。但是这个函数又确实没法写,怎么办呢?Java说,好办,你可以把那两个函数做成抽象函数嘛。抽象函数抽象函数l抽象函数是一种特殊函数,它只定义了函数原型,但是不需要实现这个函数。抽象函数用关键字abstract修饰。l包含抽象函数的类叫做抽象类,也必须用abstract修饰。l我们现在知道,抽象类只是一个半成品,所以Java中,抽象类不可以被new出来
20、。GeometricObject类的部分代码类的部分代码 1 public abstract class GeometricObject 2 private String color = white; 3 private boolean filled; 4 private java.util.Date dateCreated; 5 6 /* Construct a default geometric object */ 7 protected GeometricObject() 8 dateCreated = new java.util.Date(); 9 .43 /* Abstract me
21、thod getArea */44 public abstract double getArea();4546 /* Abstract method getPerimeter */47 public abstract double getPerimeter();48 注意这两个抽象函数注意这两个抽象函数是没有函数体的。是没有函数体的。抽象类的派生类抽象类的派生类l刚才看到,抽象类有几个函数其实是没有实现的;于是Java规定,凡是抽象类的派生类,一定要完成父类的未竟事业。l例如从GeometricObject类派生两个类,一个叫做Circle,一个叫做Rectangle。那么这两个类都一定要覆盖
22、(实现)getArea和getPerimeter函数。换句话说,这两个类可以没有其它成员,但是一定要实现这两个成员函数。Circle类的部分代码类的部分代码3 public class Circle extends GeometricObject 4 private double radius;.23 /* Return area */24 public double getArea() 25 return radius * radius * Math.PI;26 .33 /* Return perimeter */34 public double getPerimeter() 35 retu
23、rn 2 * radius * Math.PI;36 .43 注意这两个注意这两个GeometricObject的抽象函数在这里一定抽象函数在这里一定要被实现。要被实现。Rectangle类的部分代码类的部分代码 3 public class Rectangle extends GeometricObject 4 private double width; 5 private double height;.35 /* Return area */36 public double getArea() 37 return width * height;38 3940 /* Return perim
24、eter */41 public double getPerimeter() 42 return 2 * (width + height);43 44 注意这两个注意这两个GeometricObject的抽象函数在这里一定抽象函数在这里一定要被实现。要被实现。抽象类小结抽象类小结 抽象函数只能在抽象类中出现,这些抽象函数在派生类中一定要被实现。 抽象类不能被new出来。 抽象类可以没有抽象函数,但是即便如此,它也不能被new出来。 即使父类不是抽象类,子类也可以定义成抽象类。 父类中的非抽象函数,可以被子类覆盖,并修改成抽象函数。 抽象类不能被new,但是抽象类是一个合法的数据类型。如:Geo
25、metricObject objects = new GeometricObject10; 1 public class TestGeometricObject 2 /* Main method */ 3 public static void main(String args) 4 / Declare and initialize two geometric objects 5 GeometricObject geoObject1 = new Circle(5); 6 GeometricObject geoObject2 = new Rectangle(5, 3); 7 8 System.ou
26、t.println(The two objects have the same area? + 9 equalArea(geoObject1, geoObject2);1011 / Display circle12 displayGeometricObject(geoObject1);1314 / Display rectangle15 displayGeometricObject(geoObject2);16 1718 /* A method for comparing the areas of two geometric objects */19 public static boolean
27、 equalArea(GeometricObject object1,20 GeometricObject object2) 21 return object1.getArea() = object2.getArea();22 2324 /* A method for displaying a geometric object */25 public static void displayGeometricObject(GeometricObject object) 26 System.out.println();27 System.out.println(The area is + obje
28、ct.getArea();28 System.out.println(The perimeter is + object.getPerimeter();29 30 一个测试程序一个测试程序特殊抽象类:接口特殊抽象类:接口接口接口1l当一个抽象类没有成员变量,并且其全部函数都被做成抽象函数时,Java会建议你使用interface这个关键字来替换class。所以,本质上,接口其实是一个抽本质上,接口其实是一个抽象类,它的全部函数都是抽象函数并且没有成员变量象类,它的全部函数都是抽象函数并且没有成员变量(可以有静态常量)。(可以有静态常量)。l接口由于不带有成员变量,所以它特别适合用来描述一种通用
29、的操作。例如同一个类的两个实例A、B比较大小这个操作,无论A、B是什么类的实例,你都可以定义AB时,取正值;A=B时,取零;A (ComparableRectangle)o).getArea()11 return 1;12 else if (getArea() 基本类型基本类型l可以使用包装类的doubleValue, floatValue, intValue, longValue, shortValue函数,从包装类取出对应的基本类型的值。l例如:llong l = doubleObject.longValue(); /有截断lint i = integerOValue()
30、;数值包装类和字符串的转换数值包装类和字符串的转换l数值包装类 = 字符串ldouble d = 5.9;lDouble doubleObject = new Double(d);lString s = doubleObject.toString();l字符串 = 数值包装类lDouble doubleObject = Double.valueOf(1.4);lInteger integerObject = Integer.valueOf(12);字符串字符串 = 基本类型基本类型l/ These two methods are in the Byte classlpublic static byte parseByte(String s)lpublic static byte parseByte(String s, int radix)l/ These two methods are in the Short classlpublic static short parseShort(String s)lpublic static short parseShort(String s, int radix)l/ These two methods are in the Integer classlpublic static int par
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 急诊工作的方式计划
- 缔造良好工作氛围的策略计划
- 高中历史 第5课 美国独立战争教学实录2 岳麓版选修2
- 统编版小学语文二年级下册第15课《古诗二首》精美课件
- 爱卫知识培训课件社区
- 2025年濮阳货运从业资格证考试内容
- 2025年白山货运从业资格证模拟考试题库
- 2025年临汾道路货物运输从业资格证模拟考试
- 八年级政治下册 第五单元 我是中国公民 5.2《公民的权利和义务》情境探究型教学实录 粤教版
- 2025年天津货运从业资格证模拟考试下载
- 电风暴护理查房
- 2024-2025学年五年级(下)信息科技教学计划
- 2025年中国铸造行业市场前景预测及投资方向研究报告
- 食品采购员工工作计划
- CNAS-SC175:2024 基于ISO IEC 2000-1的服务管理体系认证机构认可方案
- 部门职责与工作流程手册
- 首检培训课件
- TSG 07-2019电梯安装修理维护质量保证手册程序文件制度文件表单一整套
- GB/T 44959.2-2024法庭科学第2部分:检验对象的识别、记录、收集、运输和保存
- 小学数学一年级下册期中试卷及答案-北师大版-2024-2025学年
- GB 4404.1-2024粮食作物种子第1部分:禾谷类
评论
0/150
提交评论