4_3非访问控制-接口-内部类

上传人:yx****d 文档编号:243375623 上传时间:2024-09-22 格式:PPT 页数:41 大小:253.50KB
返回 下载 相关 举报
4_3非访问控制-接口-内部类_第1页
第1页 / 共41页
4_3非访问控制-接口-内部类_第2页
第2页 / 共41页
4_3非访问控制-接口-内部类_第3页
第3页 / 共41页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第4章 继承与多态,Part 3,非访问控制符、接口,内部类与匿名类,1,本章内容,非访问控制符,Java,类的,static,成员,final,关键字,abstract,关键字(抽象类),接口,内部类与匿名类,2,非访问控制符,非访问控制符,基本,定义,修饰类,修饰,成员,修饰局部变量,static,静态、类、非实例,只可以修饰内部类,Yes,No,final,最终的、不可变的,Yes,Yes,Yes,abstract,抽象的、不可实例化的,Yes,只有方法,No,3,关键字static,在,Java,类中,声明变量、方法和内部类时,,可使用关键字,static,做为修饰符。,static,标记的变量或方法由,整个类,(,所有实例,),共享,如果访问控制权限允许,,可不必创建该类对象而直接用类名加,.,调用,。,static,成员也称类成员或静态成员,如:类属性、类方法、静态方法等。,4,类属性(class Attributes),类属性由该类的所有实例共享,public class Person ,private int id;,public,static,int,total,= 0;,public Person() ,total,+;,id =,total,;,Person,+total : int = 0,-id : int,p1 : Person,id=1,p2 : Person,id=2,5,类属性应用举例,class Person ,private int id;,public static int total = 0;,public Person() ,total+;,id = total;,public class OtherClass ,public static void main(String args) ,Person.total = 100;,System.out.println(Person.total);,Person c = new Person();,System.out.println(Person.total);,6,类变量与实例变量的区别,类变量与类绑定在一起,实例变量与实例绑定在一起。,类变量在内存中只有一个拷贝,运行时只为类变量分配一次内存。,对于实例变量,每创建一个实例,就为该实例分配一次内存。,类变量被所有的实例共享。,7,类方法,static标记的方法由整个类(所有实例)共享,如果访问控制权限允许,可不必创建该类对象而直接用类名加.调用。,类方法中不能访问实例变量。在类方法中不能使用this和super。,static 方法只能处理类变量,或者调用类方法。但是实例方法中可以处理类变量,调用类方法。,static方法不能修饰成abstract。,8,类方法应用举例(1),class Person ,private int id;,private static int total = 0;,public static int getTotalPerson() ,return total;,public Person() ,total+;,id = total;,public class TestPerson ,public static void main(String args) ,System.out.println(Number of total is ,+Person.getTotalPerson();,Person p1 = new Person();,System.out.println( Number of total is ,+ Person.getTotalPerson();,The output is:,Number of total is 0,Number of total is 1,9,类方法应用举例(2),class Wrong ,int x;,void method(),public static void main(String args),/编译错误,x=9;,method();,10,静态初始化器,class Person ,public static int total;,static ,total = 100;/为total赋初值, /其它属性或方法声明,由,static ,构成,,在类的定义体中、方法的外部可包含,static,语句块。,static,语句块仅在其所属的类被载入时执行一次,static,块通常用于初始化,static (,类,),属性,如果有多个,static,块,在类的初始化时会依次执行。,11,静态初始化举例 Person.java,class Person ,public static int total;,static total = 100;,System.out.println(in static block one!);,total +; ,public static void main(String args) ,System.out.println(total = + Person.total);,System.out.println(total = + Person.total); ,static System.out.println(in static block Two!); ,12,static的应用模型Singleton 设计模板(单子),class Single,private static Single onlyone = new Single();,public static Single getSingle() ,return onlyone;,private Single() ,public class TestSingle,public static void main(String args) Single s1 = Single.getSingle();,Single s2 = Single.getSingle();,if (s1= =s2),System.out.println(s1 is equals to s2!);,13,static与继承,子类不能继承父类中的static成员,子类可以定义与父类的static变量同名的变量,子类不能定义与父类static方法同名的成员方法;但是子类可以定义与父类static方法同名的static方法,父类的非静态方法不能被子类覆盖为静态,注意与访问控制符的结合,14,static与继承举例,Father.java,public class Father,static int i =1;,static void method(),class Son extends Father,int i = 1; /合法,void method() /非法,static void method() /合法!注意访问控制符,举例:B.java,15,动态绑定,访问一个引用型的变量的非静态方法,运行时与实际引用的对象的方法绑定。,访问一个引用型的变量的静态方法,运行时与声明的类的方法绑定。,16,关键字final,Final.java,在,Java,中声明类、属性和方法时,可使用关键字,final,来修饰。表示“最终”“不可变”。,final,标记的,类不能被继承,。,final,不可与,protected,同用。,final,标记的变量,(,成员变量或局部变量,),即成为,常量,,,只能赋值一次,。,final,常与,static,一起表示多个对象的公有常量。,final,标记的成员变量必须在,声明的同时,或在,每个构造方法中显式赋值,,然后才能使用。,final,标记的,方法不能被子类重写(不能编译),。此处与,private,标记的方法不同。,17,关键字final应用举例,import java.io.*;,public final class Test,public static int totalNumber= 5 ;,public final int id;,public Test(),id = +totalNumber;,public static void main(String args) ,Test t = new Test();,System.out.println(t.id);,final int i = 10;,final int j;,j = 20;,j = 30; /非法,18,Ex1 使用static和final关键字,体会,static,关键字的用法;,阅读下述程序,并改正其错误,体会,final,关键字修饰变量时的用法;,public class,TestFinal,public static void main(String,args,),int,i = 1;,final,int,j = 10;,j = 100;,final,int,k ;,k = 100;,k = 200;,System.out.println(i,= + i + j= + j + k= + k);,19,abstract关键字,abstract 可以修饰类、方法。表示抽象,“无法实例化”、“没有具体化”。,abstract不能与final并列修饰同一类,abstract不能与private,static,final或并列修饰同一方法。,abstract方法必须位于abstract类中。,20,抽象类(abstract class),用,abstract,关键字来修饰一个类时,这个类叫做抽象类;用,abstract,来修饰一个方法时,该方法叫做抽象方法。,含有抽象方法的类必须被声明为抽象类。,抽象类不能被实例化(须说明)。,抽象方法只需声明,无方法体。,abstract,returnType,methodName,( ,paramlist, );,例如:,abstract class A,abstract void method (,int,a );,21,抽象类的继承,抽象类(抽象方法)是为继承而设计的。,子类继承父类(抽象类),则子类应重写父类所有的抽象方法,称为“实现”。,子类如果没有实现某一抽象方法,则子类也应声明为抽象类,否则编译错误。,没有抽象构造方法。(抽象类可以有构造函数),22,抽象类举例,abstract class A,abstract void m1( );,public void m2( ) System.out.println(A类中定义的m2方法);,class B extends A,void m1( ) System.out.println(B类中定义的m1方法);,public class Test,public static void main( String args ),A c = new B( ); /抽象例实例化的特例,c.m1( );,c.m2( );,23,抽象方法的覆盖,子类可以定义抽象方法覆盖父类抽象方法。,父类的非抽象方法可以被覆盖为抽象方法。,public class Xixi,final int a = 5;,void b( );,abstract class haha extends Xixi,final int a = 5;,abstract void b( );,抽象应用举例:TestVirtualInvoke.java,24,假设有若干个Circle,以及若干个Rectangle,希望计算它们的总面积,直截了当的做法是将它们分别放到两个数组中,用两个循环,加上一个加法,这种做法是不漂亮的,如果还有其它形状,triangle,ellipses等,上述方法显得“累赘”,我们希望有一种统一的表示,例如用一个数组shape,接受所有的形状,然后用,for (i=0;ishape.length;i+) ,area_total+=shapei.area();,25,abstract class Shape, abstract float area();,class Circle extends Shape, public int r;,Circle(int r) this.r=r;,public float area() return 3.14f*r*r; ,class Rectangle extends Shape,public int width,height;,Rectangle (int w, int h) width=w;height=h;,public float area() return width*height; ,26,接 口(1),接口,(,interface,),是抽象方法和常量值的定义的集合。,从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含,常量,和,方法的定义,,而,没有变量和方法的实现,。,接口定义举例,public interface Runner ,int,id = 1;,public void start();,public void run();,public void stop();,接口同,class,一样,保存在,.java,文件中,编译后可生成,.class,文件,27,接 口(2),声明接口的语法如下:,public interface 接口名 extends 父接口名列表(多个),/常量域声明,修饰符默认,必须被赋初值,publicstaticfinal 域类型 域名=常量;,/抽象方法声明,修饰符默认,publicabstract返回值 方法名(参数列表);,28,接 口(3),多个无关的类可以实现同一个接口,一个类可以实现多个无关的接口,与继承关系类似,接口与实现类之间存在多态性,实现接口的,Java,类的语法格式:, class extends ,implements, ,* ,*,接口的抽象方法的访问限制符都已指定为,public,,所以类在实现方法时,必须显式地使用,public,修饰符。,29,接口应用举例(1),public interface Runner ,public void start();,public void run();,public void stop();,public class Person implements Runner ,public void start() ,/ 准备工作:弯腰、蹬腿、咬牙、瞪眼,/ 开跑,public void run() ,/ 摆动手臂,/ 维持直线方向,public void stop() ,/ 减速直至停止、喝水。,30,接口应用举例(2),31,接口应用举例(3),interface Runner public void run();,interface Swimmer public double swim();,class Animal public void eat(); /非法,为什么?,class Person extends Animal implements Runner,Swimmer ,public void run() ,public double swim() ,public void eat() ,public class TestInterface,public static void main(String args),TestInterface t = new TestInterface();,Person p = new Person();,t.m1(p);,t.m2(p);,t.m3(p);,public void m1(Runner f) f.run(); ,public void m2(Swimmer s) s.swim();,public void m3(Animal a) a.eat();,32,接 口(4),TestInterface.java,如果实现某接口的类不是abstract类,则在类的定义中必须实现指定接口的所有抽象方法(所有的),如果,某类只实现了某接口的部分方法,那么此类必须被定义为abstract,Adapter适配器,33,接口用法总结,通过接口可以实现不相关类的相同行为,而不需要考虑这些类之间的层次关系。,通过接口可以指明多个类需要实现的方法。,通过接口可以了解对象的交互界面,而不需了解对象所对应的类。,34,内部类,在,Java,中,允许一个类的定义位于另一个类的内部,前者称为内部类,Inner class,一般用在定义它的类或语句块之内,在外部引用它时必须给出,完整的名称,。,Inner class,的,名字不能与包含它的类名相同,;,内部类和外层封装它的类之间存在,逻辑上的所属,关系,Inner class,可以使用包含它的,类的,静态和实例成员变量;,35,内部类举例 (1),class A ,private int s;,public class B /inner class,public void mb() ,s = 100;,System.out.println(在内部类B中s= + s);,public void ma() ,B i = new B();,i.mb();,public class Test ,public static void main(String args),A o = new A();,o.ma();,36,内部类举例 (2),public class A ,private int s;,public class B ,public void mb() ,System.out.println(s);,public class Test ,public static void main(String args) ,A a = new A();,/ 创建一个依赖于a而存在的b,A.B b = a.new B();,b.mb();,栈内存,a,B类对象,0,A类对象,s,b,this,堆内存,处内存状态,main,mb,A.this,37,内部类举例 (3),public class A,private int s = 111;,public class B ,private int s = 222;,public void mb(int s) ,System.out.println(s); / 局部变量s,System.out.println(this.s); / 内部类对象的属性s,System.out.println(A.this.s); / 外层类对象属性s,public static void main(String args),A a = new A();,A.B b = a.new B();,b.mb(333);,38,内部类的修饰符,访问控制符包括public,protected,默认及private,内部类前面用final修饰,表明该内部类不能被继承,内部类前面用abstract修饰,表明不能实例化,内部类前用static修饰:,实例化static内部类时,在new前面不需要用对象变量,不能访问外部类的非static成员,非static的内部类中的成员不能声明为static的,只有在顶层类或static的内部类中才可声明static成员;,Eg:,示例TestInnerStatic.java,39,方法中的内部类,在方法中定义类称为方法中的内部类,方法中的内部类不能用public、private、protected修饰,也不能用static修饰,但可以被final或abstract修饰,可以访问外部类成员,不能访问该方法的局部变量,除非是final的局部变量,示例TestInnerInMethod.java,40,匿名类,匿名类的定义与创建该类的一个实例同时进行;不使用关键字class,定义方法如下,new 继承的类名或实现的接口名( ),类名前不能有修饰符,类中不能定义构造方法,示例TestInnerAnonymous.java,41,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


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


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

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


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