欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    第六章 面向对象编程进阶.ppt

    • 资源ID:70746668       资源大小:1.05MB        全文页数:108页
    • 资源格式: PPT        下载积分:16金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要16金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    第六章 面向对象编程进阶.ppt

    Java语言程序设计安徽工业大学现代教育技术中心张小银 第六章 面向对象编程进阶 本章学习目标:1、包2、继承3、访问控制4、方法重写、重载5、多态性6、关键字super、static、final包为便于管理大型软件系统中数目众多的类,解决类的命名冲突问题,Java引入包(package)机制,提供类的多重命名空间。package语句1)package语句作为Java源文件的第一条语句,批明了该文件中定义的类所在的包。(若缺省该语句,则指定为无名包)。2)语法格式:package pkg1.pkg2.pkg3;/3)用法举例:例 61 创建包package p1;public class Testpublic void display()System.out.println(in method display();编绎和生成包1)Java编绎器把包对应于文件系统的目录管理,package语句中,用”.”来指明包(目录)的层次;2)如果在程序Test.java中已定义了包pl,编绎时采用javac Test.java 则编绎器会在当前目录下生成Test.class文件,再在适合位置(destpath目录)手动创建一个名为pl的子目录 javac d destpath Test.java 则编绎器会自动在destpath目录下建立一个子目录pl,并将生成的.class文件都放到destpath/pl下。import语句1)为使用定义在不同包中的Java类,需用import语句来引入所需要的类。2)语法格式:import pkg1.pkg2.(classname|*);3)用法举例:例 62 导入和使用有名包中的类 Test.java:package p1;public class Test public void m1()System.out.println(In class Test,method m1 is running!);TestPackage.java:import p1.Test;/或 import p1.*;public class TestPackage public static void main(String args)Test t=new Test();t.m1();例 63 导入同一个包中的类 A.java:package mz;public class A public void ma()System.out.println(in class A);B.java:package mz;public class Bpublic void mb()A a=new A();a.ma();相关说明由于JDK的java.lang包中的类经常被用到,如String类、System类等,编绎器在编绎.java源文件时自动为我们引入了java.lang包,因此不必显示引入就可该包中的类,而要使用JDK其它包中的类,则必须使用import语句显示引入。参见例313和例57等。JDK类库中的类数目众多并以Java归档文件(后缀为.jar)形式存在,主要包括:”JDK_HOMElibdt.jar”、”JDK_HOMElibtools.jar”等。其中主要的Java系统类均包含在rt.jar文件中(可解压后查看其中包含的.class文件)。这些.jar文件在编绎和运行时被系统自动搜索,不必显式引入。Java包特性 1)一个类如果未声明为public的,则只能在其所在包中被使用,其它包中的类即使在源文件中使用import语句也无法引用它。2)可以不在源文件开头使用import语句导入要使用的有名包中的类,而是在程序代码中每次用到该类时都给其完整的包层次,例如:public class TestPackage public static void main(String args)p1.Test t=new p1.Test();/每次用到时给出包层次 t.m1();例 64 使用打包的应用程序类 package p1;public class Test public static void main(String args)System.out.println(haha!);JDK中主要的包介绍继承(1)继承(Inheritance)是面向对象编程的核心机制之一,其本质是在已有类型基础之上进行扩充或改造,得到新的数据类型,以满足新的需要。提高程序的复用性。根据需要定义Java类描述“人”和“学生”信息:public class Person public String name;public int age;public Date birthDate;public String getInfo()public class Student public String name;public int age;public Date birthDate;public String school;public String getInfo()通过继承,简化Student类的定义:public class Student extends Person public String school;继承(2)1)Java类声明语法格式:classextends 2)Object类是所有Java类的最高层父类,如果在类的声明中未使用extends关键字指明其父类,则默认父类为Object类。(单继承)public class Person 等价于:public class Person extends Object 继承(3)Java只支持单继承,不允许多重继承。一个子类只能有一个父类 一个父类可以派生出多个子类多重继承:是指一个类可以同时继承多个直接父类,这可能导致子类成员在追溯上的不确定性。例 65 单独定义结构相近的Java类 Person.java:public class Personprivate String name;private int age;public void setName(String name)this.name=name;public String getName()return name;public void setAge(int age)this.age=age;public int getAge()return age;public String getInfo()return Name:+name+tAge:+age;Student.java:public class Studentprivate String name;private int age;private String school;public void setName(String name)this.name=name;public String getName()return name;public void setAge(int age)this.age=age;public int getAge()return age;public void setSchool(String school)this.school=school;public String getSchool()return school;public String getInfo()return Name:+name+tAge:+age;例 66 通过继承创建新的Java类Person.java:public class Personprivate String name;private int age;public void setName(String name)this.name=name;public String getName()return name;public void setAge(int age)this.age=age;public int getAge()return age;public String getInfo()return Name:+name+tAge:+age;Student.java:public class Student extends Personprivate String school;public void setSchool(String school)this.school=school;public String getSchool()return school;Soldier.java:public class Soldier extends Personprivate String type;/军兵种,如陆军/海军/空军等public void setType(String type)this.type=type;public String getType()return type;Test.java:public class Testpublic static void main(String args)Student s=new Student();s.setName(Tom);s.setAge(18);s.setSchool(THU);System.out.println(s.getInfo()+nSchool:+s.getSchool();运行结果:Name:Tom Age:18School:THU类之间的关系(了解)1、依赖关系 依赖(Dependency)关系是指一个类的方法中使用到了另一个类的对象,称前者依赖后者。2、聚合关系 聚合(Aggregation)关系是指一个类的对象包含(通过属性引入)了另一个类的对象。3、泛化关系 泛化(Generalization)关系是指类之间的继承关系(如类和接口之间的实现关系,以及接口之间的继承关系)。访问控制1)访问控制是指对Java类或类中成员的操作进行限制,即规定其在多大的范围内可以被直接访问。以避免被滥用。2)类的访问控制 public的类可在任意场合被引入和使用,而非public的类只能在其所在包中被使用。(private、protected不允许修饰顶级类)3)类中成员的访问控制应用举例:若上述两个类放在不同的包中,有两处是非法的。例 67 使用protected成员 A.java:package p1;public class Apublic int m=5;protected int n=6;B.java:package p2;import p1.A;public class B extends Apublic void mb()m=m+1;/合法,等价于 this.m=this.m+1;n=n*2;/合法,等价于 this.n=this.n*2;public static void main(String args)B b=new B();b.m=7;/合法b.n=8;/合法A a=new A();a.m=9;/合法a.n=10;/非法 方法重写 1)什么是方法重写?在子类中可以根据需要对从父类中继承来的方法进行重新定义,此称方法重写(Override)或覆盖。2)语法规则:重写方法必须和被重写方法具有相同的方法名称、参数列表和返回值类型;重写方法不能使用比被重写方法更严格的访问权限;/不能更私有。重写方法不允许声明抛出比被重写方法范围更大的异常类型。例 68 方法重写Person.java:public class Person String name;int age;public String getInfo()return Name:+name+t+age:+age;Student.java:public class Student extends Person String school;public String getInfo()return Name:+name+tAge:+age+tSchool:+school;Test.java:public class Testpublic static void main(String args)Person p=new Person();p.name=Tom;p.age=18;System.out.println(p.getInfo();Student s=new Student();s.name=Billy;s.age=34;s.school=THU;System.out.println(s.getInfo();运行结果:Name:Tom age:18Name:Billy Age:34 School:THU同名属性 例 6-9 使用同名属性 Test.java:class Personint age=5;public int getAge()return age;public int getInfo()return age;class Student extends Personint age=6;public int getAge()return age;public class Testpublic static void main(String args)Person p=new Person();System.out.println(p.getAge();/返回5Student s=new Student();System.out.println(s.age);/返回6System.out.println(s.getAge();/返回6System.out.println(s.getInfo();/返回5 从父类中继承来关键字super在存在命名冲突(子类中存在方法重写或添加同名属性)的情况下,子类中的代码将自动使用子类中的同名属性或重写后的方法。可以在子类中使用关键字super引用父类中的成份:1)访问父类中定义的属性:super.2)调用父类中定义的成员方法:super.()3)子类构造方法中调用父类的构造方法(见后面)4)Super的追溯不仅于直接父类例 610 使用super引用父类成员 Test.java:class Animalprotected int i=1;/用于测试同名属性,无现实意义class Person extends Animalprotected int i=2;/用于测试同名属性,无现实含义private String name=Tom;private int age=9;public String getInfo()return Name:+name+tAge:+age;public void testI()System.out.println(super.i);System.out.println(i);class Student extends Personprivate int i=3;private String school=THU;public String getInfo()/重写方法return super.getInfo()+tSchool:+school;public void testI()/重写方法System.out.println(super.i);System.out.println(i);public class Testpublic static void main(String args)Person p=new Person();System.out.println(p.getInfo();p.testI();Student s=new Student();System.out.println(s.getInfo();s.testI();运行结果:Name:TomAge:912Name:TomAge:9School:THU23多态性(1)1)多态在Java中,子类的对象可以替代父类的对象使用。2)Java引用变量与所引用对象间的类型匹配关系:一个对象只能属于一种确定的数据类型,该类型自对象创建直至销毁不能改变。一个引用类型变量可能引用(指向)多种不同类型的对象既可以引用其声明类型的对象,也可以引用其声明类型的子类的对象。Person p=new Student();/Student是Person的子类例 611 多态性使用举例1Person.java:public class Personprivate String name;private int age;public void setName(String name)this.name=name;public String getName()return name;public void setAge(int age)this.age=age;public int getAge()return age;public String getInfo()return Name:+name+tAge:+age;Student.java:public class Student extends Personprivate String school;public void setSchool(String school)this.school=school;public String getSchool()return school;public String getInfo()/重写方法 return super.getInfo()+tSchool:+school;Test.java:import java.util.*;public class Testpublic static void main(String args)Person p=new Student();/p指向student类型的对象 System.out.println(p.getInfo();/调用student类型对象中的方法Object o=Hello;o=new Date();o=new Person();o=new Student();运行结果:Name:nullAge:0School:null多态性(2)1)引用类型数组元素相当于引用类型变量,多态性也同样适用:Person p=new Person 3;/假定Student类继承了Person类,p0=new Student();/Graduate类继承了Student类p1=new Person();p2=new Graduate();2)一个引用类型变量如果声明为父类的类型,但实际引用的是子类对象,那么该变量就不能再访问子类中添加的属性和方法。Student m=new Student();m.setSchool(“pku”);/合法 Person e=new Student();e.setSchool(“pku”);/非法例 612 多态性使用举例2Person.java:public class Personprivate String name;private int age;public void setName(String name)this.name=name;public String getName()return name;public void setAge(int age)this.age=age;public int getAge()return age;public String getInfo()return Name:+name+tAge:+age;Student.java:public class Student extends Personprivate String school;public void setSchool(String school)this.school=school;public String getSchool()return school;Test.java:public class Testpublic void show(Person p)/System.out.println(p.getInfo();public static void main(String args)Test t=new Test();Person p=new Person();t.show(p);Student s=new Student();t.show(s);/show()方法形参声明为Person类型,而调用时既可运行结果:/Person类型也可以是Student类型,这样就不必为Name:nullAge:0 /相关的每一种类型单独声明一个处理方法,提高了Name:nullAge:0 /代码的可用性。虚方法调用1)正常的方法调用 Person p=new Person();p.getInfo();Student s=new Student();s.getInfo();2)虚方法调用(Virtual Method Invocation)Person e=new Student();/父类的类型指向子类的对象 e.getInfo();/调用子类中重写的方法;/若子类没有此方法,则是调用父类的方法3)编绎时类型和运行进类型 /e编绎时是Person类型,运行时是Student类型例 613 虚方法调用举例Book.java:public class Bookprivate String name;private double price;public void setName(String name)this.name=name;public String getName()return name;public void setPrice(double price)this.price=price;public double getPrice()return price;public void show()System.out.println(BookName:+name+nPrice:+price);Novel.java:public class Novel extends Bookprivate String author;public void setAuthor(String author)this.author=author;public String getAuthor()return author;public void show()super.show();System.out.println(Author:+author);Test.java:public class Testpublic static void main(String args)System.out.println(正常方法调用);Test t=new Test();Book b=new Book();b.setName(English Language);b.setPrice(43);t.process(b);System.out.println(虚方法调用);Novel v=new Novel();v.setName(Great Expectations);v.setPrice(35.48);v.setAuthor(Charles Dickens);t.process(v);/实参是Book的子类Novelpublic void process(Book b)/其它代码b.show();运行结果:正常方法调用BookName:English LanguagePrice:43.0虚方法调用BookName:Great ExpectationsPrice:35.48Author:Charles Dickens多态性举例(3)方法声明的参数类型为父类类型,可以使用子类的对象作为实参调用该方法:public class Testpublic void show(Person p)/System.out.println(p.getInfo();public static void main(String args)Test t=new Test();Person p=new Person();t.show(p);Student s=new Student();t.show(s);对象造型(Casting)引用类型数据值之间的强制类型转换称为造型,具体规则如下:1)从子类到父类的类型转换可以自动进行:Person p=new Student();2)在多态的情况下,从父类到子类的类型转换必须通过造型(强制类型转换)实现:Person p1=new Student();Student s1=(Student)p1;/合法 Person p2=new Person();Student s2=(Student)p2;/非法3)无继承关系的引用类型间的转换是非法的。String s=“Hello,World”;Person p=(Person)s;/非法例 614 对象造型举例Person.java:public class Personprivate String name;private int age;public void setName(String name)this.name=name;public String getName()return name;public void setAge(int age)this.age=age;public int getAge()return age;public String getInfo()return Name:+name+tAge:+age;Student.java:public class Student extends Personprivate String school;public void setSchool(String school)this.school=school;public String getSchool()return school;Test.java:public class Testpublic void cast(Person p)/p=new Person();/System.out.println(p.getSchool();/非法,编绎出错Student stu=(Student)p;/p1System.out.println(stu.getSchool();public static void main(String args)Test t=new Test();Student s=new Student();s.setSchool(THU);t.cast(s);/实参是子类对象instanceof操作符操作符instanceof用于检测一个对象的真正类型。例 615 使用instanceof操作符Test.java:class Person/class Student extends Person/;class Graduate extends Student/;class Tool public void distribute(Person p)if(p instanceof Graduate)Graduate g=(Graduate)p;/System.out.println(处理Graduate类型及其子类类型对象!);else if(p instanceof Student)System.out.println(处理Student类型及其子类类型对象!);else System.out.println(处理Person类型及其子类类型对象!);public class Testpublic static void main(String args)Tool t=new Tool();Student s=new Student();t.distribute(s);协变返回类型(JDK5后)(略不讲)协变返回类型重写方法时修改其返回值的类型,但必须是重写前方法返回值类型的子类或实现类类型。例 616 协变返回类型用法举例(略)方法重载在一个类中存在多个同名方法的情况称为方法重载(Overload),方法重载参数列表必须不同。例 617 方法重载举例TestOverLoad.java:class Toolpublic void display(int i)System.out.println(输出整数:+i);public void display(double d)System.out.println(输出符点数:+d);public void display(String s)System.out.println(输出文本:+s);public class TestOverLoadpublic static void main(String args)Tool t=new Tool();t.display(3);t.display(3.14);t.display(Hello,你好!);运行结果:输出整数:3输出符点数:3.14输出文本:Hello,你好!例 618 比较方法重写与重载(略)Test.java:class Apublic void m1(int i)System.out.println(Method m1 in class A,the value is +i);public void m2(int j)System.out.println(Method m2 in class A:+j);class B extends Apublic void m1(double d)System.out.println(重载方法 m1,数据值为:+d);public void m2(int k)System.out.println(重写方法m2,数据值为:+k);/*public int m1(int m)/非法,既非重载、亦非重写System.out.print(haha!);*/public class Testpublic static void main(String args)B b=new B();b.m1(3);b.m1(3.14);b.m2(5);构造方法重载例 6-19 构造方法重载举例Person.java:public class Personprivate String name;private int age;public Person()public Person(String name)this.name=name;public Person(int age)this.age=age;public Person(String name,int age)this.name=name;this.age=age;/其它成份this调用重载构造方法 可以在构造方法的第一行使用关键字this 调用其它(重载的)构造方法。例 620 使用this调用重载构造方法Person.java:public class Personprivate String name;private int age;public Person(String name,int age)this.name=name;this.age=age;public Person(String name)this(name,18);/调用另外构造方法public Person(int age)this(Anonymous,age);public void showInfo()System.out.println(Name:+name+tage:+age);/例 621 重载方法的多重匹配举例(略)public class Testpublic void m1(int i)System.out.println(int data:+i);public void m1(double d)System.out.println(double data:+d);public static void main(String args)Test t=new Test();t.m1(3);t.m1(3.14);byte b=12;t.m1(b);例 622 重载方法匹配多义性举例(略)public class Testpublic void m1(int i,double d)System.out.println(int double!);public void m1(double d,int i)System.out.println(double int);public static void main(String args)Test t=new Test();t.m1(3,4.0);t.m1(4.0,3);t.m1(3,4);/编译出错深究对象构造/初始化在Java类的构造方法中一定直接或间接地调用了其父类的构造方法(Object类除外)。1)在子类的构造方法中可使用super语句调用父类的构造方法,其格式为:super();2)如果子类的构造方法中既没有显式地调用父类构造方法,也没有使用this关键字调用同一个类的其它构造方法,则系统会默认调用父类无参数的构造方法,其格式为:super();3)如果子类构造方法中既未显式调用父类构造方法,而父类中又没有无参的构造方法,则编绎出错。super调用构造方法例 623 使用super关键字调用父类构造方法Person.java:public class Personprivate String name;private int age;public Person(String name,int age)this.name=name;this.age=age;public Person(String name)this(name,18);public Person(int age)this(Anonymous,age);public void showInfo()System.out.println(Name:+name+tage:+age);Student.java:public class Student extends Personprivate String school;public Student(String name,int age,String school)super(name,age);this.school=school;public Student(String name,String school)super(name);this.school=school;public Student(String name,int age)this(name,age,null);public Student(String school)/编绎出错,父类没有无参的构造方法/super();this.school=school;Test.java:public class Testpublic static void main(String args)Student t=new Student(Tom,18,THU);t.showInfo();对象构造/初始化细节(P155)第一阶段:为新建对象的实例变量分配存储空间并进行默认初始化第二阶段:按下述步骤继续初始化实例变量1)绑定构造方法参数;2)如有this()调用,则调用相应的重载构造方法,然后跳转到步骤5;3)显式或隐式追溯调用父类的构造方法(Object类除外);4)进行实例变量的显式初始化操作;5)执行当前构造方法的方法体中其余的语句。关键字static1)在Java类中声明属性、方法和内部类时,可使用关键字static作为修饰符。2)static标记的属性或方法由整个类(所有实例)共享,

    注意事项

    本文(第六章 面向对象编程进阶.ppt)为本站会员(hyn****60)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开