Ch03面向对象程序设计课件

上传人:风*** 文档编号:240745657 上传时间:2024-05-04 格式:PPTX 页数:116 大小:469.30KB
返回 下载 相关 举报
Ch03面向对象程序设计课件_第1页
第1页 / 共116页
Ch03面向对象程序设计课件_第2页
第2页 / 共116页
Ch03面向对象程序设计课件_第3页
第3页 / 共116页
点击查看更多>>
资源描述
1主要内容主要内容n类、域、方法和实例对象类、域、方法和实例对象n继承性继承性n多态性多态性n封装性封装性n包包(package)n关键字关键字abstract、static、final和和thisn接口接口n内部类内部类n变量作用域范围和参数传递方式变量作用域范围和参数传递方式n面向对象程序设计基本思想面向对象程序设计基本思想第第1页页/共共116页页2面向对象程序设计整体介绍面向对象程序设计整体介绍n面向对象程序设计面向对象程序设计(OOP)1.1.将将数据数据(属性属性)和和方法方法(行为或功能行为或功能)封装封装到类到类(classes)中中数据数据与与方法方法常常是紧密相关的常常是紧密相关的2.2.对象对象(objects):类的实例对象或类本身类的实例对象或类本身3.3.三个基本特性:三个基本特性:封装性、继承性封装性、继承性和和多态性多态性封装性封装性状态状态 -成员变量成员变量功能功能 -成员方法成员方法继承性继承性在已有类的基础上进行扩展(继承)产生子类在已有类的基础上进行扩展(继承)产生子类实现代码重用和功能的扩充实现代码重用和功能的扩充多态性多态性方法重载(方法重载(overloadoverload)-静态静态方法覆盖(方法覆盖(overwriteoverwrite)-动态动态第第2页页/共共116页页3比较比较n结构化程序设计结构化程序设计1.1.对应的典型的计算机语言对应的典型的计算机语言,例如例如:C2.2.面向操作面向操作(action)的的3.3.函数函数(方法方法)是程序的基本单位是程序的基本单位n面向对象程序设计面向对象程序设计对应的典型的计算机语言对应的典型的计算机语言,例如例如:Java面向面向对象对象(object)的的类类(class)是程序的基本单位是程序的基本单位方法方法(函数函数)被封装在类中被封装在类中数据数据也常常被封装在类中也常常被封装在类中第第3页页/共共116页页4面向对象程序设计的主要工作面向对象程序设计的主要工作n了解已有类的基本情况(了解已有类的基本情况(JFCJFC)n扩展(继承)已有类建立自己的新类扩展(继承)已有类建立自己的新类n创建需要的对象创建需要的对象n实现对象之间的交互来完成系统目标实现对象之间的交互来完成系统目标第第4页页/共共116页页5类n类是组成类是组成JavaJava程序的基本单元程序的基本单元JavaJava程序结构如何?程序结构如何?n类(类型)是用来创建对象(变量)的模板类(类型)是用来创建对象(变量)的模板int a;int a;ClassName a;ClassName a;n类类(class)本身也是一种对象本身也是一种对象n类类(class)同时也是实例对象的模板同时也是实例对象的模板n类类(class)的基本组成:的基本组成:(成员成员)域域和和(成员成员)方法方法 n每个对象:拥有内存每个对象:拥有内存存储成员域存储成员域/方法方法静态的成员静态的成员域域/方法方法属于类属于类其它成员其它成员域域/方法方法属于实例对象属于实例对象第第5页页/共共116页页6类的定义1.1.格式格式 访问修饰符访问修饰符 class ClassName class ClassName 成员变量声明;成员变量声明;/属性属性-状态状态 成员方法声明;成员方法声明;/功能功能-行为行为 2.2.说明说明访问修饰符可以是访问修饰符可以是publicpublic或或省略省略成员变量和成员方法的声明顺序无严格要求成员变量和成员方法的声明顺序无严格要求成员变量定义:成员变量定义:类型类型 变量名或带初始化的变量名列表变量名或带初始化的变量名列表成员方法的定义:成员方法的定义:返回类型返回类型 方法名(参数列表)方法名(参数列表)第第6页页/共共116页页73.3.举例(举例(Example03_Circle.javaExample03_Circle.java)public class Example0301_Circlepublic class Example0301_Circlepublic class Example0301_Circlepublic class Example0301_Circle double r;double r;double r;double r;double s;double s;double s;double s;void setR(double r1)r=r1;void setR(double r1)r=r1;void setR(double r1)r=r1;void setR(double r1)r=r1;double getR()return r;double getR()return r;double getR()return r;double getR()return r;double getS()return Math.PI*r*r;double getS()return Math.PI*r*r;double getS()return Math.PI*r*r;double getS()return Math.PI*r*r;r=5.5r=5.5;/此处的语句是非法的,此处的语句是非法的,此处的语句是非法的,此处的语句是非法的,WhyWhy?成成员员变变量量成成员员方方法法举例举例(ExampleCh03_Circle.java)第第7页页/共共116页页81.1.变量的种类变量的种类成员变量成员变量(定义在所有方法的外面定义在所有方法的外面)a)a)实例成员变量(简称实例变量)实例成员变量(简称实例变量)b)b)类成员变量(简称类变量类成员变量(简称类变量 或或 静态变量)静态变量)局部变量局部变量(定义在某方法的内部定义在某方法的内部)a)a)包含形式参数(简称形参)包含形式参数(简称形参)注意:在注意:在JavaJava中没有中没有全局变量全局变量的概念的概念成员变量成员变量第第8页页/共共116页页9n变量的声明变量的声明n实例变量实例变量格式:访问修饰符格式:访问修饰符 类型名类型名 变量名变量名;/public/public,protectedprotected,省略,省略,privateprivateprivate double r;private double r;int s;int s;n类变量类变量格式:访问修饰符格式:访问修饰符 staticstatic 类型名类型名 变量名变量名;public static int a;public static int a;public static final double PI=3.14;public static final double PI=3.14;n局部变量局部变量格式:类型名格式:类型名 变量名变量名;double x;double x;/无访问修饰符无访问修饰符成员变量成员变量第第9页页/共共116页页103.3.说明说明一个类中不允许出现两个同名的成员变量一个类中不允许出现两个同名的成员变量一个方法中不允许出现两个同名的局部变量一个方法中不允许出现两个同名的局部变量类的成员变量可以和方法中的局部变量同名类的成员变量可以和方法中的局部变量同名public class Tom public class Tom int x=98,y,int x=98,y,x x;/error/error void f1()int void f1()int x x=3;y=x;=3;y=x;void f2()y=x;void f2()y=x;public void f3()public void f3()int int a a=y;=y;for(int i=0;i 10;i+)for(int i=0;i 10;i+)int int a a=0;=0;/error/error 成员变量成员变量第第10页页/共共116页页11实例变量和类变量在整个类中有效实例变量和类变量在整个类中有效局部变量只在定义它的复合语句中有效局部变量只在定义它的复合语句中有效若成员变量与局部变量同名,则在局部变量的作若成员变量与局部变量同名,则在局部变量的作用域内成员变量被隐藏(尽量避免重名)用域内成员变量被隐藏(尽量避免重名)public class Tom public class Tom int int x x=98,y=98,y=a a;/error/error;void f1()int void f1()int x x=3;y=3;y=x x;/y=/y=?void f2()y=void f2()y=x x;/y=/y=?public void f3()public void f3()int a=y;int a=y;for(int i=0;i 10;i+)int b=0;for(int i=0;i 10;i+)int b=0;System.out.println(System.out.println(“b=b=+b);+b);/error/error成员变量成员变量第第11页页/共共116页页12成员方法定义成员方法定义n与与C+C+程序不同的是程序不同的是:每个方法都必须隶属于某个类每个方法都必须隶属于某个类n方法的种类方法的种类1.1.实例方法实例方法2.2.类方法类方法n方法定义的格式方法定义的格式:方法修饰词方法修饰词 返回类型返回类型 方法名方法名(方法的参数列表方法的参数列表)局部变量说明部分;局部变量说明部分;/不一定有不一定有语句部分;语句部分;/一般要有,以实现方法的功能一般要有,以实现方法的功能 /public/public,protectedprotected,省略,省略,privateprivate第第12页页/共共116页页13说明说明:方法名方法名:任何一个合法的标识符任何一个合法的标识符参数列表参数列表:用逗号用逗号(,)分隔开分隔开返回类型返回类型:返回数据的数据类型返回数据的数据类型n除了构造方法,一般要求返回类型除了构造方法,一般要求返回类型:要么为要么为void,要么为,要么为某种数据类型某种数据类型int、byte、float或或Stringn最多只能返回一个值,最多只能返回一个值,没有返回值的方法要用没有返回值的方法要用voidvoid修饰修饰n类方法和实例方法的一个区别:类方法和实例方法的一个区别:staticstatic根据需要选择合适的访问修饰符根据需要选择合适的访问修饰符即使某个方法没有形参,但也要保留即使某个方法没有形参,但也要保留()()public double getArea()public double getArea()double area;double area;area=;area=;return area;return area;static void func(int x)static void func(int x)第第13页页/共共116页页14返回控制返回控制n如果没有值返回如果没有值返回:1.return;/退出该方法退出该方法2.2.或者遇到该方法的最后一个或者遇到该方法的最后一个“”,则退出该,则退出该方法方法n如果有值返回如果有值返回:1.return表达式表达式;/退出该方法退出该方法2.2.返回该表达式的值返回该表达式的值第第14页页/共共116页页15方法重载是指一个类中具有同一个名字的方方法重载是指一个类中具有同一个名字的方法可有不同的签名(参数不同)法可有不同的签名(参数不同)返回值类型和参数名不参与比较返回值类型和参数名不参与比较public void f();public void f();public int f(int a);public int f(int a);public double f(int a,double b);public double f(int a,double b);public double f(double a,int b);public double f(double a,int b);public double f(double a);public double f(double a);public double f(int a);public double f(int a);public double f(int x);public double f(int x);private double f(int x);private double f(int x);static double f(int x);static double f(int x);方法的重载方法的重载第第15页页/共共116页页16构造方法构造方法n构造方法构造方法在创建新的实例对象时起作用在创建新的实例对象时起作用n构造方法构造方法通常用来初始化实例对象,例如通常用来初始化实例对象,例如:初始化成员域或初始化成员域或设置工作环境设置工作环境n构造方法构造方法的特点的特点:1.1.与类同名与类同名2.2.没有返回值没有返回值n可以含有多种可以含有多种构造方法构造方法(重载重载)但必须具有不同的参数列表但必须具有不同的参数列表第第16页页/共共116页页17默认的构造方法默认的构造方法n n如果没有显式地定义类的构造方法,则系统会为该如果没有显式地定义类的构造方法,则系统会为该如果没有显式地定义类的构造方法,则系统会为该如果没有显式地定义类的构造方法,则系统会为该类定义一个默认的构造方法。该构造方法不含任何类定义一个默认的构造方法。该构造方法不含任何类定义一个默认的构造方法。该构造方法不含任何类定义一个默认的构造方法。该构造方法不含任何参数。参数。参数。参数。这个默认的构造方法首先调用其父类的不含任何参数的这个默认的构造方法首先调用其父类的不含任何参数的构造方法,然后初始化新生成的实例的各个成员域变量构造方法,然后初始化新生成的实例的各个成员域变量 默认值默认值:基本数值类型基本数值类型:0 0;booleanboolean:falsefalse;引用数据类型引用数据类型:nullnull最好自己写构造方法最好自己写构造方法n n一旦在类中定义了构造方法,系统就不会再创建这一旦在类中定义了构造方法,系统就不会再创建这一旦在类中定义了构造方法,系统就不会再创建这一旦在类中定义了构造方法,系统就不会再创建这个默认的不含参数的构造方法。个默认的不含参数的构造方法。个默认的不含参数的构造方法。个默认的不含参数的构造方法。第第17页页/共共116页页18构造方法示例构造方法示例public class Circle public class Circle private double r;private double r;public Circle()r=1.0;public Circle()r=1.0;/(1)/(1)public Circle(double r1)r=r1;public Circle(double r1)r=r1;/(2)/(2)public void Circle()r=5;public void Circle()r=5;/(3)/(3)是否是构造方法?该类共有几个构造方法?是否是构造方法?该类共有几个构造方法?若去掉若去掉后共有几个构造方法?后共有几个构造方法?r=r=?若去掉若去掉后共有几个构造方法?后共有几个构造方法?r=r=?若去掉若去掉和和后共有几个构造方法?后共有几个构造方法?r=r=?第第18页页/共共116页页19n n最终方法是一种用最终方法是一种用最终方法是一种用最终方法是一种用finalfinalfinalfinal关键字修饰的方法关键字修饰的方法关键字修饰的方法关键字修饰的方法n n最终方法不能被子类重写,但可重载最终方法不能被子类重写,但可重载最终方法不能被子类重写,但可重载最终方法不能被子类重写,但可重载public class Tom public class Tom public public finalfinal void func()void func()最终方法最终方法第第19页页/共共116页页20n抽象方法是一种用抽象方法是一种用abstractabstract关键字修饰的方法关键字修饰的方法n抽象方法只声明,不实现(没有方法体)抽象方法只声明,不实现(没有方法体)n抽象方法一般都要被子类重写,抽象类一般由子类继承,抽象方法一般都要被子类重写,抽象类一般由子类继承,且子类要实现其中所有的抽象方法;否则子类也要声明且子类要实现其中所有的抽象方法;否则子类也要声明为抽象的为抽象的n抽象类的对象抽象类的对象不能用不能用newnew创建创建n抽象类中可以没有抽象方法抽象类中可以没有抽象方法n若一个类中含有抽象方法则该类必须为抽象类(若一个类中含有抽象方法则该类必须为抽象类(注意注意TomTom类的定义类的定义)n思考:思考:finalfinal和和abstractabstract是否可同时修饰一个方法是否可同时修饰一个方法public public abstractabstract class Tom class Tom public public abstractabstract void func();void func();抽象方法抽象方法第第20页页/共共116页页21n n对象的概念对象的概念n对象是一个动态概念,具有产生、使用和消亡的生命对象是一个动态概念,具有产生、使用和消亡的生命周期周期n通过通过newnew操作符创建对象操作符创建对象n对象属性的使用:对象属性的使用:n对象名对象名.属性;属性;n对象方法的使用:对象方法的使用:n对象名对象名.方法名();方法名();n当对象不再使用时,将由系统的垃圾回收机制进行回当对象不再使用时,将由系统的垃圾回收机制进行回收。收。对象对象第第21页页/共共116页页22n n格式:格式:格式:格式:访问修饰符访问修饰符访问修饰符访问修饰符 类名类名类名类名 对象名;对象名;对象名;对象名;n n例如例如例如例如class ClassName class ClassName class ClassName class ClassName private String s;private String s;private String s;private String s;Circle circle;Circle circle;Circle circle;Circle circle;public String func()public String func()public String func()public String func()public final ClassName a;public final ClassName a;public final ClassName a;public final ClassName a;return return return return The String is:The String is:The String is:The String is:+s;+s;+s;+s;n n与基本数据类型的变量声明格式类似与基本数据类型的变量声明格式类似与基本数据类型的变量声明格式类似与基本数据类型的变量声明格式类似对象的声明对象的声明第第22页页/共共116页页23n格式:格式:对象名对象名 =new=new 类的构造方法类的构造方法(实参表实参表););n例如例如nCircle circle1,circle2;Circle circle1,circle2;ncircle1=new Circle();circle1=new Circle();ncircle2=new Circle(5.5);circle2=new Circle(5.5);nString s=new String(String s=new String(Hello!Hello!););对象的创建对象的创建第第23页页/共共116页页24n对象赋值对象赋值格式:格式:对象名对象名 =对象名对象名;对赋值号右边对象的要求:同类或子类对赋值号右边对象的要求:同类或子类n访问变量访问变量格式:格式:对象名对象名.变量名变量名对于类变量常用:对于类变量常用:类名类名.变量名变量名n访问方法访问方法格式:格式:对象名对象名.方法名(实参表)方法名(实参表)对于类方法常用:对于类方法常用:类名类名.方法名(实参表)方法名(实参表)对象的使用对象的使用第第24页页/共共116页页加载类加载类A A时,类变量时,类变量j j和类方法和类方法k k即被分配内存即被分配内存nullnulla1a2A0kj0 xCD010 xAB01nulla2f0 xCD260 xCD010 xCD260 xAB010 xAC02kfji00 xA002a10 xA002k0 xCD01f0 xCD26j0 xAB01i00 xBC010 xA0C0A a1,a2;A a1,a2;a1=new A();a1=new A();a2=a1;a2=a1;a2=new A();a2=new A();class Aclass A int i;/int i;/实例变量实例变量 static int j;/static int j;/类变量类变量 public float f(int a1,int a2)/public float f(int a1,int a2)/实例方法实例方法 public static float k(int a)/public static float k(int a)/类方法类方法 第第25页页/共共116页页26说明说明:(:(1 1)常用常用类名类名直接访问该类的静态成员直接访问该类的静态成员 (2 2)静态方法静态方法只能访问静态成员只能访问静态成员 (3 3)实例方法实例方法可以访问静态成员和实例成员可以访问静态成员和实例成员public class Test public class Test static int I;static int I;int a;int a;public void f()g();double pi=Math.PI;public void f()g();double pi=Math.PI;public static void g()f();/error public static void g()f();/errorint s=I;int s=I;public static void main(String args)public static void main(String args)f();/errorf();/errorg();g();int s=Test.I;int s=Test.I;new Test().f();new Test().f();System.out.println(new Test().I);System.out.println(new Test().I);对象对象第第26页页/共共116页页类的创建和对象使用示例类的创建和对象使用示例n n编写一个课程类编写一个课程类编写一个课程类编写一个课程类CourseCourse,包含:,包含:,包含:,包含:3 3个成员变量:课程编号(个成员变量:课程编号(个成员变量:课程编号(个成员变量:课程编号(cNumbercNumber)、课程名)、课程名)、课程名)、课程名(cName)(cName)和和和和学分数学分数学分数学分数(cUnit)(cUnit);1 1个方法:个方法:个方法:个方法:printCourseInfoprintCourseInfo:用于输出课程的相关信息;:用于输出课程的相关信息;:用于输出课程的相关信息;:用于输出课程的相关信息;n n编写编写编写编写CourseCourse类的测试程序类的测试程序类的测试程序类的测试程序(main(main方法方法方法方法),创建课程对象:,创建课程对象:,创建课程对象:,创建课程对象:编号为编号为编号为编号为112101112101,课程名为,课程名为,课程名为,课程名为JavaJava程序设计,学分为程序设计,学分为程序设计,学分为程序设计,学分为3 3。要。要。要。要求输出课程的相关信息。求输出课程的相关信息。求输出课程的相关信息。求输出课程的相关信息。27第第27页页/共共116页页面向过程编程与面向对象编程比较面向过程编程与面向对象编程比较n实例:编写求解长方形面积和周长的程序实例:编写求解长方形面积和周长的程序1.1.面向过程的编程方法面向过程的编程方法确定长方形周长和面积的算法。确定长方形周长和面积的算法。编写两个方法(函数)分别计算长方形的周长和面积编写两个方法(函数)分别计算长方形的周长和面积求周长的方法(函数)和求面积的方法(函数)需要求周长的方法(函数)和求面积的方法(函数)需要两个参数,分别是长方形的长和宽两个参数,分别是长方形的长和宽。2.2.面向对象的编程方法面向对象的编程方法一个长方形可以看成一个长方形对象。一个长方形可以看成一个长方形对象。一个长方形对象有两个状态(长和宽)和两个行为一个长方形对象有两个状态(长和宽)和两个行为(求周长和求面积)。(求周长和求面积)。将所有长方形的共性抽取出来,设计一个长方形类。将所有长方形的共性抽取出来,设计一个长方形类。通过长方形对象的行为,就可以求出某个具体的长方通过长方形对象的行为,就可以求出某个具体的长方形对象的周长和面积。形对象的周长和面积。28第第28页页/共共116页页面向过程编程与面向对象编程比较面向过程编程与面向对象编程比较n结构化程序设计方法与面向对象程序设计方法结构化程序设计方法与面向对象程序设计方法地比较:地比较:1.1.结构化程序设计结构化程序设计侧重于功能抽象,强调确定和分解系侧重于功能抽象,强调确定和分解系统的功能统的功能。其缺点:。其缺点:功能分解的随意性大功能分解的随意性大系统功能最不稳定,易变化系统功能最不稳定,易变化2.2.面向对象程序设计面向对象程序设计侧重于描述系统结构,侧重于描述系统结构,功能抽象功能抽象数据抽象数据抽象,其优点:,其优点:系统结构相对稳定系统结构相对稳定灵活的机制,如继承、多态和动态绑定有利于修灵活的机制,如继承、多态和动态绑定有利于修改和扩充系统功能改和扩充系统功能29第第29页页/共共116页页30主要内容n类、域、方法和实例对象类、域、方法和实例对象n继承性继承性n多态性多态性n封装性封装性n包包(package)n关键字关键字abstract、static、final和和thisn接口接口n内部类内部类n变量作用域范围和参数传递方式变量作用域范围和参数传递方式n面向对象程序设计基本思想面向对象程序设计基本思想第第30页页/共共116页页31继承性n继承是继承是OOPOOP中实现代码重用的一种方式中实现代码重用的一种方式n继承是一种从已有的类创建子类的机制继承是一种从已有的类创建子类的机制n子类继承已有类的状态和行为,并可以扩充子类继承已有类的状态和行为,并可以扩充n由继承而得到的类叫由继承而得到的类叫子类子类,被继承的类叫,被继承的类叫超类(父类)超类(父类)nJavaJava不支持多继承(子类只能有一个直接超类)不支持多继承(子类只能有一个直接超类)n处于处于JavaJava类层次结构顶端的是类层次结构顶端的是ObjectObject类类n在未指定超类的类定义中,默认超类为在未指定超类的类定义中,默认超类为ObjectObject第第31页页/共共116页页JavaJava的继承结构的继承结构n继承具有传递性继承具有传递性1.1.子类继承沿继承路径向上的所有父类的有关子类继承沿继承路径向上的所有父类的有关属性和方法。属性和方法。nJavaJava的继承结构的继承结构ObjectObjectB类类C类类ObjectA类类B1类类B2类类B22B11类类B21类类第第32页页/共共116页页33继承性的实现n格式格式 访问修饰符访问修饰符 class class 子类名子类名 extendsextends 超类名超类名 n示例示例 import javax.swing.*;import javax.swing.*;public class MyClasspublic class MyClass extends JFrame extends JFrame 第第33页页/共共116页页34关键字:instanceofn运算符运算符:instanceofn例如例如:if(pinstanceofCircle)上面的条件为上面的条件为 true,当且仅当引用当且仅当引用p所指向的所指向的对象是类对象是类Circle(或其子类或其子类)的实例对象的实例对象第第34页页/共共116页页this和和supern每个类中有两个隐含的对象每个类中有两个隐含的对象thisthis与与supersuper:1.1.thisthis是代表本类的一个对象是代表本类的一个对象,可以通过可以通过this.this.属性属性的形式的形式来引用本类的属性;来引用本类的属性;2.2.supersuper是代表父类的一个对象,可以通过是代表父类的一个对象,可以通过super.super.属性属性的的形式来引用父类的属性;形式来引用父类的属性;3.3.使用使用thisthis与与supersuper可以解决父类属性被隐藏的情况;可以解决父类属性被隐藏的情况;n如果在方法内部也有与类成员属性同名的变量,可以这样如果在方法内部也有与类成员属性同名的变量,可以这样来区分它们(以变量名为来区分它们(以变量名为x x为例):为例):1.1.x x:代表方法的局部变量代表方法的局部变量2.2.this.xthis.x:代表本类的成员属性值代表本类的成员属性值3.3.super.xsuper.x:代表从父类继承下来的但被隐藏的代表从父类继承下来的但被隐藏的x x值值第第35页页/共共116页页36nthisthis是一个代表当前对象的特殊关键字是一个代表当前对象的特殊关键字nthisthis只能用在实例方法中,不能出现在类方法中只能用在实例方法中,不能出现在类方法中n通过通过thisthis调用构造方法时只能是第调用构造方法时只能是第1 1条语句条语句class A class A int i;int i;public A(int i)public A(int i)this.i this.i=i;=i;public A(int i,int y)public A(int i,int y)this(i);this(i);this.i+=y;this.i+=y;void f()int i=3;void f()int i=3;this.i=i+5;this.i=i+5;this关键字关键字第第36页页/共共116页页37n nsupersupersupersuper是一个代表超类的特殊关键字是一个代表超类的特殊关键字是一个代表超类的特殊关键字是一个代表超类的特殊关键字n nsupersupersupersuper只能用在实例方法中,不能用在类方法中只能用在实例方法中,不能用在类方法中只能用在实例方法中,不能用在类方法中只能用在实例方法中,不能用在类方法中n n用用用用supersupersupersuper调用超类的构造方法时只能是第调用超类的构造方法时只能是第调用超类的构造方法时只能是第调用超类的构造方法时只能是第1 1 1 1条语句条语句条语句条语句n n子类的每个构造方法都必须显示子类的每个构造方法都必须显示子类的每个构造方法都必须显示子类的每个构造方法都必须显示/隐式地调用超类的某个隐式地调用超类的某个隐式地调用超类的某个隐式地调用超类的某个构造方法构造方法构造方法构造方法class A class A int i;int i;A(int i)A(int i)this.i=i;this.i=i;void Aa()void Aa()class B extends A class B extends A int i;int i;B(int i,int j)B(int i,int j)super(i);/super(i);/去掉此句会出错去掉此句会出错 super.Aa();super.Aa();this.i=super.i+j;this.i=super.i+j;super关键字关键字第第37页页/共共116页页继承规则继承规则父类父类 publicdefaultprotected private同一包中同一包中子类子类publicdefaultprotected 不被继承不被继承38第第38页页/共共116页页39n构造方法是构造方法是不可以继承不可以继承的的n子类的每个构造方法都子类的每个构造方法都必须在一开始调用父类的某一个构必须在一开始调用父类的某一个构造方法造方法;若子类的构造方法;若子类的构造方法未显式调用未显式调用父类的构造方法,则父类的构造方法,则系统默认系统默认调用的是父类的无参构造方法调用的是父类的无参构造方法,此时如果父类中不,此时如果父类中不存在无参的构造方法,就会出错存在无参的构造方法,就会出错n n创建子类对象时发生的事情创建子类对象时发生的事情创建子类对象时发生的事情创建子类对象时发生的事情若有若有若有若有 C extends BC extends BC extends BC extends B,B extends AB extends AB extends AB extends A,A extends ObjectA extends ObjectA extends ObjectA extends Object则当有则当有则当有则当有 C c=new C();C c=new C();C c=new C();C c=new C();时,时,时,时,由于构造方法的调用规则,会沿着继承分支依次向上调用其由于构造方法的调用规则,会沿着继承分支依次向上调用其由于构造方法的调用规则,会沿着继承分支依次向上调用其由于构造方法的调用规则,会沿着继承分支依次向上调用其祖先的构造方法,当到达根节点祖先的构造方法,当到达根节点祖先的构造方法,当到达根节点祖先的构造方法,当到达根节点(Object)(Object)(Object)(Object)时,即开始沿着继时,即开始沿着继时,即开始沿着继时,即开始沿着继承分支依次向下创建各父节点对象,一直到创建承分支依次向下创建各父节点对象,一直到创建承分支依次向下创建各父节点对象,一直到创建承分支依次向下创建各父节点对象,一直到创建C C C C节点对象,节点对象,节点对象,节点对象,这才完成了这才完成了这才完成了这才完成了c c c c对象的创建过程对象的创建过程对象的创建过程对象的创建过程继承规则继承规则第第39页页/共共116页页402 2、子类的成员变量与超类中、子类的成员变量与超类中同名同名的情况的情况class A class A int i;int i;A(int i)A(int i)this.i=i;this.i=i;class B extends A class B extends A int i;int i;B(int i,int j)B(int i,int j)super(i);super(i);this.i=this.i+super.i+j;this.i=this.i+super.i+j;public class Example03_ThisSuper public class Example03_ThisSuper public static void main(String args)public static void main(String args)A a=new A(1);A a=new A(1);B b=new B(3,4);B b=new B(3,4);System.out.println(a.i);System.out.println(a.i);System.out.println(b.i);System.out.println(b.i);思考去掉思考去掉B B中的中的 int i;int i;语句时的情况。语句时的情况。继承规则子类对父类属性的隐藏继承规则子类对父类属性的隐藏第第40页页/共共116页页41n n一个子类对象可赋值给一个超类对象一个子类对象可赋值给一个超类对象一个子类对象可赋值给一个超类对象一个子类对象可赋值给一个超类对象B b=new B();B b=new B();B b=new B();B b=new B();A a=b;/AA a=b;/AA a=b;/AA a=b;/A是是是是B B B B的父类的父类的父类的父类但通过但通过但通过但通过a a a a不能访问不能访问不能访问不能访问b b b b中新增加的变量和方法中新增加的变量和方法中新增加的变量和方法中新增加的变量和方法n n需要时可进行反向赋值,但需进行强制类型转换需要时可进行反向赋值,但需进行强制类型转换需要时可进行反向赋值,但需进行强制类型转换需要时可进行反向赋值,但需进行强制类型转换b=(B)ab=(B)ab=(B)ab=(B)a;则则则则b b b b得到子类定义的所有变量和方法得到子类定义的所有变量和方法得到子类定义的所有变量和方法得到子类定义的所有变量和方法父类与子类直接类型转换父类与子类直接类型转换第第41页页/共共116页页42n当一个父类对象接收不同的子类对象时,对于当一个父类对象接收不同的子类对象时,对于被覆盖的方法的调用可能会体现出动态多态性被覆盖的方法的调用可能会体现出动态多态性n思考:思考:如何确定到底调用那个类中定义的方法如何确定到底调用那个类中定义的方法?uu例子:例子:例子:例子:ExampleCH03_MyTestABC.javaExampleCH03_MyTestABC.javaExampleCH03_MyTestABC.javaExampleCH03_MyTestABC.java继承示例:继承示例:继承示例:继承示例:n n例子:例子:例子:例子:ExampleCH03_Inheritance.javaExampleCH03_Inheritance.javaExampleCH03_Inheritance.javaExampleCH03_Inheritance.java父类与子类直接类型转换父类与子类直接类型转换第第42页页/共共116页页43主要内容n类、域、方法和实例对象类、域、方法和实例对象n继承性继承性n多态性多态性n封装性封装性n包包(package)n关键字关键字abstract、static、final和和thisn接口接口n内部类内部类n变量作用域范围和参数传递方式变量作用域范围和参数传递方式n面向对象程序设计基本思想面向对象程序设计基本思想第第43页页/共共116页页44多态性n n多态性是指在类定义中出现多个构造方法或出多态性是指在类定义中出现多个构造方法或出多态性是指在类定义中出现多个构造方法或出多态性是指在类定义中出现多个构造方法或出现多个同名的成员方法。对于同名的成员方法,现多个同名的成员方法。对于同名的成员方法,现多个同名的成员方法。对于同名的成员方法,现多个同名的成员方法。对于同名的成员方法,多态性还包括在当前定义的类型中出现与其父多态性还包括在当前定义的类型中出现与其父多态性还包括在当前定义的类型中出现与其父多态性还包括在当前定义的类型中出现与其父类型同名的成员方法。类型同名的成员方法。类型同名的成员方法。类型同名的成员方法。n n优点优点优点优点:代码重用代码重用代码重用代码重用简化设计、简化代码简化设计、简化代码简化设计、简化代码简化设计、简化代码便于程序扩展便于程序扩展便于程序扩展便于程序扩展第第44页页/共共116页页45多态性的种类多态性的种类1)静态的多态性)静态的多态性重载重载在同一类中同名方法在功能上的重载,要求在同一类中同名方法在功能上的重载,要求同名的方法具有不同的参数列表同名的方法具有不同的参数列表方法:成员方法、构造方法方法:成员方法、构造方法不同参数列表:参数个数、参数类型、不同不同参数列表:参数个数、参数类型、不同的的类型排列类型排列2)动态的多态性)动态的多态性覆盖覆盖在子类和父类的类体中均定义了具有基本相同在子类和父类的类体中均定义了具有基本相同声明的非静态成员方法(不含方法修饰词声明的非静态成员方法(不含方法修饰词static)第第45页页/共共116页页46静态的多态性(重载)n n在编译时就能够被识别在编译时就能够被识别在编译时就能够被识别在编译时就能够被识别n n针对的是同一个类内的同名方法针对的是同一个类内的同名方法针对的是同一个类内的同名方法针对的是同一个类内的同名方法n n例如例如例如例如:publicintsquare(intx)publicintsquare(intx)returnx*x;returnx*x;publicdoublesquare(doublex)publicdoublesquare(doublex)returnx*x;returnx*x;第第46页页/共共116页页47识别重载方法n n识别标志识别标志:1.1.1.1.参数的个数、类型、数据类型的排列顺序参数的个数、类型、数据类型的排列顺序参数的个数、类型、数据类型的排列顺序参数的个数、类型、数据类型的排列顺序2.2.2.2.返回值不能做为识别的标志返回值不能做为识别的标志返回值不能做为识别的标志返回值不能做为识别的标志第第47页页/共共116页页48动态多态性(覆盖)n n在程序运行时才被识别在程序运行时才被识别在程序运行时才被识别在程序运行时才被识别n n重写父类的方法重写父类的方法重写父类的方法重写父类的方法1.1.1.1.要求相同的声明要求相同的声明要求相同的声明要求相同的声明2.2.2.2.子类的成员方法比其父类对应的成员方法具有相同子类的成员方法比其父类对应的成员方法具有相同子类的成员方法比其父类对应的成员方法具有相同子类的成员方法比其父类对应的成员方法具有相同或更广的访问控制方式或更广的访问控制方式或更广的访问控制方式或更广的访问控制方式n n例如例如例如例如:publicclassJ_HelloAppletextendsJAppletpublicclassJ_HelloAppletextendsJApplet publicvoidpaint(Graphicsg)publicvoidpaint(Graphicsg)g.clearRect(0,0,getWidth(),getHeight();g.clearRect(0,0,getWidth(),getHeight();g.drawString(g.drawString(小应用程序,您好小应用程序,您好小应用程序,您好小应用程序,您好!,10,20);!,10,20);第第48页页/共共116页页示例示例n nExampleCh03_Person49第第49页页/共共116页页50主要内容主要内容n类、域、方法和实例对象类、域、方法和实例对象n继承性继承性n多态性多态性n封装性封装性n包包(package)n关键字关键字abstract、static、final和和thisn接口接口n内部类内部类n变量作用域范围和参数传递方式变量作用域范围和参数传递方式n面向对象程序设计基本思想面向对象程序设计基本思想第第50页页/共共116页页51n包的概念包的概念包包是有效管理类的一种机制,它是有效管理类的一种机制,它可将相关的类组织可将相关的类组织在一起(类在包中)在一起(类在包中)包的使用能够减少命名冲突问题,能够提供更多方包的使用能够减少命名冲突问题,能够提供更多方面的保护面的保护包是分层次的,即采用树形结构定义包是分层次的,即采用树形结构定义JFCJFC中的类都存在于某个包中,使用它们时需要导入中的类都存在于某个包中,使用它们时需要导入包包第第51页页/共共116页页52n包的声明包的声明1.1.格式:格式:package package 包名包名;2.2.说明说明packagepackage语句必须是源文件的语句必须是源文件的第一条语句第一条语句声明包用于指定编译后所生成类的存放位置声明包用于指定编译后所生成类的存放位置未声明包时,为默认包,即存放在当前目录或设未声明包时,为默认包,即存放在当前目录或设定的默认目录下定的默认目录下包包第第52页页/共共116页页531.1.包名可以仅是一个合法的标识符,也可以是以包名可以仅是一个合法的标识符,也可以是以“.”分割的若干个标识符的组合,如:分割的若干个标识符的组合,如:package myselfpackage myself;package XXX.YYY.ZZZpackage XXX.YYY.ZZZ;2.2.包实际对应一个目录结构包实际对应一个目录结构例如若有包名:例如若有包名:package cn.ujn.isepackage cn.ujn.ise则应存在目录:则应存在目录:cn/ujn/isecn/ujn/ise3.3.示例:示例:Example03_Package.javaExample03_Package.java包包第第53页页/共共116页页54n导入方法导入方法1.1.import java.util.Arrays;import java.util.Arrays;import java.awt.*;import java.awt.*;import java.awt.event.*;import java.awt.event.*;2.2.注意:只有包中的公共类被导入注意:只有包中的公共类被导入n说明说明1.1.系统自动引入系统自动引入java.langjava.lang包中的类包中的类2.2.若导入的类中有重名时,会出现错误提示若导入的类中有重名时,会出现错误提示3.3.也可不导入而使用类的全名,但很不方便也可不导入而使用类的全名,但很不方便java.awt.Font f=new java.awt.Font();java.awt.Font f=new java.awt.Font();导入包中的类导入包中的类第第54页页/共共116页页55njava.langjava.lang(由系统自动导入其中的类)(由系统自动导入其中的类)njava.appletjava.appletnjava.sqljava.sqlnjava.awtjava.awtnjava.awt.eventjava.awt.eventnjavax.swingjavax.swingnjavax.swing.eventjavax.swing.eventJava中常用的包中常用的包第第55页页/共共116页页56主要内容n n类、域、方法和实例对象类、域、方法和实例对象类、域、方法和实例对象类、域、方法和实例对象n n继承性继承性继承性继承性n n多态性多态性多态性多态性n n封装性封装性封装性封装性n n包包包包(package)(package)n n关键字关键字关键字关键字abstractabstract、staticstatic、finalfinal和和和和thisthisn n接口接口接口接口n n内部类内部类内部类内部类n n变量作用域范围和参数传递方式变量作用域范围和参数传递方式变量作用域范围和参数传递方式变量作用域范围和参数传递方式n n面向对象程序设计基本思想面向对象程序设计基本思想面向对象程序设计基本思想面向对象程序设计基本思想第第56页页/共共116页页访问权限访问权限nJava中通过设置类的访问权限和类中成员的访问中通过设置类的访问权限和类中成员的访问权限,来实现封装的特性。权限,来实现封装的特性。n包的访问包的访问1.1.包的访问是没有控制的,根据需要导入即可包的访问是没有控制的,根据需要导入即可n
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 办公文档 > 教学培训


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

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


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