欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    【教学课件】第9章类的高级特性.ppt

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

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

    【教学课件】第9章类的高级特性.ppt

    第9章 类的高级特性,本章要点,掌握抽象类的使用掌握内部类的分类掌握成员/局部/匿名/静态内部类的使用掌握内部类的继承了解Class类与Java反射,第9章 类的高级特性,9.1 抽象类9.2 内部类9.3 Class类与java反射,主要内容,9.1 抽象类,所谓抽象类就是只声明方法的存在而不去具体实现它的类。抽象类不能被实例化,也就是不能创建其对象在定义抽象类时,要在关键字class前面加上关键字abstract。定义抽象类,格式如下所示:abstract class 类名 类体,9.1 抽象类,在抽象类中创建的,没有实际意义的,必须要子类重写的方法称为抽象方法。抽象方法只有方法的声明,而没有方法的实现,用关键字abstract进行修饰。声明一个抽象方法的基本格式如下所示:,abstract 方法名(参数列表);,9.1 抽象类,包含一个或多个抽象方法的类必须被声明为抽象类。抽象类中既可以有抽象方法,也可以有一般的成员方法。抽象方法不能使用private、static和final关键字进行修饰。抽象类主要用来派生子类,在子类中应实现抽象类所有抽象方法,如果子类中仍有未实现的抽象方法,则子类必须声明为抽象类。,abstract class Telphone public abstract void call();public abstract void message();class CellPhone extends Telphone Override public void call()System.out.println(通过键盘打电话);Override public void message()System.out.println(通过键盘发短信);,class SmartPhone extends Telphone Override public void call()System.out.println(通过语音打电话);Override public void message()System.out.println(通过语音发短信);,public class Initial public static void main(String args)Telphone tel1=new CellPhone();tel1.call();tel1.message();Telphone tel2=new SmartPhone();tel2.call();tel2.message();,通过键盘打电话通过键盘发短信通过语音打电话通过语音发短信,public abstract class Animal protected String type;protected String name;public Animal(String type,String name)this.type=type;this.name=name;public String toString()return type+name;public abstract void sound();,public class Cat extends Animal public Cat(String name)super(Cat,name);public void sound()System.out.println(miaomiao);,public class Dog extends Animal public Dog(String name)super(Dog,name);public void sound()System.out.println(WangWang);,public class Test public static void main(String args)Animal a=new Dog(dd),new Cat(cc);for(int i=0;ia.length;i+)System.out.print(ai+);ai.sound();,Dog dd WangWangCat cc miaomiao,9.2 内部类,9.2.1 成员内部类9.2.2 局部内部类9.2.3 匿名内部类9.2.4 静态内部类,9.2 内部类,Java中类可以嵌套定义,即在一个类定义中,还可以嵌套另外一个类的定义,被嵌套的类称为内部类。没有嵌套在任何类中的类被称为顶层类。,9.2.1 成员内部类,1)如果内部类没有被声明为静态的,则不能含有静态成员。2)内部类也是一种类成员。若该内部类没有用声明为private,则在外部类外引用它,需要给出完整的类名称:外部类名.内部类名。3)外部类中可以直接引用内部类名称创建类对象,但如果在该外部类之外,即使具有引用内部类权限,也要首先创建一个外部类对象,才能借助于该对象创建内部类的对象。,9.2.1 成员内部类,9.2.1 成员内部类,在内部类中可以随意使用外部类的成员方法以及成员变量,即使这些类成员为private。但内部类的成员只有在内部类的范围内访问,不能直接被外部类使用。,public class OuterClass InnerClass in=new InnerClass();public void ouf()in.inf();/在外部类方法中调用内部类方法 class InnerClass InnerClass()/内部类构造方法 public void inf()/内部类成员方法 int y=0;/定义内部类成员变量 public InnerClass doIt()/y=4;/外部类不可以直接访问内部类成员变量 in.y=4;return new InnerClass();/返回内部类引用 public static void main(String args)OuterClass out=new OuterClass();OuterClass.InnerClass in=out.doIt();,【例9-2】,9.2.1 成员内部类,内部类的实例一定要绑定在外部类的实例上,如果在外部类中初始化一个内部类对象,那么内部类对象就会绑定在外部类对象上。内部类初始化方式与其他类初始化方式相同,都是使用new关键字。,public class myapp public static void main(String args)OutClass out=new OutClass();out.create();OutClass.InClass outin=out.new InClass();(外部类外:);outin.f();class OutClassint n;class InClassvoid f()System.out.println(n:+(+n);void create()InClass in=new InClass();(外部类中:);in.f();,外部类中:n:1外部类外:n:2,9.2.1 成员内部类,2)使用this关键字获取内部类与外部类的引用如果在外部类中定义的成员变量与内部类的成员变量名称相同,可以使用this关键字。,9.2.1 成员内部类,【例9-3】在项目中创建TheSameName类,在类中定义成员变量x,定义一个内部类Inner,并在内部类中也创建x变量,在内部类的doIt()方法中分别操作两个x变量,代码如下所示。,public class TheSameName private int x;private class Inner private int x=9;public void doit(int x)x+;this.x+;+;,9.2.2 局部内部类,局部内部类就是在类的方法中定义的内部类,它的作用范围也是在这个方法体内,在这个方法体之外不能访问该内部类,但该内部类可以访问当前代码块的常量以及此外部类的所有成员。,9.2.2 局部内部类,【例9-4】在外部类的sell()方法中创建Apple局部内部类,然后创建该内部类的实例,并调用其定义的price()方法输出单价信息。,9.2.3 匿名内部类,在编写程序代码时,不一定要给内部类取一个名字,可以直接以对象名来代替。匿名内部类的所有实现代码都需要在大括号之间进行编写。匿名内部类的语法如下所示:return new A()./内部类体;A:对象名,9.2.3 匿名内部类,由于匿名内部类没有名称,所以匿名内部类使用默认构造方法来生成匿名内部类的对象。在匿名内部类定义结束后,需要加分号标识,这个分号并不是代表定义内部类结束的标识,而是代表创建匿名内部类的引用表达式的标识。,9.2.3 匿名内部类,匿名内部类由于没有名字,所以它的创建方式有点儿奇怪。创建格式如下:new 父类构造器(参数列表)|实现接口()/匿名内部类的类体部分,abstract class Person public abstract void eat();class Child extends Person public void eat()System.out.println(eat something);public class Demo public static void main(String args)Person p=new Child();p.eat();,【匿名内部类例1】,abstract class Person public abstract void eat();public class Demo public static void main(String args)Person p=new Person()public void eat()System.out.println(eat something);p.eat();,【匿名内部类例1】,abstract class Bird private String name;public String getName()return name;public void setName(String name)this.name=name;public abstract int fly();,【匿名内部类例2】,public class Test public void test(Bird bird)System.out.println(bird.getName()+bird.fly();public static void main(String args)Test test=new Test();test.test(new Bird()public int fly()return 10000;public String getName()return 大雁;);,【匿名内部类例2】,9.2.4 静态内部类,在内部类前添加修饰符static,这个内部类就变为静态内部类。一个静态内部类中可以声明static成员,但是在非静态内部类中不可以声明静态成员。静态内部类不可以使用外部类的非静态成员。,9.2.4 静态内部类,静态内部类具有以下两个特点:创建静态内部类的对象,不需要其外部类的对象。不能从静态内部类的对象中访问非静态外部类的对象。,9.2.4 静态内部类,【例9-6】在静态内部类中定义main()方法,并访问内部类中的方法。,public class StaticInnerClassDemo static int x=100;static class Inner static void doitInner()(外部类的成员变量+x);public static void main(String args)doitInner();/访问内部类的方法,补充:泛型,泛型是将不同类型对象的同一种操作加以抽象、封装,使其享有更广泛的代码重用性。在JDK1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,其缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。,public class ArrayList private Object element;public Object get(int index)return elementindex;public void add(Object obj),ArrayList list=new ArrayList();list.add(Hello);String str=(String)list.get(0);/需要强制类型转换Integer value=(Integer)list.get(0);/不检查类型错误,补充:泛型,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,Java语言引入泛型的好处是安全简单。泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。,补充:泛型,声明包含泛型的类的格式如下:访问修饰符 class 类名 泛型1 泛型成员1;泛型2 泛型成员2;/.声明中的泛型1、泛型2等泛型符号可以是任意合法的Java标识符。,补充:泛型泛型类的声明示例,public class Generic private T f;/f为泛型成员 public void setF(T f)/参数类型为泛型T this.f=f;public T getF()/返回类型为泛型T return f;,补充:泛型泛型类的实例化,Generic f1=new Generic();Generic f2=new Generic();f1.setF(new Boolean(true);Boolean b=f1.getF();System.out.println(b);f2.setF(new Integer(10);Integer i=f2.getF();System.out.println(i);,补充:泛型泛型类的实例化,泛型类实例化时,并不一定要指明泛型对应的实际类型,此时会使用Object作为泛型的默认类型编译时编译器会发出警告,Generic f3=new Generic();f3.setF(new Boolean(false);System.out.println(f3.getF();,补充:包含多个泛型的类定义,public class Generic2 private T1 f1;private T2 f2;/.,Generic f=new Generic();Generic f1=new Generic();,补充:泛型类实例之间的赋值,同一泛型类,如果实例化时给定的实际类型不同,则这些实例的类型是不兼容的,不能相互赋值。,Generic f1=new Generic();Generic f2=new Generic();f1=f2;/发生编译错误,补充:泛型中Object类型兼容性,Object是所有类的父类,因此,所有的类型的实例都可赋值给声明为Object类型的变量在实例化泛型类时,将泛型指定为Object类型却不存在着和其他类型之间的兼容性:,Generic f1=new Generic();Generic f2=new Generic();Generic f=f1;f=f2;,补充:泛型通配字符,泛型类实例之间的不兼容性会带来使用的不便。使用泛型通配符(?)声明泛型类的变量可以解决这个问题,Generic f1=new Generic();Generic f2=new Generic();Generic f3=new Generic();Generic f;f=f1;/OKf=f2;/OKf=f3;/OK,泛型默认类型的实例类型兼容性,实例化泛型类时采用默认泛型类型,此时泛型类的实例和其他给定类型的泛型类实例之间存在着类型兼容性,可以直接相互赋值。,Generic f1=new Generic();Generic f2=new Generic();Generic f=new Generic();/默认泛型类型f=f1;/OKf=f2;/OKf1=f;/OKf2=f;/OK,public class Test private T a;public Test()a=null;public Test(T a1)a=a1;public T getA()return a;public void setA(T a1)a=a1;,Test inttest=new Test(new Integer(10);Integer b;b=inttest.getA();System.out.println(b);,Test strtest=new Test(Hello);String s;s=strtest.getA();System.out.println(s);,注意:Test是错误的,因为在实例化泛型类时不允许带入基本数据类型。,9.3 Class类与java反射,9.3.1 获得class类对象9.3.2 获得修饰符9.3.3 访问构造函数9.3.4 访问成员变量9.3.5 访问成员方法,9.3 Class类与java反射,JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。,9.3.1 获得class类对象,在Java的反射中,核心类是Class类,其实例表示运行中的Java应用的类和接口,它也是所有反射API的入口。通常有5种方式可以获得Class对象:1)Object.getClass()2).class语法3)Class.forName()4)包装类的TYPE域5)以Class为返回值的方法,9.3.1 获得class类对象,1)Object.getClass():如果一个类的对象可用,获得Class的方法是使用Object.getClass()。(只对引用类型有用),Date date1=new Date();Date date2=new Date();Class c1=date1.getClass();Class c2=date2.getClass();System.out.println(c1.getName();System.out.println(c1=c2);,9.3.1 获得class类对象,2).class语法:如果类型可用但没有对象则可以在类型后加上“.class”来获得Class对象。(原始类型常用),Class clazz=String.class;System.out.println(clazz.getName();,9.3.1 获得class类对象,3)Class.forName():如果知道类的全名,则可以使用静态方法Class.forName()来获得Class对象。不能用在原始类型上,但可以用在原始类型数组上。注意:Class.forName()会抛出ClassNotFoundException异常。,9.3.1 获得class类对象,4)包装类的TYPE域:每个原始类型和void都有包装类。利用其TYPE域就可以获得Class对象。5)以Class为返回值的方法:请参考相关API文档。在获得Class类对象之后,就可以使用该类中提供的方法获得关于类的各种信息,例如构造方法、成员变量、成员方法、内部类等。,(第1种方法:Object.getClass();Class c1=new Date().getClass();System.out.println(c1.getName();(第2种方法:.class语法);Class c2=boolean.class;System.out.println(c2.getName();(第3种方法:Class.forName();Class c3=”);System.out.println(c3.getName();(第4种方法:包装类的TYPE域);Class c4=Double.TYPE;System.out.println(c4.getName();,9.3.2 获得修饰符,通过类可以解析出getModifiers()方法的返回值所表示的修饰符信息,在该类中提供了一系列用来解析的静态方法,既可以查看是否被指定的修饰符修饰,还可以以字符串的形式获得所有修饰符。,表9-1 Modifier类中的常用静态方法,9.3.2 获得修饰符,9.3.2 获得修饰符,下面用成员变量(Field)来举例说明如何获得修饰符,类以及方法的修饰符获取与成员变量是一样的。,public class MyTest public int a;public static int b;public static final int c=0;private int d;public static void main(String args)Class clazz=MyTest.class;Field fields=clazz.getDeclaredFields();for(Field field:fields)System.out.println(field.getName();,9.3.2 获得修饰符,想知道每个变量的带有哪些修饰符,或者是不是包含某个修饰符。先看下Member接口:Member表示一个类中的成员,包括成员变量、方法、构造方法三种实现。Member接口有个方法:int getModifiers()整数返回由此 Member所表示的成员或构造方法的 Java语言修饰符,public class MyTest public int a;public static int b;public static final int c=0;private int d;public static void main(Stringargs)Class clazz=MyTest.class;Field fields=clazz.getDeclaredFields();for(Field field:fields)System.out.print(field.getName()+-);System.out.println(field.getModifiers();,9.3.2 获得修饰符,通过返回的int类型的值,还是很难判断这些变量有哪些修饰符。在这里,需要用到这个类。Modifier提供了很多静态方法。如public static String toString(int mod)就可以输出该整数对应的所有的修饰符。public static boolean isPublic(int mod)可以判断该整数对应的是不是包含public修饰符,public class MyTest public int a;public static int b;public static final int c=0;private int d;public static void main(String args)Class clazz=MyTest.class;Field fields=clazz.getDeclaredFields();for(Field field:fields)System.out.print(field.getName()+-);System.out.println(Modifier.toString(field.getModifiers();,9.3.3 访问构造函数,在Java反射中,使用Constructor类表示类中定义的构造方法。在Class类中定义了多个访问构造方法的方法。,表9-2 Class类中定义的访问构造方法的方法,9.3.4 访问成员变量,在Java反射中,使用Field类表示类中定义的成员变量。在Class类中定义了多个访问成员变量的方法。,表9-3Class类中定义的访问成员变量的方法,9.3.5 访问成员方法,在Java反射中,使用Method类表示类中定义的成员方法。在Class类中定义了多个访问成员方法的方法。,表9-4Class类中定义的访问成员方法的方法,

    注意事项

    本文(【教学课件】第9章类的高级特性.ppt)为本站会员(牧羊曲112)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

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




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开