第4章_Java面向对象高级特性

上传人:gu****n 文档编号:243147426 上传时间:2024-09-16 格式:PPT 页数:40 大小:786.50KB
返回 下载 相关 举报
第4章_Java面向对象高级特性_第1页
第1页 / 共40页
第4章_Java面向对象高级特性_第2页
第2页 / 共40页
第4章_Java面向对象高级特性_第3页
第3页 / 共40页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,2024/9/16,1,第四章,Java,面向对象高级特性,2024/9/16,2,本章要点,Static,、,final,关键字,抽象类,接口,包,内部类,访问控制,其它,2024/9/16,3,4,.1 static,关键字,用,static(,静态的,),修饰的变量或方法又称为,类变量,和,类方法,。,类变量(静态变量),在成员变量声明时使用,static,关键字。,注意点:,类变量只在,系统加载其所在类时分配空间并,初始化,,实例化对象时不再分配空间,所有,实例对象将共享类的静态变量。,用途 可以用来在实例对象之间进行通信,复习 变量:描述对象的属性,成员变量,:类的变量定义部分所定义的变量,:,实例成员变量,类成员变量,:,前面加,static,2024/9/16,6,类似于其他语言中的全局变量,可以用类,名直接调用。,如:,Count.counter,例,1,double d = Math.,PI;,类名,Static,变量,2024/9/16,7,注意点,(,见,Hello.static.java),静态方法只能访问方法体内定义的局部变量、自己的参数和静态变量。(,因静态方法不是通过调用对象实例,故在静态方法中没有,this,指针,),子类不重写(覆盖)父类的静态方法,而是隐藏,不能将非静态方法重写为静态的方法,反之亦然。,main(),是一个静态方法,是程序的入口点,可以使,JVM,不创建实例对象就可以运行方法。,2024/9/16,8,静态初始化程序,类中不属于任何方法体中,并以,static,关键字修饰的语句块。,如:,static,I=5;,System.out.println(,“,Static,code:I=,”,+I+) ;,注意,静态语句块只在加载类时执行一次,通常用来,进行类成员变量的初始化。,2024/9/16,9,4.2 final,关键字,在,Java,中,可以用,final,关键字声明类、成员,方法、成员变量。,被定义成,final,的类,不能再派生子类如:,Java.lang.String,为一个,final,类。,被定义为,final,的方法,不能重写,优点是在运行时进行效率优化。,(,举例,),被定义为,final,的变量,只能被赋值一次,常,用来定义常量,变量名一般大写。,2024/9/16,10,4.3,abstract,关键字,abstract,方法 只有定义而没有方法体的方法。,abstract,类 包含一个或多个抽象方法的类。,定义抽象类的格式为:,abstract class,抽象类名,注意点,抽象类不能实例化。可派生子类,在子类中,具体定义方法的功能,。,抽象类可以没有抽象方法,这样是为了禁止创建实例,2024/9/16,11,目的是为一类对象建立抽象的模型,在同类对象所对应的体系中抽象类往往位距顶层。,使类的设计变的清晰、支持多态、为类的体,系提供通用的接口。,2024/9/16,12,Employee e=new Manager(); /,正确,Employee e=new Employee(); /,错误,abstract class Employee,abstract void raiseSallory(int i);/,没有,直接以分号结尾,Class Manager extends Employee,/,若子类没有实现抽象方法,,,void raiseSallory(int i),;,/,那么子类也必须是抽象的,接口用关键字interface来定义的,Java,中的接口是一系列方法的声明,是一些方法特征的集合,,一个接口只有方法的特征没有方法的实现,,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能),接口是客户端代码与提供服务的类之间的“规约”。,接口是抽象类的变体。,接口中的所有方法都是抽象的,没有一个有程序体。,4.4,接口,2024/9/16,14,接口定义格式,:,publicabstracti,nterface,接口名,extends,父接口,1,,父接口,2,public static final,常量定义 ;,public abstract,方法定义;,接口的成员变量默认具有,final,属性,即常量。,接口的方法为,abstract,,仅有声明,没有实现。,2024/9/16,15,接口的实现与使用,implements,关键字用来表示某类实现某个接口,,在类体中可以使用接口中定义的常量,且,须,实现接口中定义的所有方法,。,一个类可以实现多个接口,在,implements,中,用,“,”,分隔。例如:,Public interface Flyer,public void takeoff();,public void land();,public void fly();,2024/9/16,16,Public class Airplane implements Flyer,public void takeoff ( ),/,实现起飞的操作,public void land ( ),/,下落,public void fly( ),/,起飞,2024/9/16,17,接口的多态,接口的引用比类更灵活。,一个接口的引用,可以指向任意不相关的、实现了这个接口的类对象。,对比:,继承中,父类的引用只能指向它的子类对象。,example,:,Hello.interface.java,注意:接口的引用,只能调用该类实现这个接口的方法,而不能调用这个类对象自身的成员方法。,什么时候使用接口,(,1,)多重继承,(,2,),声明方法,期望一个或更多的类来实现该方法。,(,3,),揭示一个对象的编程接口,而不揭示类的实际程序体。,(,4,),捕获无关类之间的相似性,而不强迫类关系。,(,5,),描述“似函数”对象,它可以作为参数被传递到在其它对象上调用的方法中。,2024/9/16,19,多重继承,Java,中规定一个类只能继承一个父类,但可以实现多个接口,,Java,是利用接口实现多重继承的。,父类方法,interface_1 interface2,interface_n,抽象或具体父类,Interface_1,Interface_2,Interface_n,子类,2024/9/16,20,接口的扩展,(通过继承),通过创建接口的子接口来增加新的方法。,如:,Interface Shape,void draw();,void erase();,interface ShapeArea extends Shape,double area();,2024/9/16,21,接口与抽象类,两者有一定的相似,又有区别,接口中方法都是抽象的,而抽象类中可以定义带有方法体的不同方法,一个类可以实现多个接口,而只可继承一个抽象父类,接口不是类体系的一部分,即与实现它的类不构成继承体系。抽象类通常位于类体系顶层。,接口可用于多重继承。,2024/9/16,22,4.5,包,包的概念,Java,中包是相关类与接口的一个集合,它提供了,命名空间的管理和访问,。包具有特定的访问控制权限。,Java,中编译器把包对应于文件系统的目录和文件管理,,还可以使用压缩文件的格式存储(,zip,或,jar,)。,一个包就是一个文件夹!,包还可以包含子包,/,子目录。,2024/9/16,23,JDK,中提供的包有,Java.applet Java.awt,,,Java.event,等。,例如:名为,Java.applet,的包中,所有类文件都存储在目录,classpathjavaapplet,下,这里,classpath,由环境变量来设定。,2024/9/16,24,包机制的优点,易根据包中类的功能找到所需要的类,包中的类是相关的。,每个包都是命名空间,不同包中类的名字不冲突。,同一个包中的类之间有比较宽松的访问机制。,包的定义与使用,定义用关键字,package,如:,package graphics,;,说明:,.,package,语句指定某类加入,graphics,包,并存放路径,为,classpathgraphics,2024/9/16,25,.,如原文件中没有,package,语句,则指定为无名包,通常放在源文件的目录下。,.package,只能有一条,并在源程序的第一行。,.,一个类只能属于一个包,.,包名以,“,.,”,为分隔符,2024/9/16,26,使用包成员,import,语句放在源程序的前面,如:,import graphics .circle /,引入包中的,Circle,类,import graphics.* /,引入包中所有的类,如果没有用,import,语句引入包的类,则可用长名,引用,格式:,包名,.,类名,如:,graphics.circle mycircle=new graphics.circle(),通常没有必要这样做。,一般只有在两个包有同名类时,使用长名引用方式。,2024/9/16,27,4.6,访问权限控制,Java,中有四中不同的访问权限,private-,私有的,protected-,受保护的,public -,公开的 缺省(,default,),(,1,)类成员的访问控制,权限,修饰符,同一类,同一包,子类,全局,private,Y,default,Y,Y,protected,Y,Y,Y,public,Y,Y,Y,Y,2024/9/16,28,(,2,)类的访问控制,权限,修饰符,同一包,全局,public,Y,Y,(但需,import,导入),default,Y,4.7,内 部 类,定义在类中的类,称为内部类,也称为嵌套类。,内部类本身是一个类,但它同时又是外部类的一个成员。,内部类根据放置的位置和修饰符又可细分为:,-,成员内部类,-,局部内部类,-,静态内部类,-,匿名内部类,。,内部类的主要优点之一:内部类的实例与外部类的实例共享一种,“,特殊关系,”,内部类中的代码可以访问外部类的所有成员(甚至是那些标识为,private,的成员),Java,程序设计与应用开发(第,2,版),30,成员,内,部类,作为,外部类的一个成员存在,与外部类的,属性、方法并列,public class Group2 ,private int count;,public class Student ,String name;,public Student(String n1), name = n1; count+;,public void output(), System.out.print(this.name + ); ,public void output() ,Student s1 = new Student(,李明,); s1.output(); System.out.println( count = +this.count);,public static void main (String args) ,Group2 g2 = new Group2( );,g2.output();,Group2.Student s = new Group2.Student(,李四,),;,s.output();,声明成员内部类,访问其外部类的成员变量,内部类的成员:,name,,,output(),不能为,static,编译出错,因在静态方法,main,中,不能访问非静态成员类,Student,的构造方法,创建内部类对象,,并通过内部类对象访问内部类成员,外部类方法,可以与内部类方法同名,问题:该语句能否 正确执行,31,局部,内部类,在方法中定义的内部类。只能访问方法中常量,和外部内所有成员。,Public class Outer ,private int out_i = 1;,public void f(final int k) ,final int j = 10;,class Inner ,Inner(int k) ,System.out.println(out_i);,System.out.println(j);,new Inner(k);,public static void main(String args) ,Outer out = new Outer();,out.f(3); ,定义在方法内部,可以直接访问外部类的实例变量,可以访问外部类的局部变量,(,即方法内的变量,),,但是变量必须是,final,的,访问局部内部类须先有外部类对象,32,静态,内部类,class Outerstatic class Inner,静态内部类可以直接生成,而不需要通过外部类对象生成。,Outer.Inner i = new Outer.Inner();,静态内部类只能访问外部类的静态成员。,只有静态内部类才可以声明静态成员;,内部类被声明为静态后,无法正常访问外部类非静态成员,受到很大的限制。只能通过,new,一个外部类对象来访问。,33,使用静态内部类的原因,需要在内部类定义静态成员;,希望隐藏内部类;,避免类名重复,在开发大型应用程序时需要设计大量的类,类存在重名的可能,为了避免这种情况,可以把可能重名的类设置为,static,、,public,的内部类,其他类在引用时要使用完成的内部类名标识(,外部类名,.,内部类明,),这样就避免了类名重复。,34,public class Group6, public static class Student, static int count;,String name; int number;,public Student(String n1), name = n1;,count+; number = count;,public void output(), System.out.println(this.name + number=+this.number);,public static void main (String args), Group6.Student s1 = new Group6.Student(A);,s1.output();,Group6.Student s2 = new Group6.Student(B);,s2.output();,定义静态公用内部类,静态内部类中的静态变量,纪录创建对象的序号,静态内部类的构造方法,创建一个对象序号自动增加,在静态,main,方法中,通过完整的内部类标示符创建内部类对象,35,在静态,main,方法中,通过完整的内部类标示符,Group6.Student,创建内部类对象,并使用静态成员变量记录创建对象的序号,36,匿名内部类,其实为一个局部内部类,在类很小时使用(,4,行代码以下),/ A method that returns an anonymous inner class.,public class Parcel6 ,public Contents,cont(),Contents con = new Contents() ,private int i = 11;,public int value() return i; ,;,/ Semicolon required in this case,return con;,public static void main(String args) ,Parcel6 p = new Parcel6();,Contents c = p.cont();,创建了一个继承自,Contents,类的匿名类对象,并将结果自动上转型,2024/9/16,37,内部类的特点,:,内部类可以使用它所在类的静态成员变量、实例成员变量和方法中的局部变量。,内部类的修饰符有,abstract,,,private,或,protected,。,内部类可作为其他类的成员。,2024/9/16,38,4.8,其它,基本数据类型的包装类,集合类,2024/9/16,39,4.8.1,基本数据包装类,基本数据类型在,java.lang,包中都有一个,wrapper,类。,基本数据类型,Wrapper,类,基本数据类型,Wrapper,类,boolean,Boolean,char,Character,byte,Byte,long,Long,short,Short,float,Float,int,Integer,double,Double,2024/9/16,40,每个包装类中提供了有用的,方法,和,常量,MIN_VALUE MAX_VALUE,数据类型的转换,Integer wint=new Integer(18);,int p=wint.intValue();,int x=Integer.valueof(,“,123,”,).intValue();,int y=Integer.parseInt(,“,123,”,);,String s= (new Integer(125).toString();,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 小学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


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