Java面向对象程序设计(二).ppt_第1页
Java面向对象程序设计(二).ppt_第2页
Java面向对象程序设计(二).ppt_第3页
Java面向对象程序设计(二).ppt_第4页
Java面向对象程序设计(二).ppt_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第5讲 Java面向对象程序设计(二),2019/7/21,1,本讲内容,4.3 抽象类与接口 4.4 包 4.5 内部类和匿名类,2,4.3 抽象类 与接口,4.3.1 抽象类 抽象类的定义 抽象类的作用,3,1. 抽象类的定义,在定义类时,前面再加上一个关键词abstract,这样的类就被定义成抽象类。 抽象类的定义如下: abstract class modifiers为修饰符,访问限制修饰符可以为public,或者什么都不写,如果抽象类定义成public时,则文件名要与类的名字完全相同。 abstract class抽象类。 class_name类名,符合Java标识符定义规则即可。,4,1. 抽象类的定义,抽象类不能实例化,即不能产生抽象类的对象。 在抽象类中可以定义抽象方法,抽象方法也是用关键词abstract来标识。 抽象方法的语法格式为: abstract methodName(param_list); 在抽象方法中只包含方法的声明部分,而不包含方法的实现部分。,5,abstract class Student abstract void isPassed() ; public class AbstractClassTest public static void main(String args) Student s; s=new Student(); ,编译错误!,编译错误!,6,1. 抽象类的定义,抽象类中可以有抽象方法,也可以有非抽象方法。 如果一个类中所有的方法都是非抽象方法,这样的类也可以定义成抽象类。 一个类中如果有一个方法是抽象方法,则该类必须声明为抽象类,否则会出现编译错误。 当一个类继承抽象类时,一定要实现抽象类中的所有抽象方法,否则该类为抽象类。,7,/抽象类AbstractClass1中有两个抽象方法 abstract class AbstractClass1 abstract void amethod1(); abstract void amethod2(); /继承抽象类AbstractClass1,但没实现其抽象方法,所以要定义成抽象类 abstract class AbstractClass2 extends AbstractClass1 ,8,class Class3 extends AbstractClass1 void amethod1() System.out.println(“重写之后的amethod1方法。“); void amethod2() System.out.println(“重写之后的amethod2方法。“); ,9,public class AbstractClassExtendsTest public static void main(String args) AbstractClass1 c3=new Class3(); c3.amethod1(); c3.amethod2(); ,重写之后的amethod1方法。,重写之后的amethod2方法。,10,2. 抽象类的作用,形成多态 增强程序的可维护性,11,abstract class Shape abstract double getArea(); abstract String getShapeInfo(); class Triangle extends Shape double a; double b; double c; Triangle(double a,double b,double c) this.a=a; this.b=b; this.c=c; ,12,double getArea() double p=(a+b+c)/2; return Math.sqrt(p*(p-a)*(p-b)*(p-c); String getShapeInfo() return “Triangle: “; ,13,class Rectangle extends Shape double a; double b; Rectangle(double a,double b) this.a=a; this.b=b; double getArea() return a*b; String getShapeInfo() return “Rectangle: “; ,14,public class AbstractOverridingTest public void printArea(Shape s) System.out.println(s.getShapeInfo()+s.getArea(); public static void main(String args) AbstractOverridingTest aot=new abstractOverridingTest(); Shape s=new Triangle(3,4,5); aot.printArea(s); s=new Rectangle(5,6); aot.printArea(s); ,Triangle: 6.0,Rectangle: 30.0,15,class Square extends Shape double a; Square(double a) this.a=a; double getArea() return a*a; String getShapeInfo() return “Square: “; ,16,public class AbstractOverridingTest public void printArea(Shape s) System.out.println(s.getShapeInfo()+s.getArea(); public static void main(String args) AbstractOverridingTest aot=new AbstractOverridingTest(); Shape s=new Triangle(3,4,5); aot.printArea(s); s=new Rectangle(5,6); aot.printArea(s); s=new Square(8); aot.printArea(s); ,Square: 64.0,17,4.3.2 接口,接口的定义 接口的实现 多重继承 接口与抽象类,18,1. 接口的定义,接口实现了多重继承,又很好地解决了C+多重继承在语义上的复杂性。 在Java中,一个类可以同时实现多个接口来实现多重继承。 接口与类属于同一个层次,在接口中也有变量和方法,但接口中的变量和方法有特定的要求。,19,1. 接口的定义, interface extends super_interfaces ,20,接口定义的示例,interface Flyer interface Sailer public interface InterfaceExtendTest extends Flyer, Sailer ,一个接口可以同时继承多个接口,21,1. 接口的定义,接口中定义的成员变量默认都具有public、static、final属性,并且这些常量在定义时必须要赋值,赋值后其值不能改变。 接口中所定义的成员方法默认都具有public、abstract属性。,22,interface Inter1 int i=8; double d=2.3; void m1(); public class InterfaceDefiTest public static void main(String args) System.out.println(Inter1.i); System.out.println(Inter1.d); Inter1.d=Inter1.i+3; ,编译错误!,23,2. 接口的实现,接口与接口之间可以有继承关系 而类与接口之间是implements关系,即类实现接口。 接口实现的定义如下: class extends implements , * * ,24,2. 接口的实现,接口列表中可以有多个接口,多个接口之间用逗号分隔。 一个类实现接口时,就要将接口中的所有抽象方法都实现;否则这个类必须定义为抽象类。 由于接口中抽象方法的访问限制属性默认为public,所以在类中实现后的非抽象方法其访问限制属性只能是public。,25,interface Interface1 void amethod1(); void amethod2(); abstract class C1 implements Interface1 public void amethod1() ,26,class C2 implements Interface1 public void amethod1() System.out.println(“实现抽象方法1“); public void amethod2() System.out.println(“实现抽象方法2“); public class InterfaceImpleTest public static void main(String args) Interface1 cim=new C2(); cim.amethod1(); cim.amethod2(); ,实现抽象方法1,实现抽象方法2,27,3. 多重继承,Java中类是单继承,而多重继承可以通过实现多个接口来完成。 当类实现多个接口时,该类的对象可以被多个接口类型的变量来引用。,28,interface I1 void aa(); interface I2 void bb(); abstract class A abstract void cc(); ,29,class C extends A implements I1, I2 public void aa() System.out.println(“aa“); public void bb() System.out.println(“bb“); void cc() System.out.println(“cc“); ,30,public class MultiInterfactTest public static void main(String args) I1 ic1=new C(); ic1.aa(); I2 ic2=new C(); ic2.bb(); A a=new C(); a.cc(); ,aa,bb,cc,31,4. 接口与抽象类,抽象类使用abstract class来定义,而接口用interface来定义。 抽象类中可以有抽象方法,也可以没有抽象方法,但接口中的方法只能是抽象方法。 抽象类中的抽象方法前必须用abstract来修饰,而且访问限制修饰符可以是public、protected和默认的三种中任意一种;而接口中的方法其默认属性为abstract和public。,32,4. 接口与抽象类,抽象类中的成员变量定义与非抽象类中的成员变量定义相同;而接口中的成员变量其默认属性为public、static、final。 类只能继承一个抽象类,而可以同时实现多个接口。 通过接口也可以实现多态。,33,interface Flyer void fly(); class Bird implements Flyer public void fly() System.out.println(“鸟在空中飞翔!“); class Airplane implements Flyer public void fly() System.out.println(“飞机在空中飞行!“); ,34,public class InterfacePolymorTest public static void main(String args) Flyer fy=new Bird(); fy.fly(); fy=new Airplane(); fy.fly(); ,鸟在空中飞翔!,飞机在空中飞行!,35,instanceof,通过接口类型的变量来引用具体对象时,只能访问接口中定义的方法 而要访问具体对象中定义的方法时,则需要将接口类型引用强制转换成具体对象类型的引用。 在转换之前可以使用instanceof进行测试,instanceof的语法为: instanceof ,36,interface Flyer void fly(); class Bird implements Flyer public void fly() System.out.println(“鸟在空中飞翔!“); public void sing() System.out.println(“鸟在歌唱!“); ,37,class Airplane implements Flyer public void fly() System.out.println(“飞机在空中飞行!“); public void land() System.out.println(“飞机在着落!“); public class InstanceofTest public static void main(String args) Flyer fy=new Bird(); testType(fy); fy=new Airplane(); testType(fy); ,38,public static void testType(Flyer fy) if(fy instanceof Flyer) System.out.println(“引用所指向的对象可以看作是Flyer类型“); fy.fly(); /fy.sing(); /fy.land(); ,引用所指向的对象可以看作是Flyer类型 鸟在空中飞翔!,引用所指向的对象可以看作是Flyer类型 飞机在空中飞行!,39,if(fy instanceof Bird) System.out.println(“引用所指向的对象是Bird类型“); (Bird)fy).sing(); if(fy instanceof Airplane) System.out.println(“引用所指向的对象是Airplane类型“); (Airplane)fy).land(); ,引用所指向的对象是Bird类型 鸟在歌唱!,引用所指向的对象是Airplane类型 飞机在着落!,40,41,为了便于管理大型软件系统中数目众多的类,解决类命名冲突的问题,Java引入了包(package)。,4.4 包,包的说明: package pkg1.pkg2.pkg3; package语句必须放在源程序文件的开头位置,且在一个源程序文件中最多有一个package语句。通过使用package语句实现下面的两个目的: 可将多个相关的源程序文件归类,存放在一个包中,容易管理,且在同一个包中的类不能重名; 实现Java的访问控制机制,由于private修饰的属性和方法是私有的,使包外的代码无法访问,保证数据的安全。,使用package的程序在使用JDK命令编译程序时和无package语句的程序有所不同,需要使用“-d”选项指定包的存放位置。例如:,此时使用了“-cp”选项(也可以使用“-classpath”选项)用于指向包ch3是在c:source路径下,由于字节码文件PackageDemo.class是在包ch3中,因此必须使用“ch3.PackageDemo”的方式指明字节码的位置。,执行此命令之后,就会在c:source目录下面生成一个包(文件夹)ch3,并且包ch3内包含了字节码文件PackageDemo.class。使用java命令运行程序时,应采用如下的格式:,在Java中,使用import关键字导入程序中用到Java的类包,使用import语句时应把import语句放在package语句的下面,类的定义之前,一个源程序文件可以使用由0或多个import语句。,4.5 内部类和匿名类,一个Java程序就是一个类的集合。程序中的类有两种排列结构。,在一个类中定义其它类,4.5.1 内部类,例如:class EnclosingClass class ANestedClass 内部类在外部类中有特权:内部类可以毫无限制地访问外部类的所有成员。 编译之后,内部类也可产生单独的.class文件,文件名为:外部类名$内部类名.class,4.5.1 内部类,例: 内部类使用示例。 public class OuterClass private int x=10; class InnerClass int y=20; public static void main (String args) OuterClass oc=new OuterClass(); OuterClass.InnerClass ic=oc.new Inne

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论