java面向对象特性(学Java必看.ppt_第1页
java面向对象特性(学Java必看.ppt_第2页
java面向对象特性(学Java必看.ppt_第3页
java面向对象特性(学Java必看.ppt_第4页
java面向对象特性(学Java必看.ppt_第5页
已阅读5页,还剩70页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第3章 面向对象程序设计,更多免费资料,进群514167678,内容摘要,面向对象的思维就是以面向对象为中心来思考问题,此时会将与问题相关的种种元素视作为一个个的对象。问题的发生是由对象的交互所产生,而问题的解答也有某些对象彼此合作来完成。面向对象是一种对问题的思考方式,与任何的程序语言没有任何直接的关系,面向对象也绝不仅用于程序设计领域。对对象信息进行封装,我们使用了类。 本章首先从面向对象与面向过程的比较入手,介绍对象概念和面向对象开发过程。然后中的介绍如何在Java中创建Java类、方法和变量,接下来介绍Java对象、方法和继承,最后介绍内部类和抽象类。,共享资料和课程,进群514167678,学习目标,理解面向过程和面向对象区别 掌握对象概念 了解面向对象开发过程 熟练掌握Java类的创建 掌握类中的方法和变量的创建 掌握创建对象和对象引用 熟练掌握常用的基本方法,如静态方法和最终方法 掌握继承概念 掌握内部类和抽象类的使用,3.1 面向过程与面向对象,现在,作为程序员肯定听说过面向对象编程(OOP)这个奇妙的术语。OOP是当今软件开发中最热门的种方法。面向对象编程与面向过程相比较,是一个全新的编程方式。本节就会介绍编程思路的发展和面向对象编程特点。,3.1.1 编程思路的发展,要明白面向对象编程给程序员带来的好处,是需要了解编程技术发展的历史。在早些时间的计算机年代里,编程是一个十分花费精力的过程。计算机要做的每一步都必须详细入微(没有错误)地编写程序。早期的语言是著名的机器语言,后来进化为汇编语言。 面向过程 面向过程编程是程序开发首先选择的思路,这些过程语言把代码做成叫做过程或函数的块。每个块的日标是完成某个任务。 结构化程序设计 面向对象,3.1.2 面向对象设计,非面向对象与面向对象的区别 非面向对象的数据不能隐藏,而且数据与方法不够紧密 面向对象的思想 面向对象是一种思想,是指用什么样的思路去写程序,做软件。 真正的面向对象是指用面向对象的思想去在现实生活中解决问题,将现实中解决问题的思想与计算机思想更好地统一起来,能够让计算机模拟现实生活中解决问题的办法。 通过语言来编写程序,模拟人类解决问题的方法思路,而解决问题的最好思想就是在现实中已形成的思想,计算机就是要解决现实中的问题,把现实的问题迁移到计算机中解决。,面向对象解决问题的方法思想 例:写一个数组排序程序ArraySort.java分析java的面向对象 传统的程序员写排序代码则一般都会思考怎么排序,用什么循环,如何移用元素等,自己写代码实现排序功能 作为一个java程序员,java是纯粹的面向对象的编程语言,则无需自己写代码实现,一定要转变思想,当java程序员遇到一个问题,要实现一个功能时,则不要一味地想到自己怎么解决问题,而是先想想java中有没有现成的哪个类的哪个方法可以实现和解决问题。这就是面向对象的思想,也就是java的程序设计思想,3.1.2 面向对象设计,Java语言其实就是由很多的类组成,每个类有不同的对象,每个对象又有很多方法,所以我们解决问题,编写程序就是调用这些方法来解决问题。排序数组可使用java.util.Arrays.sort(数组名)来实现。 调用的java类的方法都是经过测试的,sun公司不断更新的方法,肯定是最好的,所以一定要学会运用不同类的不同方法。,3.1.2 面向对象设计,3.2 对象入门,类与对象 什么是对象 对象是现实世界中客观存在的,是类的实例,万事万物皆是一个对象。 任何一个对象都有2种特性:特征和行为 一个对象它具有什么特征,我们称它具有什么属性,用属性表示 一个对象它有自己的行为,它具有什么行为,我们称它具有什么方法,用方法表示 任何一个对象都是有属性,有方法的。,3.2 对象入门,什么是类 类是同一类型事物数据的抽象,是对象共性的抽象,是客观对象在人脑中的主观反映,对象则是类的具体化,是类的实例。 类是对象的模板。即类是对一组有相同数据和相同操作的对象的定义,一个类所包含的方法和数据描述一组对象的共同属性和行为。 java中的类与对象的使用 在java中,我们一定是写类,因为对象太多,无法写,只能写一个类来代表所有对象 在java中,我们一定是使用对象,因为类是一个抽象,没有实现,在现实生活中只有具体的对象,所以我们一定是用对象,3.2 对象入门,面向对象主要特征: 封装性 封装是指对一件物品的描述信息是这个物品所特有的,是不能让外界看到的一些成员变量和方法。在Java里成员变量和方法就被封装在类里,需要通过一些特有的方法访问它们。 继承性 继承是发生在类与类之间的。继承可以是单继承,也可以多层继承。 多态性 对象根据所接受的消息而做出的动作。同一消息被不同的对象接受时可以产生完全不同的行为,这种现象称为多态。,3.3 面向对象开发过程,当我们遵照面向对象方法学的思想进行软件系统开发时,首先要行面向对象的分析(OOAObject Oriented Analysis),其任务是了解问题域所涉及的对象、对象间的关系和作用(即操作),然后构造问题的对象模型,力争该模型能真实地反映出所要解决的“实质问题”。在这一过程中,抽象是最本质、最重要的方法。针对不同的问题性质选择不同的抽象层次,过简或过繁都会影响到对问题的本质属性的了解和解决。,3.3 面向对象开发过程,OOA 面向对象的分析方法(OOA),是在一个系统的开发过程中进行了系统业务调查以后,按照面向对象的思想来分析问题。OOA与结构化分析有较大的区别。OOA所强调的是在系统调查资料的基础上,针对OO方法所需要的素材进行的归类分析和整理,而不是对管理业务现状和方法的分析。 OOD 面向对象的设计(OODObject Oriented Analysis),即设计软件的对象模型。根据所应用的面向对象软件开发环境的功能强弱不等,在对问题的对象模型的分析基础上,可能要对它进行一定的改造,但应以最少改变原问题域的对象模型为原则。然后就在软件系统内设设计各个对象、对象间的关系(如层次关系、继承关系等)、对象间的通信方式(如消息模式)等,总之是设计各个对象应做些什么。,3.3 面向对象开发过程,OOI(又可以称为OOP) 面向对象的实现(OOI- Object Oriented Zmplementation),即指软件功能的编码实现,它包括:每个对象的内部功能的实现;确立对象哪一些处理能力应在哪些类中进行描述;确定并实现系统的界面、输出的形式及其它控制机理等,总之是实现在OOD阶段所规定的各个对象所应完成的任务。面向对象的实现(OOI)又称作面向对象的编程(OOP)。OOP(Object Oriented Programming)工作就是用一种面向对象的编程语言把OOD模型的每个成分书写出来。,3.3 面向对象开发过程,面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)是一种计算机编程架构。OOP的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成。OOP达到了软件工程的三个主要目标:重用性、灵活性和扩展性。为了实现整体运算,每个对象都能够接收信息、处理数据和向其它对象发送信息。,3.4 类,在Java中,完成对功能操作封装的单位称为类。类是有共同特性(属性)和操作(行为)定义的实体,类是用于组合各个对象所共有操作和属性的一种机制。可以根据类具有的属性和方法,赋予类不同的数值,来创建不同的对象实例。,3.4.1 类定义,类是构造面向对象程序的基本单位,是抽取了同类对象的共同属性和方法形成的对象或实体的“模板”。而对象是现实世界中实体的描述,对象要创建才存在,有了对象才能对对象进行操作。类是对象的模板,对象是类的实例。 类是Java的核心。由于类定义了一个对象的形式与属性,因此整个Java语言建立在这个逻辑结构之上。同样,类构成了Java面向对象程序设计的基础。任何希望在Java程序中实现的想法都必须封装在类中。在一个类中,程序的作用体现在方法中。方法是Java创建一个有名字的子程序的方法。 当定义一个类时,就声明了该类确切的形式和属性。通过指定类中包含的数据和对这些数据进行操作的代码来定义一个类。,3.4.1 类定义,创建类的一般格式: 修饰符 class 类名 extends父类名 implements接口名列表 成员变量声明 成员方法声明 其中:class、extends和implements都是Java的关键字(保留字)。 类的修饰符主要有public、abstract 、final及缺省访问修饰符等四种。 注意:一个类可以同时有多个修饰符,但是不能有相同的修饰符。当一个类有多个修饰符时,这些修饰符无先后顺序,可任意排列。 在java中允许定义没有任何成员的空类。,类的名称要符合标识符的命名规则: 不能为Java中的关键字。 不能包含空格或点号“.”,可以以下划线“_”、字母或“$”符号开头。 类的名称的第一个单词的第一个字母通常是大写,第二单词的第一个字母大写,以此类推。,3.4.2 属性和方法,在类体中,包含的是成员变量和成员方法,成员变量通常表示一个类所具有的属性。 通过声明成员方法可以定义类的行为,行为表示一个对象能够做的事情或者能够从一个对象取得的信息。类的各种功能操作都是方法来实现,属性只不过提供了相应的数据。一个完整的方法通常包括方法名称、方法主体、方法参数和方法返回类型。其结构如图3-1所示:,3.4.2 属性和方法,图3-1 构成方法元素,3.4.2 属性和方法,在类体中创建方法,其语法格式如下: ( , ,) 方法以是否拥有返回值,是否带有参数,可以划分不同的方法形式。其常用的四种形式如下: void isN() void setN(int num) int getN() String getM(int a,int b) ,【例】 定义一个名为Box表示立方体的类,仅包含double类型的长length、宽width和高height三个成员变量。 class Box double length; double width; double height; 通过例,我们可以看到,在类中进行成员变量的声明与一般变量的声明形式完全相同,成员变量的类型可以是任意的,成员变量的名字在一个类中应该保证唯一性。例的类没有任何方法,下面再看一个有成员方法的类。,【例】定义一个名为Box表示立方体的类,包含double类型的长length、宽width和高height三个成员变量以及设置立方体长、宽、高值的方法initBox()、计算立方体体积的方法getVol()。 class Box / 定义Box类 double length; double width; double height; double getVol() / 计算立方体体积的方法getVol() return length * width * height; void initBox(double l,double w,double h) / 初始化立方体长宽高值 length = l; width = w; height = h; ,【例】定义一个名为Box表示立方体的类,包含double类型的长length、宽width和高height三个成员变量以及设置立方体长、宽、高值的方法initBox()、计算立方体体积的方法getVol()。 class Box / 定义Box类 double length; double width; double height; double getVol() / 计算立方体体积的方法getVol() return length * width * height; void initBox(double l,double w,double h) / 初始化立方体长宽高值 length = l; width = w; height = h; ,练习:创建一个电视机类,它包含: 属性:尺寸、型号、生产厂商 方法:打开、关闭、欣赏节目,3.5 对象,一旦定义了所需的类,就创建了一种新的数据类型,使用类类型定义的变量叫对象。对象创建类的变量称为类的实例化。对象是类的一个实例。类的对象是在程序运行中创建生成的,其所占的空间在程序运行中动态分配。当一个类的对象完成了它的使命,为节省资源,Java的垃圾回收程序就会自动收回这个对象所占的空间,即类对象有自己的生命周期。 Java对象的生命周期大致包括三个阶段:对象的声明和创建,对象的使用,对象的清除。 如:Box box1; 定义的box1是一个对类型为类Box的对象的引用,box1不是对象本身,可理解为指针,可以指向类Box的某一个具体的对象(实例)。,1创建对象 创建类的对象一般需要两步: 第一步,声明该类型的一个变量; 第二步,用new运算符为对象动态分配(即在运行时分配) 内存空间,并返回对它的一个引用,这个引用被存储在该变量中。 利用new创建类的对象的通用形式如下: 类对象名 = new 类名(); 例如,创建一个Box类的对象myBox可用以下语句 Box myBox; /声明一个对象 myBox = new Box();/创建一个对象,3.5.1 对象定义,new运算符允许与类声明结合使用来创建一个类的对象,如上面两行语句可组合为: Box myBox = new myBox(); 定义好后,可以把myBox作为类Box的对象来使用,而实际上myBox仅是保存了实例对象的地址,利用它来间接的引用实例对象。 注:创建一个对象需要该类的构造方法和new关键字(缺一不可)。New主要作用是在创建对象时,开辟一块内存,而内存空间的大小由构造函数决定。,2使用对象 创建了类的对象后,就可以对对象的各个成员进行访问,以进行各种处理。访问对象成员的通用形式为 类对象名 . 成员变量名 类对象名 . 成员方法名( ) / 括号不能省略 运算符“. ”称为成员运算符,在类对象名和成员变量名、成员方法之间起到连接的作用,以此指明是哪个对象的成员。 从上面的访问形式,可以看出,要使用对象变量首先要构造对象,获得类对象名,即类变量名。,【例】利用上例定义的Box类,计算长、宽、高分别为5、4、3的立方体体积。 public class BoxDemoOne public static void main(String args) Box myBox = new Box(); double vol; myBox.length = 5; myBox.width = 4; myBox.height = 3; vol = myBox.length * myBox.width * myBox.height; System.out.println(“立方体的体积是: “ + vol); ,注意:要编译成功,必须将例5.1定义的Box类置于本程序中,以生成Box.class和BoxDemoOne.class两个字节码文件,程序运行结果如下: 长方体的体积是: 60.0 当程序需要更多的类对象时,可用new运算符多次创建该类的对象,然后按例5.3中的代码形式进行长方体体积的运算。这样一来,程序中对成员变量的访问赋值语句会很多,显得程序不够紧凑。更好的方法是在类定义中加入可对成员数据进行操作的成员方法(如例所定义的类Box),可使程序更加有效率。 例p90,3清除对象 在java中,有自动内存管理系统的垃圾收集器,会定时或在内存不足时,自动回收垃圾对象所占的内存。程序员使用new关键字来为对象分为配空间释放对象时,只需要将对象所有引用赋值null。 其语法格式如下所示: objPerson=null;,当使用不同的构造方法或参数数据创建对象时,就会产生大量的、不同的对象。但这些对象有一个特点,就是都是来源于同一个类。这些对象之间,可以进行相应的引用。 例:class Obj double d; public Obj(double dd) d=dd; public void getD() System.out.println(d); public static void main(String args) Obj Obj1=new Obj(2.34); Obj Obj2=new Obj(3.34); Obj1.getD(); Obj2.getD(); Obj1=Obj2; /对象引用 Obj1.getD(); ,3.5.2 对象引用,练习:定义Circle类的成员变量r和常量PI及方法。 class Example1 / 定义Box类 float r; final double PI=3.14; public double area() return PI*r*r; public void setR(float x) r=x; public double perimeter() return 2*PI*r; ,public static void main(String args) double x,y; Example1 cir=new Example1(); cir.setR(2.3f); x=cir.area(); y=cir.perimeter(); System.out.println(“圆面积=“+x+“园周长=“+y); ,3.5.3 构造方法,构造方法是类中一种特殊的方法,用来初始化该类的一个新的对象。Java中的每个类都有构造方法。如果没有指定构造方法,则系统会调用默认的构造方法。默认的构造方法不带有任何一个参数。构造方法具有和类名相同的名称,而且不返回任何数据类型,在构造方法的实现中,也可以进行方法重写。 构造方法负责对象的初始化工作,为实例变量赋予合适的初始值。构造方法必须满足以下语法规则: 方法名必须与类名相同。 不要声明返回类型。不能被static、final、synchronized、abstract和native修饰。,3.5.3 构造方法,构造方法可以分为参数化构造方法和隐式构造方法,参数化构造方法即在构造方法中带有参数,隐式构造方法就是系统默认的构造方法。 一个类被实例化,也就是被new的时候,最先执行的是 构造函数(如果你有留心,你会发现很多类里面根本没有写构造函数)。 在java类中,如果不显示声明构造函数,JVM 会给该类一个默认的构造函数。 构造函数的主要作用 : 一是用来实例化该类。 二是让该类实例化的时候执行哪些方法,初始化哪些属性。,【例】利用构造方法实例。 public class Gou / 定义Box类 int a=2; int b=3; int c=4; public Gou() System.out.println(“*“); System.out.println(a+b+c); public Gou(int e,int f ,int g) a=e;b=f;c=g; System.out.println(“*“); System.out.println(a+b+c); ,public static void main(String args) Gou gg=new Gou(); Gou gg1=new Gou(7,8,9); Gou gg2=new Gou(11,12,13); ,无参数构造函数,有参数构造函数,调用构造方法Gou(),调用构造方法Gou(int,int,int),注:如果定义类的时候不自己写构成方法,系统编译器会自动给你一个不带参数的构造方法,但是如果自己写了一个带参数的构造方法,系统就不再为你弄那个不带参数了,要自己写哦,否则会出错,,3.6 基本方法,在面向对象的编程中,方法是对象行为的表现。除了上面介绍的普通方法之外,还有其它类型的方法,如静态方法、最终方法等。方法之间还可以重载,这极大的表现了Java的多态性。,3.6.1 this,this关键字是Java中常用的关键字,可用于任何实例方法内,指向当前对象。也可指向对其调用当前方法的对象或在需要当前类类型的对象引用时使用。this关键字用来处理成员变量和参数重名的情况 。 例: public class Example1 int a; int b; public Example1(int a,int b) this.a=a; this.b=b; public void getA (int a) this.a=a; System.out.println(this.a); ,public static void main(String args) Example1 t=new Example1(1,2); System.out.println(“下面输出的是变量值:“); System.out.println(t.a); System.out.println(t.b); System.out.println(“下面调用方法的值:“); t.getA(9); System.out.println(t.a); ,3.6.2 方法重载,在Java中,同一个类中的2个或2个以上的方法可以有同一个名字,只要它们的参数声明不同即可。在这种情况下,该方法就被称为重载(overloaded),这个过程称为方法重载(method overloading)。 方法重载是Java实现多态性的一种方式。调用方法时通过传递给它们的不同个数和类型的参数来决定具体使用哪个方法,这就是多态性。,3.6.2 方法重载,当一个重载方法被调用时,Java用参数的类型和(或)数量来表明实际调用的重载方法的版本。因此,每个重载方法的参数的类型或数量必须是不同的。虽然每个重载方法可以有不同的返回类型,但返回类型并不足以区分所使用的是哪个方法。当Java调用一个重载方法时,参数与调用参数匹配的方法被执行。 在使用重载要注意以下的几点: 在使用重载时只能通过不同的参数样式。 不能通过访问权限、返回类型、抛出的异常进行重载。 方法的异常类型和数目不会对重载造成影响。 对于继承来说,如果某一方法在父类中的访问权限是priavte,那么就不能在子类对其进行重载,如果定义,也只是定义了一个新方法,而不会达到重载的效果。,public class Example1 / 定义Box类 void test() System.out.println(“没有参数“); void test(int a) System.out.println(“值a:“+a); void test(int a ,int b) System.out.println(“值a,b:“+a+“,b= “+b); ,double test(double a) System.out.println(“double值a:“+a); return a*a; public static void main(String args) Example1 ex=new Example1(); double d; ex.test(); ex.test(10); ex.test(10,20); d= ex.test(2.2); System.out.println(“double值a的平方:“+d); ,class OverloadDemo void test() System.out.println(“No parameters“); void test(int a) System.out.println(“a: “ + a); void test(int a,int b) System.out.println(“a and b: “ + a + “ “ + b); double test(double a) System.out.println(“double a: “ + a); return a*a; ,public class Gouzao public static void main(String args) OverloadDemo ob = new OverloadDemo(); double result; ob.test(); ob.test(10); ob.test(10,20); result = ob.test(123.25); System.out.println(“Result of ob.test(123.25): “ + result); ,3.6.3 静态变量和方法,在Java语言中,没有实际意义上的全局变量,变量最大作用域范围就是类。如果两个类或多个类之间需要共享数据,单纯依靠参数进行传递,就会花费大量的代码去完成。实际上,我们完全可以利用Java语言的静态变量实现数据的共享。在Java语言中,被static关键字修饰的块、方法和变量被称为静态块、静态方法和静态变量。 类中的静态变量、方法或代码块属于类,而不属于某个特定的对象。,3.6.3 静态变量和方法,static修饰符 static(静态)修饰符用来修饰类的成员变量和成员方法,以使它们成为静态成员(又称为类成员)。静态成员存储于类的存储区,属于整个类,而不属于一个具体的对象。因为静态成员属于整个类,所以它被所有该类对象共享。在不同的类对象中访问静态成员,访问的是同一个。 用static修饰的成员变量又称为类变量,不加static修饰的成员变量又叫实例变量。 实例变量依附于具体的对象实例,它的值因具体对象实例的不同而不同。 类变量为该类的所有对象所共享,它的值不因类的对象不同而不同。,用static修饰的方法为静态方法,又叫类方法;无static修饰的方法为实例方法。类方法是该类的所有对象共享的方法。 对静态成员的使用一般应注意以下两点: 静态方法不能访问属于某个对象的成员变量,而只能处理属于整个类的成员变量,即静态方法只能处理静态变量。 可以使用两种方式调用静态成员,它们的作用相同。 静态方法不能使用this和super。 静态方法不能被覆盖为非静态方法 注意: 在一个类中,静态方法能够直接调用静态成员变量;而对于实例变量,则必须通过对象名来调用。 变量:类名 . 变量名 或 类对象 . 变量名 方法:类名 . 方法名() 或 类对象 . 方法名(),class Example1 / 定义Box类 static int x=0; Example1()+x; public static void main(String args) System.out.println( Example1.x); Example1 a1=new Example1(); Example1 a2=new Example1(); System.out.println( Example1.x); a1.x=100; System.out.println( Example1.x); Example1.x=200; System.out.println( a2.x); ,类名.静态变量,对象名.静态变量,public class ex1 static int i =10; int j; static void setvalue(int x) j=x; System.out.println(“+i); void setvalue1(int x) ex1.setvalue(19); System.out.println(“+i+“ “+j); public static void main(String args) ex1.setvalue(9); System.out.println(i); setvalue(87); /System.out.println(j); ,3.6.4 常量和最终方法,final关键字表示对象是最终形态,对象是不可改变的意思。final在应用于类、方法和变量时意义不同,但本质一样:final表示不可改变。 用在变量的前面表示变量的值不可以改变,此时该变量可以被称为常量。 final(最终)修饰符用来修饰类、成员方法和成员变量。final的含义为终极或最终,它修饰的类不能被继承,即final类无子类。 当在类中定义变量时,如果其前面加上final关键字,其初始化可以在两个地方,一是其定义处,也就是说在final变量定义时直接给其赋值,二是在构造函数中。这两个地方只能选其一,要么在定义时给值,要么在构造函数中给值,不能同时既在定义时给了值,又在构造函数中给另外的值。,class Example1 / 定义Box类 final int x=1; public final void getX() x=9; /出现错误 System.out.println(x); public void num() System.out.println(x+1); ,练习:编程创建一个Point类,在其中定义两个变量表示一个点的坐标值,再定义构造函数初始化为坐标原点,然后定义一个方法实现点的移动,再定义一个方法打印当前点的坐标。并创建一个对象验证。,提示:关键代码如下: void move(int newX,int newY) x=newX; y=newY; void print() System.out.println(name+“:x=“+x+“ y=“+y); p.print(); p.move(50,50); System.out.println(“*after moving*“); p.print(); /call method of an object,3.7 继承,继承是面向对象语言的主要特征之一。继承(Inheritance)可以使程序的整个架构具有相当的弹性,更具有层次,并提高了代码的可重用性,并减少了设计程序的难度。在本节中,将会详细介绍继承的概念和使用。,3.4.1 Java中实现继承,继承是面向对象编程技术的一块基石,因为它允许创建分等级层次的类。运用继承,能够创建一个通用类,它定义了一系列相关项目的一般特性。该类可以被更具体的类继承,每个具体的类都增加一些自己特有的东西。在Java术语学中,被继承的类叫超类(superclass),继承超类的类叫子类(subclass)。因此,子类是超类的一个专门用途的版本,它继承了超类定义的所有实例变量和方法,并且为它自己增添了独特的元素。,3.4.1 Java中实现继承,继承是类和类之间的关系呈现了一个层次的结构。当一个子类继承父类的时候,此时子类就具有了父类的所有的成员,除了父类的私有成员。在Java中继承只允许是单根继承,一个类只能继承一个类,不能一次性的继承多个类。继承类的关键字为extends。继承的语法格式为: class subClass-name extends superClass-name /body of class ,class Stu / 定义Box类 String name=“李丽“; String sex=“女“; int id=001; Stu() void showDetail() System.out.println(“从父类中显示信息:“); System.out.println(“名称:“+name); System.out.println(“性别:“+sex); ,class Stud extends Stu Stud() void show() System.out.println(“从子类中显示信息:“); System.out.println(“名称:“+name); System.out.println(“性别:“+sex); System.out.println(“学号:“+id); public class Student Student() public static void main(String args) Stud s=new Stud(); s.show(); s.showDetail(); ,3.4.2 方法重写和变量隐藏,当子类继承父类时,可以拥有父类的成员方法和成员变量,这样就可以通过子类的实例化对象,调用父类的成员变量和方法。我们知道在子类中,可以创建属于子类自己的成员。如果创建了一个成员方法,该方法名称和父类中某成员方法名称相同,我们把这种情况称为方法重写(overiding method)。子类如果不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写,方法重写又称方法覆盖。,3.4.2 方法重写和变量隐藏,在重写方法时,需要遵循下面的规则: 参数列表必须完全与被重写的方法相同,否则不能称其为重写而是重载。 返回的类型必须与被重写的方法返回类型相同,否则不能称其为重写而是重载。 访问修饰符的限制一定要大于被重写方法的访问修饰符(publicprotecteddefaultprivate)。 重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常。 同样,如果子类中创建了一个成员变量,而该变量和父类中的一个变量名称相同,我们称作变量隐藏。,class A String str1=“初三班班长为:“; String name=“刘华“; public void getName() System.out.println(str1+name); class B extends A String name=“刘宏伟“; public void getName() System.out.println(str1+name); public void getS() System.out.println(str1); ,public void getN() System.out.println (str1+); public class Extend public static void main(String args) B b=new B(); b.getName(); b.getS(); b.getN(); A a=new B(); a.getName(); ,声明父类的一个对象,调用子类实例化,A称为上转型对象,只能使用父类的方法或子类中重写的父类方法。,3.4.3 使用super,讲到继承,我们不得不要熟悉一个关键字super,super关键和this作用类似,能够使被屏蔽的成员变量或者成员方法变为可见,或者说用来引用被屏蔽的成员变量和成员方法。不过super是用在子类中,目的是访问直接父类中被屏蔽的成员,注意是直接父类(就是类之上最近的超类。super有两个用途,一个是访问父类的构造函数,一个是访问被子类的成员覆盖的父类的成员,如被重写的方法和隐藏的变量。,关键字super的作用是用来引用它直接的父类,它有两种通用形式: 调用父类的构造函数; super(参数列表); 注意:每个子类的构造方法都隐含了一条super();语句,用来调用父类的构造方法,若父类中没有无参构造方法,该程序将出错。 访问被子类的成员隐藏的父类成员。 super . 成员; 这里的成员既可以是一个方法也可以是一个实例变量。,class SuperA int x , y ; SuperA(int x,int y) / 父类中的构造方法 this.x = x; this.y = y; void showXY() / 父类中的方法showXY() System.out.println(“输出的 x 和 y 分别是: “ + x +“ “ + y ); class SubB extends SuperA / 类SubB继承自类SuperA int k; SubB(int x,int y,int k) super(x,y); / 调用父类构造方法,是子类构造方法中第一个可执行语句 this.k = k; void showXY() super.showXY();/调用父类的方法。 System.out.println(“输出的 k 是: “ + k ); void sum() System.out.println(“输出的 x + y + k 是: “ +( super.x+super.y+k ); ,public class SuperDemo public static void main(String args) SubB subObj = new SubB(10,20,30); subObj.sum(); subObj.showXY(); / 子类继承了父类的非私有方法showXY() 程序结果:,注:派生类初始化 在创建派生类的对象时,使用派生类的构造方法对其初始化,不但要对自身的成员变量赋初始值,还要对父类的成员变量赋初始值。 Java语言中,子类调用父类构造方法的原则: 在子类的构造方法中,系统会自动添加一条语句:super();它将调用父类的无参构造方法;若父类中没有无参构造方法时,会出错。 如父类是有参数的构造方法,子类可以通过在自己的构造方法中使用super(参数);来调用它,且该语句必须是子类构造方法的第一个可执行语句。,3.8 内部类,当在程序的一个类中定义另一个类时,被定义的类就称为嵌套类(Nested class)。嵌套类的范围由装入它的类的范围限制。 例如,如果类ClassB被定义在类ClassA之内,那么ClassB为ClassA所知,然而不被ClassA的外面所知。 嵌套类可以访问嵌套它的类的成员,包括private成员。但是,包围类(外层类)不能访问嵌套类的成员。 简单的内部类定义如下所示: class A class B ,嵌套类一般有两种类型: 前加static修饰符的嵌套类 不加static修饰符的嵌套类 嵌套类最重要的类型是内部类(Inner class)。内部类是非static的嵌套类。它可以访问它的外部类的所有变量和方法,它可以直接引用它们,就象外部类中的其它非static成员的功能一样。这样,一个内部类完全在它的包围类的范围之内。 内部类是一个有用的特征,因为它允许将逻辑上同属性的类组合到一起,并在另一个类中控制一个类的可视性。 注意:带有static的嵌套类不能直接引用它包围类的成员,只能通过对象来访问。因为有这个限制,所以static嵌套类很少使用。,3.8 内部类,3.8 内部类,创建内部类时,须要注意下面几个原则: 一个内部类的对象能够访问创建它的外部类对象的所有属性及方法(包括私有部分)。 对于同一个包中的其他类来说,内部类能够隐藏起来(将内部类用private

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论