《枚举、多态、匿名类》由会员分享,可在线阅读,更多相关《枚举、多态、匿名类(6页珍藏版)》请在金锄头文库上搜索。
1、枚举一、概述枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。二、枚举的基本应用1、通过 enum关键字定义枚举类,枚举类是一个特殊的类,每个元素都是该类的一个实例对象。2、用枚举类规定值,如上面的 WeekDay 类。以后用此类型定义的值只能是这个类中规定好的那些值,若不是这些值,编译器不会通过。3、好处:在编译时期就会发现错误,表明值不符合,减少了运行时期的错误。4、如果调用者想打印枚举类中元素的信息,需由编写此类的人定义toString 方法。注:枚举类是一个
2、class,而且是一个不可被继承的final 类,其中的元素都是类静态常量。5、常用方法:构造器:1)构造器只是在构造枚举值的时候被调用。2)构造器只有私有private,绝不允许有public 构造器。这样可以保证外部代码无法重新构造枚举类的实例。因为枚举值是public static final 的常量,但是枚举类的方法和数据域是可以被外部访问的。3)构造器可以有多个,调用哪个即初始化相应的值。非静态方法:(所有的枚举类都继承了Enum 方法)1) String toString() ;/ 返回枚举量的名称2) int ordinal() ;/ 返回枚举值在枚举类中的顺序,按定义的顺序排3
3、) Class getClass() ;/获取对应的类名4) String name();/ 返回此枚举常量的名称,在其枚举声明中对其进行声明。静态方法:1) valueOf(String e) ;/ 转为对应的枚举对象,即将字符串转为对象2) values() ;/获取所有的枚举对象元素注意:1、匿名内部类比较常用2、类的方法返回的类型可以是本类的类型3、类中可定义静态常量,常量的结果就是自己这个类型的实例对象4、枚举只有一个成员时,就可以作为一种单例的实现方式。注:1、所有的枚举都继承自java.lang.Enum 类。由于 Java 不支持多继承,所以枚举对象不能再继承其他类。2、swi
4、tch 语句支持int,char,enum 类型,使用枚举,能让我们的代码可读性更强。package cn.itheima; public class EnumDemo public static void main(String args) WeekDay weekDay=WeekDay.MON; System.out.println(weekDay);/输出枚举常量名System.out.println(weekDay.name();/输出对象名System.out.println(weekDay.getClass();/输出对应类System.out.println(weekDay.to
5、String();/输出枚举对象名System.out.println(weekDay.ordinal();/输出此对象在枚举常量的次序System.out.println(WeekDay.valueOf(“WED“);/将字符串转化为枚举常量System.out.println(WeekDay.values().length);/获取所以的枚举元素,并打印其长度 /定义枚举内部类public enum WeekDay SUN(1),MON,TUE,WED,THI,FRI,SAT;/分号可有可无,但如果下面还有方法或其他成员时,分号不能省。/而且当有其他方法时,必须在这些枚举变量的下方。/无参
6、构造器private WeekDay() System.out.println(“First“); /带参数的构造器private WeekDay(int day) System.out.println(“Second“); 多态一、多态的体现1、父类的引用指向了自己子类的对象。2、父类的引用也可以接收自己的子类对象。如: Animal a = new Cat();其中就将父类型的 a 引用指向了子类的对象。二、多态的前提1、类与类之间必须有关系,要么继承,要么实现。2、存在覆盖。父类中有方法被子类重写。 三、多态的特点1、多态中非静态成员函数的特点。- 成员函数在多态调用时,编译看左边,运行
7、看右边。2、多态中成员变量的特点无论编译和运行,都参考左边(引用变量所属的类)。如:多态中的父类引用调用成员变量时,如果父类和子类有同名的成员变量,那么被调用的是父类中的成员变量。3、多态中静态成员函数的特点无论编译和运行,都参考左边。 也就是父类引用在调用静态同名函数时,被调用的是父类中的静态函数。这是因为,当类一被加载,静态函数就随类绑定在了内存中。此时,不需要创建对象,就可以使用类名直接调用。同时,父类中的静态成员函数一般是不被复写的。类在方法区中的分配:分为静态区和非静态区,而关键字this 和 super在非静态区。/* 电脑的运行实例。电脑的运行由主板控制,假设主板只是提供电脑运行
8、,但是没有上网,听歌等功能。 而上网、 听歌需要硬件的支持。而现在主板上没有网卡和声卡,这时可以定义一个规则, 叫 PCI ,只要符合这个规则的网卡和声卡都可以在主板上使用,这样就降低了主板和网卡、声卡之间的耦合性。用程序体现。*/ / 接口 PCI interface PCI void open(); void close(); /网卡实现接口class NetCard implements PCI public void open() System.out.println(“NetCard_open“); public void close() System.out.println(“Ne
9、tCard_close“); /声卡实现接口class SoundCard implements PCI public void open() System.out.println(“SoundCard_open“); public void close() System.out.println(“SoundCard_close“); class Mainboard /电脑运行public static void run() System.out.println(“Mainboard_run“); /使用扩展功能public static void usePCI(PCI p)/PCI p =
10、new NetCard()/接口型引用指向自己的子类对象。 if(!(p=null) p.open(); p.close(); class Demo public static void main(String args) Mainboard m =new Mainboard(); /电脑运行m.run(); / m.usePCI(null); /电脑上网m.usePCI(new NetCard(); /电脑听歌m.usePCI(new SoundCard(); 内部类一、概述将一个类定义在另一个类的里面,对里面那个类就称为内部类(内置类,嵌套类)。当描述事物时,事物的内部还有事物,该事物用内
11、部类来描述。因为内部事物在使用外部事物的内容。如定义一个描述人的类,而手、心脏等都属于人,然它们又有自己的功能描述,这时可以在人这个描述类中,定义一个描述心脏的类,也就是内部类。二、内部类的访问规则1、内部类可以直接访问外部类中的成员,包括私有。之所以可以直接访问外部类中的成员,是因为内部类中持有了一个外部类的引用,格式:外部类名 .this。2、外部类要访问内部类,必须建立内部类对象。1、当内部类定义在外部类的成员位置上,而且非私有,可以在外部其他类中。可以直接建立内部类对象。格式:外部类名 .内部类名变量名 =外部类对象 .内部类对象;如:Outer.Inner in =new Outer
12、().new Inner();当内部类在外部类中的成员位置上时,可以被成员修饰符所修饰。比如:private:将内部类在外部类中进行封装。static:内部类就局部static 的特性。但是当内部类被static 修饰后,只能直接访问外部类中的 static 成员。出现了访问局限。在外部其他类中,直接访问static 内部类的非静态成员的格式为:new 外部类名 .内部类名().方法名();如: new Outer.Inner().function();在外部其他类中,直接访问static 内部类的静态成员格式为:外部类名 .内部类名 .方法名();如: Outer.Inner.functio
13、n();注意:1)当内部类中定义了静态成员时,该内部类必须是static 的。2)当外部类中的静态方法访问内部类时,内部类也必须是static 的。3)在实际应用中,内部类通常被定义为private,而很少定义为public。2、内部类定义在局部内部类定义在外部类中的某个方法中,创建了这个类型的对象时,且仅使用了一次,那么可在这个方法中定义局部类。1)不可以被成员修饰符修饰。如public、private、static 等修饰符修饰。它的作用域被限定在了声明这个局部类的代码块中2)可以直接访问外部类中的成员,因为还持有外部类中的引用。注意:内部类不可以访问它所在的局部中非最终变量。只能访问被f
14、inal 修饰的局部变量。四、匿名内部类1、匿名内部类其实就是内部类的简写格式。2、定义匿名内部类的前提:内部类必须是继承一个类或者实现接口。特殊情况:因为所以的类都有一个父类Object,所以在定义时也可以用Object。3、匿名内部类的格式:new 父类或者接口 () 定义子类的内容4、其实匿名内部类就是一个匿名子类对象。可以理解为带内容的对象。5、匿名内部类中定义的方法最好不要超过3 个。匿名内部类的利与弊:好处:简化书写弊端: 1、不能直接调用自己的特有方法、2、不能做强转动作。3、 如果继承的父类或接口中有很多方法时,使用匿名内部类阅读性会非常差,且调用会很麻烦。所以匿名内部类中定义的方法有一般不超过3 个。