




已阅读5页,还剩65页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第五章面向对象的高级特征,南京农业大学 谢忠红,一、继承中父类(子类)的转化问题,继承的定义:子类继承父类的属性和方法(可以修改父类的属性或重载父类的方法),以及在父类的基础上添加新的属性和方法则就叫做继承。 在 Java 中,有一个被称为Object的特殊超类,所有的类都直接或间接地继承Object类,子类对象转换为父类对象,向上转换: 子类对象转换为父类对象时,是安全的,可以用显式或隐式实现. 类型向上转换是安全的,因为这是从特殊类型到通用类型的转换。,class point int x, y; point(int x, int y) this.x=x; this.y=y; int getX( ) return x; ,class circle extends point int radius; circle(int r, int x, int y)super(x, y); radius=r; double area( ) return Math.PI*radius*radius; ,public class testUpCasting public static void main(String args) System.out.println(p.getX( ); ,circle c=new circle(1,1,1); point p=c; / 注意p和c的类型不同,注意:进行向上类型转换时,出现的唯一问题是可能丢失子类中定义的方法和变量。 例如:子类对象C具有两个方法 getX()和area().;而 将c赋给p之后,p就只有getx()一个方法了。,父类对象转换为子类对象,从父类向子类转换,在继承图中是向下移动,称为向下类型转换,需进行强制转换。 类型向下转换是不安全的(产生类型转换异常:classCastException),因为这是从一般类型到特殊类型的转换,意味着该变量可以使用更多的特性(包括子类中的方法和变量)。,public static void main(String args) point p=new point(1,1); circle c; c=(circle)p; /将对象p强制转换为circle对象 System.out.println(c.area( ); ,编译通过、运行失败 原因:将p强制转换为circle类型的对象c,意味着c可以使用子类中的方法area()、变量radius.而p是没有这些方法和变量,改进的方法: public static void main(String args) point p=new point(1,1); circle c; ,if( p instanceof circle) /判断p是否是circle的实例 c=(circle)p; System.out.println(c.area( ); else / 出错处理 System.out.println(“can not downCasting“);,再看下例: public static void main(String args) point p=new circle(10,10,10); /注意p可以指向其子类 circle c; ,if( p instanceof circle) /判断p是否是circle的实例 c=(circle)p; System.out.println(c.area( ); else / 出错处理 System.out.println(“can not downCasting“);,二、static变量 和static方法,说明:即使没有创建对象,该变量仍然存在。因此,static变量又称为类变量。 说明:静态变量可以通过类名调用。,定义格式为:static type variableName ;,static变量(类变量): static变量属于类而非 对象,不管在程序运行中生成多少个该类的对 象,它们都共享该变量,,public class Scope static int a; public static void main(string args) a+; Scope s1=new Scope(); s1.a+; Scope s2=new Scope(); s2.a+; Scope.a+; System.out.println(“a=”+a); ,a=4,public class staticTest static int num=0; int c; staticTest( ) num+; public static void main(String args) staticTest x=new staticTest(); System.out.print(x.num); staticTest y=new staticTest(); System.out.println(y.num); ,例程,程序的结果:1 2 改编顺序后的结果: 2 2,static方法,static方法DEF:属于整个类的方法,即使不创建对象也可以调用static方法。,例:Java中的Math类中 ( Math.sin()、 Math .cos()) 调用静态方法格式: 类名.方法名(参数);,class point static int count; int x, y; point(int a, int b) count+;x=a; y=b; static int getCount()return count; ,public class testStaticVariable public static void main(String args ) System.out.println(“there are “+point.getCount() +“ points“); point p1=new point(10,10) ; System.out.println(“there are “+p1.getCount() +“ points“); ,Static方法属于整个类,而不属于对象,因而不可以使用this, super等代表对象的关键字,也不能访问所属类的实例变量,Public class Base protected int var; public void method1() var+; Public class Sub extends Base Public static void method2 super.method1(); ,super与类的特定实例相关,因此在静态方法中也不能使用super关键字,class point static int count; int x, y; point(int a, int b) count+; x=a; y=b; System.out.println(“Call point constructor!“); static int getCount() return count; ,static / /静态初始化,第一次创建对象时被调用 count=1;, System.out.println(“static var is initialized !“); ,public class testStaticVariable public static void main(String args ) point c1=new point(0,0) ; point c2=new point(10,10) ; System.out.println(“There are “+ point.getCount() +“ points“); ,public class staticTest static int num; int c; static void Test() num=10; c=10; void tt() num=100; c=100; public static void main(String args) staticTest x=new staticTest(); staticTest.Test(); num=100; c=100; ,/true,/false,/true,/true,/true,/false,由于static方法属于整个类,所以,它不能操纵和处理属于某个对象的成员变量,而只能处理static成员变量和方法参数。,class staticTest static int num; int c; static void get() num=10; class Test extends staticTest static int num; int c; void get() num=100; ,在子类不能覆盖父类中定义的静态方法。 -如果父类有一个方法是静态的,子类中也有一个方法与其同名同参数,但不是静态的,则编译出错。,public class Base void method () System.out.println(“method of Base“); static void staticmethod () System.out.println(“staticmethod of Base“); ,public class Sub extends Base void method () System.out.println(“method of sub“); static void staticmethod () System.out.println(“static method of sub“); public static void main(String args) Base sub1=new Sub(); sub1.method(); sub1.staticmethod(); Sub sub2=new Sub(); sub2.method(); sub2.staticmethod(); ,-如果父类有一个方法是静态的,子类中也有一个方法与其同名同参数,且也是静态的,这是编译通过,但这种用法不是覆盖,而是隐藏。,method of sub static method of Base method of sub static method of sub,三、final类 (终极类),说明: (1)系统类基本上都是final类,如String类。 (2)将class定义为final是为了杜绝继承,类中的方法自然都变成了终极方法(不能被覆盖) (3)设计成final的类一般是为了类的安全,在一个类定义前加上final,意味着这个类就不能被其它类继承,成为终极类。,final class Base / 声明为final类 final int x=1; /定义常量 void print ( int y ) System.out.println(x+y); ,/ 错误:不能继承final 修饰的Base类 class Derived extends Base ,final 数据 (与C、C+的差别) Java使用final 定义常量 例:class Base final int x=1; ,例 class Base int x=1; final void print (int y) System.out.println(x+y); ,final方法: 终极方法。不能被子类的方法覆盖,但可以重载。,public class Derived extends Base void print(int x) /错误不能覆盖final方法 System.out.println(x); void print(int x,int y) /重载可以 ,四、抽象类和抽象方法,抽象方法: 仅有方法特征,但没有代码; 抽象类: 包含抽象方法的类。,例: public abstract class vehicle /只能被继承 public abstract float getFule(int s) public abstract void accelerate( ) ,举例:某个公司有一个车队,车队中车类型很多,现在需要计算车队每年的耗油量。,abstract Vehicle Abstract int getFule() ,Bus int getFule(),Car void getFule(),Truck void getFule(),abstract class Vehicle abstract double getFule(double s); / 抽象方法 ,程序实现,class Bus extends vehicle double getFule(double s ) return 3.1*s; class Truck extends Vehicle double getFule(double s ) return 3.1*s ; ,class Car extends vehicle double getFule(double s ) return 2.0*s ,public class UseVehicle ,static float UseAll( Vehicle e ) double totalFule=0.0; double s=1010.1,2054.3,7879.6,7845.1 for(int i=0;ie.length;i+) totalFule=totalFule+ei.getFule(Si ); return totalFule; ,public static void main(String args) Vehicle VehicleArray = new Vehicle 4; int i=0; VehicleArrayi+= new Bus( ); VehicleArrayi+= new Car( ); VehicleArrayi+= new Bus( ); VehicleArrayi+= new Truck( ); System.out.println(UseAll(VehicleArray);,抽象类的作用: (1)提供一种适当的超类,子类通过继承实现父类中的抽象方法。 (2)抽象类体现了多态性实现了如软件复用,通过继承可以从抽象类派生出具有相似操作的子类。,class Circle extends Shape public int r; Circle(int r ) this.r=r; public float area() return 3.14*r*r; class Square extends Shape public int width,height; Square(int w, int h) width=w,height=h; public float area() return width*height; ,抽象类的例程: abstract class Shape /只能被继承 abstract float area(); ,五、接口,单继承、多继承 单继承:一个类只能有一个父类 作用:使得Java结构简单、层次清楚、易于管理、更安全可靠。 多继承:一个类可能有多个父类 缺点:造成继承冗余(近亲繁殖)。,多 继 承(产生冗余),多继承 接口 接口:是一系列属性和方法的集合,仅仅实现某一特定功能的一组对外接口和规范.,接口,类,再举个例子说明接口解决多继承,Food,Animal Eat(),Cat Eat(),Feeder Feed(),解决的方法定义成接口,interface Food,Animal Eat(),Cat Eat(),接口定义: public interface 接口名字extends 父接口序列 常量定义; 抽象方法定义; ,注意:Java允许一个类同时实现(继承)多个 接口,相当于实现多继承的功能。,说明:(1)接口中不能声明任何变量和构造函数. (2)一个接口可以是一个或多个其他它接口的直接继承. (3) 接口中说明的方法都是抽象方法.,interface MasterCh public static final int Myear=3; final String Mdegree=“Master“; void setMasterDegree( ); /抽象方法 void setStudyYear( ); ,例接口的定义,超 类,继承 实现,class Student String Name; int Age; String Department;,Student(String Name,int Age,String Department) this.Name=Name; this.Age=Age; this.Department=Department; void print() System.out.println(Name+“:“+Department+“:“+Age); ,public class Master extends Student implements MasterCh int StudyYear; String Degree; ,说明:当一个类实现接口时,必须实现接口中所有的空 方法,如果不能实现某方法,也必须写出该空方法。,Master(String Name,int Age,String Department,int StudyYear,String Degree) super(Name,Age,Department); this.StudyYear=StudyYear; this.Degree=Degree; ,void print()System.out.println(Name+“:“+Department + “:“+Age+“:“+Degree+“ : “+StudyYear); ,硕士特性 博士特性,学生,硕 博联读,例: interface MasterCh /定义一接口1 final int Myear=3; final String degree=“Master“; void setMasterDegree(); void setStudyYear(); /相同 ,interface DoctorCh /定义一接口 final int Dyear=4; final String Ddegree=“Doctor“; void setDoctorDegree(); void setStudyYear(); /相同 0,public class MasterDoctor extends Student implements MasterCh , DoctorCh int StudyYear; String Degree;,MasterDoctor(String Name,int Age,String Department,int StudyYear,String Degree) super(Name,Age,Department); this.StudyYear=StudyYear; this.Degree=Degree; ,public void setStudyYear()/相同方法实现一次 StudyYear=Myear+Dyear-1; ,public void setMasterDegree() /空方法写出来 public void setDoctorDegree() ,public static void main(String args) MasterDoctor LiMing=new MasterDoctor (“LiMing“,19,“Computer“,0,“); LiMing.setStudyYear(); LiMing.print(); ,public void setMDDegree() Degree=Mdegree+ Ddegree; void print(),(1)如果一个类可以实现多个接口只需在接口名之间用逗号隔开。,(3)如果类所要实现的两个接口声明了同一方法。 在实现时只需实现一个即可。,(2)在类中实现接口中方法时,方法的特征 必须和接口中声明的方法特征保持一致;,说明,(2)对于继承性,类继承了父类的方法:子类可以选择是否覆盖父类的方法; 接口的方法没有实现,因此,类必须实现接口中的每个方法。,接口和类之间的区别,(1)类只能继承一个类,而对于接口,类可 以实现多个接口。,六、Java的包,Windows的文件夹-Java中的包 程序包:相当于其它语言中的库函数 包是一组相关的类和接口的集合。,package Graphics; class Square ; class Circle ; class Triangle ;,如何定义自己的包,包的定义格式: package pkglpkg2pkg3; 例:package pack1; class Date1 class Point 例: package pack2.littlepack; class Book class Pen ,引用包的格式: import package1.package2.(class-name | *) 例:import java.io.FileInputStream; import java.io.*;,说明:*代表概包中的所有类,采用*号不影响程序的运行性能,但会影响编译速度。,访问控制权限控制小结,package mypackage.pack1; public class lei1 public int a=1; private int b=2; protected int c=3; int d=4; public int geta() return a; private int getb() return b; protected int getc() return c; int getd() return d; ,package mypackage.pack1; public class lei1test public static void main( ) lei1 lei=new lei1(); lei.a=12; lei.b=3; lei.c=34; lei.d=22; int a=lei.geta(); int b=lei.getb(); int c=lei.getc(); int d=lei.getd(); ,lei1test.java,lei1.java,package mypackage.pack2; import mypackage.pack1.lei1; public class lei2 public static void main(String args) lei1 s=new lei1(); s.a=12; s.b=3; /私有成员无法访问 s.c=34; /受保护成员不能访问 s.d=22; / 默认的成员可以被本包的其它类访问,不能被其他包的类访问 int a=s.geta(); int b=s.getb(); int c=s.getc(); int d=s.getd(); ,lei2.java,package mypackage.pack2; import mypackage.pack1.lei1; public class lei11 extends lei1 public int aa; public int bb; public int cc; public int dd; public void setaa() aa=a; public void setbb() bb=b; /私有成员子类不能访问 public void setcc() cc=c; /protected 成元可以被不是同一个包的子类使用 public void setdd()/dd=d; /friendly成员只能被本包的类访问,子类也无法访问 ,lei11.java,(1)java类库中的包(JavaAPI),java类库是以包的形式实现的,每个包中包含大量相关的类、接口等。 java.lang:语言包 java.io:输入输出包 java.util:实用程序包 java.awt:有关图形用户界面的工具箱 java.applet:包含有关小应用程序的处理 :网络包,java.lang,java.lang 包是 Java 语言的核心类库,包含运行Java程序必不可少的系统类,如Object类,基本数据类型、基本数学函数、字符串处理、线程、出错和异常处理类等。每个Java程序运行时,系统都会自动地java.lang包。所以这个包的加载是缺省的。,java.io,java.io 包是Java语言的标准输入输出类库,包含了实现 Java 程序与操作系统、用户界面以及其他 java 程序做数据交互所使用的类,如基本输入输出流、文件输入输出流等。 凡是需要完成与操作系统有关的较底层的输入输出操作的Java程序,都应该在程序中引入java.io包。,java.util,java.util 包括了Java 语言中的一些低级的实用工具, 如:处理时间的Date 类、处理变长数组的 Vector 类、实现栈的 Stack 类和实现杂凑表的HashTable类等,使用它们开发者可以更方便、快捷地编程。,java.awt,java.awt 包是 Java 语言用来构建图形用户界面(GUI)的类库,它包括了许多界面元素和资源,主要在三个方面提供界面设计支持:低级绘图操作、图形界面组件和布局管理以及界面用户交互控制和事件响应。利用 java.awt 包,开发人员可以很方便地编写出美观、方便、标准化的应用程序界面。,java.applet,java.applet 包是用来实现运行于Internet 浏览器中的Java Applet的工具类库,它仅包含一个非常有用的类:java.applet.Applet。,, 包是 Java 语言用来实现网络功能的类库。包含底层的网络通信;编写用户自己的Telnet、FTP、邮件服务等实现网上通信的类。,内类,DEF:在一个类的内部定义另外一个类,该类与外类的成员变量和方法并列 作用:通过内类可以直接访问外类的成员变量,A,B,C,class a1 private int size; void test() b x=new b(); x.tt(); public static void main(String args) ,a1 s=new a1(); b y=s.new b(); y.tt(); System.out.println(s.size);,内类地位:如同外类的一个普通的方法和成员变量,静态方法不能直接使用,class b void tt() size=100; ,内类对象的创建方法:先创建外类对象,然后通过外类的new来创建内类对象,例,class Outer public class InnerTool public int add(int a,int b) return a+b; private InnerTool tool=new InnerTool(); public void add (int a,int b,int c) System.out.println(tool.add(tool.add(a,b),c); class Test public static void main(String args) Outer o=n
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年中国家用光脱毛器具行业市场全景分析及前景机遇研判报告
- 中国鞋面横织机行业市场竞争格局及投资前景展望报告
- 中医培训课件 哪些
- 2025年中国车床行业市场深度评估及投资策略咨询报告
- 中国幕墙装饰板市场规模预测及投资战略咨询报告
- 2025年 重庆市长寿区教育事业单位定向招聘考试笔试试题附答案
- 2025年 新疆铁道职业技术学院招聘考试笔试试题附答案
- 2025年 楚雄州楚雄市紧密型医共体编制外职工招聘笔试试题附答案
- 中国蔬菜种场运植市场竞争格局及行业投资前景预测报告
- 2025年中国展会展览行业发展趋势预测及投资战略咨询报告
- 消防工程火灾自动报警及联动控制系统安装施工方案
- 工程竣工结算协议书
- 2024年江西省初中学业水平考试地理试题含答案
- 《理想国》导读学习通超星期末考试答案章节答案2024年
- 四川省南充市语文小升初试卷及解答参考(2024-2025学年)
- 2024届湖南省普通高等学校对口招生考试语文试题
- GB/T 44302-2024碳纤维增强塑料和金属组合件拉伸搭接剪切强度的测定
- 叙事疗法课件
- 《Python编程基础》课程标准
- 2024年人教版小学四年级科学(下册)期末试卷及答案
- 2023-2024学年全国小学二年级下英语人教版期末考卷(含答案解析)
评论
0/150
提交评论