接口和多态性PPT讲稿.ppt
接口和多态性第1页,共44页,编辑于2022年,星期日5.1 多态性多态性概念:在程序中同一符号或名字在不同情况下具有不同的语义解释,其有两种基本形式:编译时多态性:在程序编译时可确定的多态性,由重载机制实现运行时多态性:指程序动态运行时才可确定的多态性,由继承继承结合动态绑定动态绑定实现.第2页,共44页,编辑于2022年,星期日5.1 多态性绑定绑定 将一个名字与它的特性相关联的过程.静态绑定就是绑定过程在编译时进行,动态绑定就是绑定过程在运行时进行.动态绑定动态绑定 先设计一个类层次,子类重定义超类的某些方法,然后使用超类类型的对象引用调用这些方法超类类型的对象引用调用这些方法,JVM根据这些对象引用的动态类型选择所调用方法的版本,即如果该对象引用的是超类的对象实例,则调用超类定义的方法,如果引用的是子类的对象实例,则调用子类定义的方法.第3页,共44页,编辑于2022年,星期日public class SuperClass public void firstMethod()secondMethod();public void secondMethod()System.out.println(“SuperClass.secondMethod()”);public class SubClass extends SuperClass public void secondMethod()System.out.println(“SubClass.secondMethod()”);则下述语句运行结果:SubClass subObj=new SubClass();SuperClass superRef=subObj;superRef.firstMethod();输出结果:SubClass.secondMethod()第4页,共44页,编辑于2022年,星期日5.2 抽象类概念概念:只能被继承和扩充而不能创建自己的对象实例的类叫做抽象类。通常用做超类.通过关键字通过关键字abstract abstract 进行标记将类声明为抽象进行标记将类声明为抽象public abstract class Drawing public abstract void drawDot(int x,int y);public void drawLine(int x1,int y1,int x2,int y2)/draw using the drawDot()method/repeatedly.一个一个abstract abstract 类可以包含非抽象方法和变量类可以包含非抽象方法和变量抽象类只有被派生才能创建对象实例抽象类只有被派生才能创建对象实例.抽象方法只有被重定义才能给出其方法体抽象方法只有被重定义才能给出其方法体.第5页,共44页,编辑于2022年,星期日例例:某公司要编写雇员工资支付程序某公司要编写雇员工资支付程序,不同的雇员按不同的方式支付工不同的雇员按不同的方式支付工资资:经理经理(Manager)每月获得固定工资每月获得固定工资;销售员销售员(Salesman)每月基本工资每月基本工资+销售提成销售提成;一般工人一般工人(Worker)按每月工作的天数计算工资按每月工作的天数计算工资第6页,共44页,编辑于2022年,星期日Employee-namegetName()computeSalary()Manager-namemonthSalarygetName()computeSalary()Salesman-namebaseSalaryCommisionquantitygetName()computeSalary()Worker-namedailySalarydaysgetName()computeSalary()第7页,共44页,编辑于2022年,星期日/Employee.javapublic abstract class Employee private String name;public Employee(String name)this.name=name;public String getName()return name;/计算雇员月工资的抽象方法 public abstract double computeSalary();第8页,共44页,编辑于2022年,星期日class Manager extends Employee private double monthSalary;public Manager(String name,double monthSalary)super(name);/调用超类构造函数 this.monthSalary=monthSalary;/重定义超类的抽象方法computeSalary public double computeSalary()return monthSalary;第9页,共44页,编辑于2022年,星期日 class Salesman extends Employee private double baseSalary;/基本工资 private double commision;/每件产品提成额 private int quantity;/销售的产品数量 public Salesman(String name,double baseSalary,double commision,int quantity)super(name);this.baseSalary=baseSalary;mision=commision;this.quantity=quantity;public double computeSalary()return baseSalary+commision*quantity;第10页,共44页,编辑于2022年,星期日class Worker extends Employee private double dailySalary;/每天工资额 private int days;/每月工作的天数 public Worker(String name,double dailySalary,int days)super(name);this.dailySalary=dailySalary;this.days=days;public double computeSalary()return dailySalary*days;第11页,共44页,编辑于2022年,星期日class Demo public static void main(String args)/超类数组,记录各种类型雇员 Employee data=new Employee4;data0=new Manager(Manager,10000);data1=new Salesman(Salesman,3000,200,12);data2=new Worker(Worker Zhang,200,25);data3=new Worker(Worker Li,250,26);displaySalary(data);public static void displaySalary(Employee data)for(int i=0;i程序包程序包(package)=编写大型编写大型java程序程序 弥补了类的单继承不能满足功能扩充的不足弥补了类的单继承不能满足功能扩充的不足第14页,共44页,编辑于2022年,星期日5.3 接口接口的概念类的接口类的接口 供他类可访问的数据成员和方法成员类的实现接口类的实现接口 使用者与实现者之间的约束抽象-相当于纯抽象类 接口必须通过类来实现 接口提供一个观察类的角度一个类可以实现多个接口-多角度观察同一个事物一个接口类可以为多个类实现-同一个角度观察不同事物Java API标准接口 Serializable(可序列化的),Cloneable(可克隆的)MouseListener(鼠标监听者)LayoutManager(布局管理者)第15页,共44页,编辑于2022年,星期日5.3 接口接口的声明/Controllable.java public interface Controllable int OFF=0;/静态变量,要初始化 int ON=1;void setPower(int on_or_off);boolean isPowerOn();接口数据成员接口数据成员只能是公有的静态只能是公有的静态常量数据常量数据,可用可用public,static,final来来修饰修饰接口成员方法只能是接口成员方法只能是公有抽象方法公有抽象方法,只能只能用用public,abstract来来修饰修饰第16页,共44页,编辑于2022年,星期日Pet示例假设有一个超类FourLegged,Cat/Duck/Dog都继承它 又同时要扩展Pet用C+,可以多重继承用JAVA接口实现示例第17页,共44页,编辑于2022年,星期日interface Pet abstract public void speak();class Dog implements Petpublic void speak()System.out.println(Woof);第18页,共44页,编辑于2022年,星期日class Cat implements Petpublic void speak()System.out.println(Meow);class Duck implements Petpublic void speak()System.out.println(Quack);第19页,共44页,编辑于2022年,星期日public class Animalspublic static void main(String agrs)Pet myPets=new Pet4;myPets0=new Duck();myPets1=new Cat();myPets2=new Duck();myPets3=new Dog();for(int index=0;index4;index+)myPetsindex.speak();第20页,共44页,编辑于2022年,星期日接口的使用声明希望一个或更多个类实现的方法展示对象的编程接口而不显示类的内部主体结构捕捉无关联的类之间的相似性而无须强制建立类关系通过声明一个实现几个接口的类来模仿多重继承第21页,共44页,编辑于2022年,星期日电视示例public interface Controllable int OFF=0;/静态变量,要初始化 int ON=1;void setPower(int on_or_off);boolean isPowerOn();第22页,共44页,编辑于2022年,星期日class Television implements Controllable private int power=Controllable.OFF;private String tradeMark=“”;public Television(String mark)tradeMark=mark;public String getTrademark()return tradeMark;public void setPower(int on_or_off)if(on_or_off=Controllable.ON)System.out.println(“请开启电视电源.”);power=Controllable.ON;else if(on_or_off=Controllable.OFF)System.out.println(“请开启电视电源.”);power=Controllable.ON;第23页,共44页,编辑于2022年,星期日public boolean isPower()return(power=Controllable.ON);class ControllableDemopublic static void main()Television obj=new Television(“创维”);Controllable ref=obj;ref.setPower(Controllable.ON);if(ref.isPowerOn()System.out.println(Television)ref).getTradeMark()+”牌电视的电源已经开启”);else System.out.println(Television)ref).getTradeMark()+”牌电视的电源已经关闭”);第24页,共44页,编辑于2022年,星期日5.3 接口接口的继承 public interface TVController extends VideoController,AudioController .接口与其祖先接口中含有同名方法时接口与其祖先接口中含有同名方法时:同形参同返回类型的方法看成同一个方法 不同形参的方法看成互为重载的不同方法 同形参不同返回类型的方法语法错误同形参不同返回类型的方法语法错误第25页,共44页,编辑于2022年,星期日public interface SuperInterface int methodOne(int x);int methodTwo(int x);public interface SubInterfaceOne extends superInterface int methodOne(int x);int methodTwo(String name);String methodTwo(int x);/语法错误 第26页,共44页,编辑于2022年,星期日第27页,共44页,编辑于2022年,星期日4.4 包的创建和使用包的创建和使用第四章 java 中的对象、类、包和接口定义定义:包是一组相关的类或接口的集合,它提供了访问保护和名字空间管理。Java编译器使用文件系统目录来保存包。第28页,共44页,编辑于2022年,星期日4.4 包的创建和使用包的创建和使用第四章 java 中的对象、类、包和接口使用包的好处:使用包的好处:程序员能很容易确定同一包中的类是相互关联的。程序员能很方便地了解到在哪里可以找到能完成特定功能的类 由于每个包都创建了一个名字空间,个人创建的类名不会和其它包中的类名名发生冲突 可以使同一包中的类彼此不加限制地访问,而同时对其它包中的类提供访问控制。第29页,共44页,编辑于2022年,星期日/ClassOne.javapackage packageOne;public class ClassOne public static void main(String args)System.out.println(“类类ClassOne属于程序包属于程序包packageOne!”);l编译:编译:javac ClassOne.javal运行:运行:java ClassOne()java packageOne.ClassOne(使用全名使用全名)在当前目录下建在当前目录下建packageOne子子目录,并将目录,并将ClassOne.class文文件拷入件拷入 javac -d.ClassOne.java 自动建自动建packageOne子子目录并存目录并存入文件入文件ClassOne.class第30页,共44页,编辑于2022年,星期日4.4 包的创建和使用包的创建和使用第四章 java 中的对象、类、包和接口1.创建包创建包格式:格式:package pkg1.pkg2.pkg3;package语句必须放在原文件的开始处。例如: java.io java.util java.lang java.applet javax.swingpackage graphics;public class Circle .第31页,共44页,编辑于2022年,星期日4.4 包的创建和使用包的创建和使用第四章 java 中的对象、类、包和接口1.创建包创建包说明:说明:package的作用域是整个源文件 如果在同一个源文件中定义了多个类,最多仅可以有一个类用public修饰,且源文件名必须与该类名相同 当未使用package语句时,类和接口放在无名缺省包里 包的命名习惯:将Internet域名作为包名 例如:pany.region.package.第32页,共44页,编辑于2022年,星期日4.4 包的创建和使用包的创建和使用第四章 java 中的对象、类、包和接口2.包的使用包的使用 包中的所有类中只有public类能被包外部的类访问。有三种方法三种方法访问包中的类:1)使用长名字引用包中的公共成员使用长名字引用包中的公共成员 即在类名前注明包名即在类名前注明包名例graphics.Rectanglegraphics.Rectangle myRect=new graphics.Rectangle();第33页,共44页,编辑于2022年,星期日4.4 包的创建和使用包的创建和使用第四章 java 中的对象、类、包和接口2.包的使用包的使用2)引进包的公共成员引进包的公共成员 在文件的开始处使用import语句将指定的成员引进到当前文件中.格式:import pkg1.pkg2.类名例import graphics.Circle;Circle myCircle=new Circle();第34页,共44页,编辑于2022年,星期日4.4 包的创建和使用包的创建和使用第四章 java 中的对象、类、包和接口2.包的使用包的使用3)引进整个包引进整个包 使用import语句引进包中的所有类和接口格式:import pkg1.pkg2.*例import graphics.*;现在可以使用短名字来引用类graphics包中的所有类.Circle myCircle=new Circle();Rectangle myRectangle=new Rectangle();第35页,共44页,编辑于2022年,星期日4.4 包的创建和使用包的创建和使用第四章 java 中的对象、类、包和接口3.源文件和类文件的管理源文件和类文件的管理 JDK利用文件系统的层次结构来管理源文件和类文件。源文件和类文件所在的目录名应与其中的类所在的包名对应,编译器和解释器按此机制来查找类。如:第36页,共44页,编辑于2022年,星期日4.4 包的创建和使用包的创建和使用第四章 java 中的对象、类、包和接口3.源文件和类文件的管理源文件和类文件的管理 第37页,共44页,编辑于2022年,星期日4.4 包的创建和使用包的创建和使用第四章 java 中的对象、类、包和接口3.源文件和类文件的管理源文件和类文件的管理 当源文件中有多个类定义时,编译后将产生多个类文件。第38页,共44页,编辑于2022年,星期日4.4 包的创建和使用包的创建和使用第四章 java 中的对象、类、包和接口3.源文件和类文件的管理源文件和类文件的管理 虽然类文件所在的目录序列必须与包名对应,但不一定与源文件在相同的目录中。javac d d:classes Rectangle.java第39页,共44页,编辑于2022年,星期日4.4 包的创建和使用包的创建和使用第四章 java 中的对象、类、包和接口3.源文件和类文件的管理源文件和类文件的管理 说明:说明:包对应于文件系统的目录管理方式可以帮助编译器和解释器找到程序中的类和接口存放的地方。CLASSPATH指出用户的类库所在目录,在类路径(CLASSPATH)中只需指出包路径之上的顶层路径CLASSPATH=.;d:classes 第40页,共44页,编辑于2022年,星期日4.4 包的创建和使用包的创建和使用第四章 java 中的对象、类、包和接口3.源文件和类文件的管理源文件和类文件的管理 设置类路径的方法设置类路径的方法设置环境变量CLASSPATH(不推荐)set classpath=.;d:classes在调用编译器或解释器时使用-classpath选项 例 java-classpath d:classes com.taranis.grathpics.Test 见例子:包的使用.txt第41页,共44页,编辑于2022年,星期日4.5 类成员的访问控制类成员的访问控制在java语言中对类的成员有四种级别的访问控制:private,protected,public,package.如定义类时未指定访问控制说明符,则其访问控制级别为package。第四章 java 中的对象、类、包和接口问范围说明符当前类 所有子类 包内所有类 所有包中的类 private X protected X XX public X X X X package X X 第42页,共44页,编辑于2022年,星期日4.5 类成员的访问控制类成员的访问控制第四章 java 中的对象、类、包和接口例题见:访问权限.txt第43页,共44页,编辑于2022年,星期日思考问题、作业P134 编程题 6.第44页,共44页,编辑于2022年,星期日