收藏 分享(赏)

第5讲 Java面向对象程序设计(二).ppt

上传人:dreamzhangning 文档编号:3350667 上传时间:2018-10-17 格式:PPT 页数:53 大小:552.50KB
下载 相关 举报
第5讲 Java面向对象程序设计(二).ppt_第1页
第1页 / 共53页
第5讲 Java面向对象程序设计(二).ppt_第2页
第2页 / 共53页
第5讲 Java面向对象程序设计(二).ppt_第3页
第3页 / 共53页
第5讲 Java面向对象程序设计(二).ppt_第4页
第4页 / 共53页
第5讲 Java面向对象程序设计(二).ppt_第5页
第5页 / 共53页
点击查看更多>>
资源描述

1、第5讲 Java面向对象程序设计(二),2018/10/17,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标识符定义规则即可。

2、,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(); ,编译错误!

3、,编译错误!,6,1. 抽象类的定义,抽象类中可以有抽象方法,也可以有非抽象方法。 如果一个类中所有的方法都是非抽象方法,这样的类也可以定义成抽象类。 一个类中如果有一个方法是抽象方法,则该类必须声明为抽象类,否则会出现编译错误。 当一个类继承抽象类时,一定要实现抽象类中的所有抽象方法,否则该类为抽象类。,7,/抽象类AbstractClass1中有两个抽象方法 abstract class AbstractClass1 abstract void amethod1();abstract void amethod2(); /继承抽象类AbstractClass1,但没实现其抽象方法,所以要定义

4、成抽象类 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

5、 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

6、=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:

7、“; ,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);

8、 ,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 v

9、oid 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中,一个

10、类可以同时实现多个接口来实现多重继承。 接口与类属于同一个层次,在接口中也有变量和方法,但接口中的变量和方法有特定的要求。,19,1. 接口的定义, interface extends super_interfaces ,20,接口定义的示例,interface Flyer interface Sailer public interface InterfaceExtendTest extends Flyer, Sailer ,一个接口可以同时继承多个接口,21,1. 接口的定义,接口中定义的成员变量默认都具有public、static、final属性,并且这些常量在定义时必须要赋值,赋值后其值

11、不能改变。 接口中所定义的成员方法默认都具有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关系,即类实

12、现接口。 接口实现的定义如下:class extends implements , * * ,24,2. 接口的实现,接口列表中可以有多个接口,多个接口之间用逗号分隔。 一个类实现接口时,就要将接口中的所有抽象方法都实现;否则这个类必须定义为抽象类。 由于接口中抽象方法的访问限制属性默认为public,所以在类中实现后的非抽象方法其访问限制属性只能是public。,25,interface Interface1 void amethod1();void amethod2(); abstract class C1 implements Interface1 public void amethod

13、1() ,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. 多重继承,Ja

14、va中类是单继承,而多重继承可以通过实现多个接口来完成。 当类实现多个接口时,该类的对象可以被多个接口类型的变量来引用。,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.print

15、ln(“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、p

16、rotected和默认的三种中任意一种;而接口中的方法其默认属性为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 Fly

17、er 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,通过接口类型的变量来引用具体对象时,只能访问接口中定义的方法 而要访问具体对象中定义的方法时,则需要将接口类型引用强制转换成具体对象类型的引用。 在转换之前可以使用i

18、nstanceof进行测试,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()

19、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();,

20、引用所指向的对象可以看作是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,为了便于管理大型软件系统中

21、数目众多的类,解决类命名冲突的问题,Java引入了包(package)。,4.4 包,包的说明: package pkg1.pkg2.pkg3; package语句必须放在源程序文件的开头位置,且在一个源程序文件中最多有一个package语句。通过使用package语句实现下面的两个目的: 可将多个相关的源程序文件归类,存放在一个包中,容易管理,且在同一个包中的类不能重名; 实现Java的访问控制机制,由于private修饰的属性和方法是私有的,使包外的代码无法访问,保证数据的安全。,使用package的程序在使用JDK命令编译程序时和无package语句的程序有所不同,需要使用“-d”选项指

22、定包的存放位置。例如:,此时使用了“-cp”选项(也可以使用“-classpath”选项)用于指向包ch3是在c:source路径下,由于字节码文件PackageDemo.class是在包ch3中,因此必须使用“ch3.PackageDemo”的方式指明字节码的位置。,执行此命令之后,就会在c:source目录下面生成一个包(文件夹)ch3,并且包ch3内包含了字节码文件PackageDemo.class。使用java命令运行程序时,应采用如下的格式:,在Java中,使用import关键字导入程序中用到Java的类包,使用import语句时应把import语句放在package语句的下面,类的

23、定义之前,一个源程序文件可以使用由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 InnerClassint

24、y=20;public static void main (String args)OuterClass oc=new OuterClass();OuterClass.InnerClass ic=oc.new InnerClass();System.out.println(“Outer:x=“+oc.x);System.out.println(“InnerClass:y=“+ic.y); ,内部类是外部类的一个成员,内部类对象不能单独存在,它必许依赖一个外部类对象,4.5.1 内部类,使用内部类在编写事件处理驱动的程序时用起来很方便。 只有内部类才能够是私有的安全机制,只有其外部类的方法才能够

25、创建内部类对象。,4.5.2 匿名类,如果只需要为内部类建立一个对象,甚至不必为该类指定一个名字,这种类被称为匿名内部类。如果满足下面的一些条件,使用匿名内部类是比较合适的: 只用到类的一个实例 类在定义后马上用到 类非常小(推荐在4行代码以下) 给类命名并不会导致你的代码更容易被理解,4.5.2 匿名类,new ActionListener() public void actionPerformed(ActionEvent e) ;,class 类名 implements ActionListenerpublic void actionPerformed(ActionEvent e) new 类名();,由于匿名内部类没有名称,因此创建匿名内部类对象时,new运算符后是超类或接口的名称,其后的内部为匿名类的定义(匿名类对象的创建和匿名类的声明是在一起的)。,4.5.2 匿名类,匿名类不能是抽象类,因为系统在创建匿名类的时候,会立即创建匿名类的对象。因此不允许将匿名类定义成抽象类。 匿名类不能有构造方法,因为匿名类没有类名,无法定义构造方法,但匿名类可以定义实例初始化块,通过实例初始化块来完成构造方法需要完成的事情。 匿名类不能定义任何静态成员、方法和类; 匿名类不能是public、protected、private、static; 只能创建匿名类的一个实例。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报