通过代码实例跟我学Java面向对象编程技术及应用提高(第6部分)
- 格式:pdf
- 大小:306.47 KB
- 文档页数:13
使用Java实现面向对象编程使用Java实现面向对象编程第一章抽象和封装1.1 用面向对象设计电子宠物面向对象设计的过程就是抽象的过程:第一步:发现类。
第二步:发现类的属性。
第三步:发现类的方法。
软件出现的目的是为了:用计算机的言语描述现实世界。
用计算机解决现实世界的问题。
抽象是遵循的原则:属性、方法的设置是为了解决业务的问题。
关注主要属性、方法如没有必要、勿增加额外的类、属性与方法。
类的基本结构:其主要由属性和行为组成,成为类的成员变量(或者成员属性)和成员方法,统称为类的成员(除此之外,类的成员还包括构造方法、代码块等)。
类与对象:通过构造方法来创建对象,例如”Penguin p = new Penguin(;”。
通过对象名.属性名的方式调用属性,例如”/doc/925115820.html,=”pp”;”。
通过对象名.方法名的方式调用属性,例如”p.print(;”。
类(Class和对象(Object是面向对象中的两个核心概念。
类是对某一类事物的描述,是抽象的、概念上的定义。
对象是实际存在的该事物的个体、是具体的、现实的。
类的规范:类名、属性名、方法名以及常量名的命名规范如下:类名由一个或几个单词组成,每个单词的第一个字母大写。
属性名和方法名由一个或几个单词组成,第一个单词首字母小写,其他单词首字母大写。
常量名由一个或几个单词组成,所有字母大写。
Static可以用来修饰属性、方法和代码块。
Static修饰的变量属于这个类所有,即由这个类创建的所有对象共用同一个static变量。
通常把static修饰的属性和方法称为类属性(类变量)、类方法。
不使用static修饰的属性和方法,属于单个对象,通常称为实例属性(实例变量、实例方法。
类属性、类方法可以通过类名和对象名访问,实例属性、实例方法只能通过对象名访问。
Final可以用来修饰属性、方法和类。
用final 修饰的变量成为常量,其值固定不变。
1.2 构造方法及其重载构造方法构造方法(Constructor是一个特殊方法,它用于创建类的对象,因此一类必须包含至少一个构造方法,否则就无法创建对象。
1.1Java面向对象程序设计技术及应用——CyclicBarrier类的应用实例1、CyclicBarrier类的主要功能它是一个同步辅助类,允许一组线程互相等待,直到到达某个公共屏障点(Common Barrier Point),该公共屏障点是多线程并发控制的一种手段。
因此,CyclicBarrier可以让所有的线程都处于等待状态(阻塞),然后在满足条件的情况下继续执行。
2、CountDownLatch和CyclicBarrier各自的作用(1)CountDownLatch类的主要作用由于CountDownLatch是一次性的(一旦计数值被初始化设置,计数值将不能被重置),因此它很适合用来将一个任务分解为n个独立的部分,并等这些子部分的任务都完成后继续接下来的任务。
(2)CyclicBarrier类能够弥补CountDownLatch类在应用中的不足CyclicBarrier允许一组线程互相等待,直到整个线程组到达某个公共屏障点(Common Barrier Point,而所谓屏障点其实也就是一组线程任务执行完毕的时刻。
)。
当一个线程到达屏障时(通过调用CyclicBarrier.await()),它会被阻塞,直到所有线程都到达屏障,然后在该点允许所有线程继续执行。
下面为CyclicBarrier类的功能说明:3、CountDownLatch和CyclicBarrier对比(1)CountDownLatch和CyclicBarrier的不同点CountDownLatch是减计数方式,计数==0时释放所有等待的线程;CyclicBarrier是加计数方式,计数达到构造方法中参数指定的值时释放所有等待的线程。
CountDownLatch当计数到0时,计数无法被重置(CountDownLatch中计数是不能被重置的);CyclicBarrier计数达到指定值时,可以将计数置为0重新开始。
因此,CountDownLatch适用于一次同步;而CyclicBarrier可以适用于多次同步或者多个同步点的应用要求。
《Java程序设计案例教程()》模块6 面向对象高级学习目的∙掌握抽象类地定义与使用。
(道德规范)掌握接口地定义与实现。
(创新意识)∙掌握异常地概念以及异常地处理方式。
(工匠精神)1抽象类目录CONTENTS 2接口*案例6-1USB接口地实现*案例6-2组装一台计算机3异常处理*案例6-3异常成绩处理当一个类包含抽象方法,该类需要定义为抽象类。
抽象类用abstract 关键字来修饰,示例如下:abstractclassPet{abstractvoideat();}当定义一个类时,常常需要定义一些方法来描述该类地行为特征,但有时这些方法地实现方式是无法确定地。
针对这样地情况,Java 允许在定义方法时不写方法体。
不包含方法体地方法为抽象方法,抽象方法需要使用abstract 关键字来修饰,示例如下:abstractvoideat();注意:包含抽象方法地类需要声明为抽象类,但抽象类可以不包含任何抽象方法。
另外,抽象类是不可以被实例化地。
因为抽象类有可能包含抽象方法,而抽象方法是没有方法体地,不可以被调用。
如果想调用抽象类定义地方法,则需要创建一个抽象类地子类,在子类对抽象类地抽象方法进行实现。
例6-1实现抽象类地抽象方法。
}狗吃骨头");}}}}1抽象类目录CONTENTS 2接口*案例6-1USB接口地实现*案例6-2组装一台计算机3异常处理*案例6-3异常成绩处理6.2.1接口地概念接口是从多个相似类抽象出来地规范,它不提供任何方法地具体实现过程。
接口体现地是规范与实现分离地设计思想。
接口只定义了应当遵循地规范,并不关心这些规范地内部数据与其功能地实现细节,从而分离了规范与实现,增强了系统地可拓展性与可维护性。
因此,接口定义地是多个类同地行为规范,这些行为是与外部交流地通道,这就意味着接口里通常定义地是一组公用方法。
Android操作系统统一充电接口规范在定义接口时,需要使用interface关键字来声明,语法格式如下:[public]interface接口名[extends接口1,接口2,…]{[public][static][final]数据类型常量名=常量值;[public][static][abstract]返回值抽象方法名(参数列表);}Java把接口当作一种特殊地类,每个接口都被编译为一个独立地字节码文件。
1.1通过代码实例跟我学Java面向对象编程技术及应用提高(第6部分)1.1.1类体中的特殊成员函数——构造方法1、什么是构造方法与类名同名并且无任何返回值类型定义(因为它只是用来创建对象)的public型成员方法。
在Eclipse中创建某个类时,选择了如下的选项:将在该类自动地添加一个默认形式的构造方法2、了解构造方法的执行时机(1)是由系统自动调用——不能在代码中通过对象直接调用构造方法(2)在构造对象时(new语句被执行时将被调用)在StudentInfo类的默认构造方法中添加如下的输出代码:public StudentInfo() {System.out.println("这是默认的构造方法");}同时再测试类中添加如下的输出语句:package com.px1987.j2seexample;public class TestStudentInfo {public TestStudentInfo() {}public static void main(String[] args) {StudentInfo oneStudent=null; //声明一个对象oneStudent=new StudentInfo(); //对声明的对象进行实例化(创建出它)System.out.println("构造方法已经被执行");oneStudent.setStudentName("张三"); //使用对象oneStudent.studyCourse("Java语言编程技术");oneStudent.trainSelf("C++语言编程技术");oneStudent=null; //释放对象所用的内存空间}}(3)当类中定义有多种不同形式的构造方法时——依据创建对象时所给定的“参数”来决定对哪个构造方法调用package com.px1987.j2seexample;public class StudentInfo extends Person{public StudentInfo() {System.out.println("StudentInfo类的缺省构造方法被执行了!");}public StudentInfo(String name) {studentName=name;System.out.println("StudentInfo类的StudentInfo(String name)构造方法被执行了!");}}(4)一旦在类中提供有构造方法,此时创建对象的参数必须要与类中的某个构造方法的参数保持一致性(5)最终的代码示例如下package com.px1987.j2seexample;public class TestStudentInfo {public TestStudentInfo() {}public static void main(String[] args) {StudentInfo oneStudentInfo=null;oneStudentInfo=new StudentInfo();System.out.println("继续执行!");StudentInfo twoStudentInfo=null;twoStudentInfo=new StudentInfo("李四");oneStudentInfo.setStudentName("张三");oneStudentInfo.studyCourse("Java语言核心技术");oneStudentInfo.trainSelf("C++语言编程技术");oneStudentInfo=null;}}3、了解构造方法的作用——在构造方法体内进行成员参数赋值(如何编程构造方法体代码)package com.px1987.j2seexample;public class StudentInfo extends Person{public StudentInfo() {System.out.println("StudentInfo类的缺省构造方法被执行了!");}public StudentInfo(String name) {studentName=name;System.out.println("该学生的名字为:"+ studentName);}}1.1.2类体中的特殊成员函数——重载方法1、什么是重载方法(1)类体中以“同名”而“不同形参定义出”的成员方法。
或者另一种形式的参数——形参一定要有差别(不同)2、下面形式的方法不是重载方法(1)因为它们的形参没有差别(2)尽管它们的返回值不同,但编译系统并不以返回值类型作为重载方法区分的依据(3)因为两个方法的名称不同,当然就不是重载方法3、请阅读下面的代码——了解重载方法被调用的规则import java.util.Date;public class OverLoadMethodDemo {public void someOneOverLoadMethod(Date someOneDate) {System.out.println("在参数为Date类型的方法中的输出的值为:"+someOneDate);}public void someOneOverLoadMethod(Object someOneObject) {System.out.println("在参数为Object类型的方法中的输出的值为:"+someOneObject);}public static void main(String[] args) {OverLoadMethodDemo oneOverLoadMethodDemo=new OverLoadMethodDemo();oneOverLoadMethodDemo.someOneOverLoadMethod(null);oneOverLoadMethodDemo.someOneOverLoadMethod(newjava.sql.Date(109,10,10));//也可以:oneOverLoadMethodDemo.someOneOverLoadMethod(newjava.util.Date(109,10,10));}}null是作为一个很特别的参数传给了方法someOneOverLoadMethod ()方法,但可以认为null是Date、也可以认为null是Object。
但是从类的层次上看Object处在更上层(基类),Date是从Object类继承来的,调用someOneOverLoadMethod(Date someOneDate)方法将更能够准确匹配。
另外java.sql.Date类是java.util.Date的子类,因此传递new java.sql.Date(109,10,10)对象时,也将调用someOneOverLoadMethod(Date someOneDate)方法。
4、了解重载方法调用的规则——系统根据实际参数的“个数”和“类型”匹配的原则调用对应的重载方法package com.px1987.j2seexample;import java.util.Date;public class TestStudentInfo {public static void main(String[] args) { StudentInfo zhang=null; /* (1) */zhang=new StudentInfo("张三"); //(2)zhang.trainSelf("打球");Date nowDate=new Date();zhang.trainSelf("打球",nowDate);}}1.1.3继承与派生中的子类中的成员的正确编程1、子类中如何进行继承与派生父类(可以采用简单的比较法)比较基类和派生类之间的相同与不同点,对相同点则加以继承(不必重定义出);而对差异部分则加以定义出。
常用的手段:(1)继承基类中的原始成员(当派生类中未定义出该成员时将自动采用继承)——“遗传”。
(2)覆盖(替换)父类中的成员函数:当父类中的某些成员函数不再适合子类的需要时,在子类中应重写出自己的成员函数——“变异”。
(3)扩充增强子类功能:当子类要求具有新的功能时,应添加出该功能(新添新的成员)——“进化”。
package com.px1987.j2seexample;import java.util.Date;public class DoctorStudentInfo extends StudentInfo {public DoctorStudentInfo() {}public void studyCourse(String courseContent){ //override(覆盖,重写)super.studyCourse(courseContent);//String infoText="ID号为"+studentID+"并且";System.out.println("姓名为"+ getStudentName()+"的学生正在学习"+courseContent+"课程");}/* 下面的各个方法是继承public void trainSelf(String item){ // overLoad(重载)System.out.println("姓名为"+studentName+"的学生正在复习"+item+"课程");}public void trainSelf(String item,Date time){System.out.println("姓名为"+studentName+"的学生正在复习"+item+"课程");}*/public void doResearch(String item){ //扩展System.out.println("姓名为"+ getStudentName()+"的学生正在进行科学研究"+item+"项目");}}学员练习:在下面的“点”的基础上创建出“圆”类(继承Point类),正确地定义出Circle类中的成员。