Ch面向对象程序设计实用

上传人:仙*** 文档编号:233655245 上传时间:2023-10-12 格式:PPTX 页数:116 大小:511.98KB
返回 下载 相关 举报
Ch面向对象程序设计实用_第1页
第1页 / 共116页
Ch面向对象程序设计实用_第2页
第2页 / 共116页
Ch面向对象程序设计实用_第3页
第3页 / 共116页
点击查看更多>>
资源描述
1面向对象程序设计整体介绍面向对象程序设计(OOP)将数据(属性)和方法(行为或功能)封装到类(classes)中数据与方法常常是紧密相关的对象(objects):类的实例对象或类本身三个基本特性:封装性、继承性和多态性封装性状态 -成员变量功能 -成员方法继承性在已有类的基础上进行扩展(继承)产生子类实现代码重用和功能的扩充多态性方法重载(overloadoverload)-静态方法覆盖(overwriteoverwrite)-动态第第2页页/共共116页页第1页/共116页2比较结构化程序设计对应的典型的计算机语言,例如:C面向操作(action)的函数(方法)是程序的基本单位面向对象程序设计对应的典型的计算机语言,例如:Java面向对象(object)的类(class)是程序的基本单位方法(函数)被封装在类中数据也常常被封装在类中第第3页页/共共116页页第2页/共116页3面向对象程序设计的主要工作n了解已有类的基本情况(JFCJFC)n扩展(继承)已有类建立自己的新类n创建需要的对象n实现对象之间的交互来完成系统目标第第4页页/共共116页页第3页/共116页4类类是组成JavaJava程序的基本单元JavaJava程序结构如何?类(类型)是用来创建对象(变量)的模板int a;int a;ClassName a;ClassName a;类(class)本身也是一种对象类(class)同时也是实例对象的模板类(class)的基本组成:(成员)域和(成员)方法 每个对象:拥有内存存储成员域/方法静态的成员域/方法属于类其它成员域/方法属于实例对象第第5页页/共共116页页第4页/共116页5类的定义1.1.格式 访问修饰符 class ClassName class ClassName 成员变量声明;/属性-状态 成员方法声明;/功能-行为 2.2.说明访问修饰符可以是publicpublic或省略成员变量和成员方法的声明顺序无严格要求成员变量定义:类型 变量名或带初始化的变量名列表成员方法的定义:返回类型 方法名(参数列表)第第6页页/共共116页页第5页/共116页63.3.举例(Example03_Circle.javaExample03_Circle.java)public class Example0301_Circlepublic class Example0301_Circle double r;double r;double s;double s;void setR(double r1)r=r1;void setR(double r1)r=r1;double getR()return r;double getR()return 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页页第6页/共116页7变量的种类成员变量(定义在所有方法的外面)a)a)实例成员变量(简称实例变量)b)b)类成员变量(简称类变量 或 静态变量)局部变量(定义在某方法的内部)a)a)包含形式参数(简称形参)注意:在JavaJava中没有全局变量的概念成员变量第第8页页/共共116页页第7页/共116页8n变量的声明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页页第8页/共116页93.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页页第9页/共116页10实例变量和类变量在整个类中有效局部变量只在定义它的复合语句中有效若成员变量与局部变量同名,则在局部变量的作用域内成员变量被隐藏(尽量避免重名)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页页第10页/共116页11成员方法定义与C+C+程序不同的是:每个方法都必须隶属于某个类方法的种类实例方法类方法方法定义的格式:方法修饰词 返回类型 方法名(方法的参数列表)局部变量说明部分;/不一定有语句部分;/一般要有,以实现方法的功能 /public/public,protectedprotected,省略,privateprivate第第12页页/共共116页页第11页/共116页12说明:方法名:任何一个合法的标识符参数列表:用逗号(,)分隔开返回类型:返回数据的数据类型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页页第12页/共116页13返回控制如果没有值返回:return;/退出该方法或者遇到该方法的最后一个“”,则退出该方法如果有值返回:return 表达式;/退出该方法返回该表达式的值第第14页页/共共116页页第13页/共116页14方法重载是指一个类中具有同一个名字的方法可有不同的签名(参数不同)返回值类型和参数名不参与比较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页页第14页/共116页15构造方法构造方法在创建新的实例对象时起作用构造方法通常用来初始化实例对象,例如:初始化成员域或设置工作环境构造方法的特点:与类同名没有返回值可以含有多种构造方法(重载)但必须具有不同的参数列表第第16页页/共共116页页第15页/共116页16默认的构造方法如果没有显式地定义类的构造方法,则系统会为该类定义一个默认的构造方法。该构造方法不含任何参数。这个默认的构造方法首先调用其父类的不含任何参数的构造方法,然后初始化新生成的实例的各个成员域变量 默认值:基本数值类型:0 0;booleanboolean:falsefalse;引用数据类型:nullnull最好自己写构造方法一旦在类中定义了构造方法,系统就不会再创建这个默认的不含参数的构造方法。第第17页页/共共116页页第16页/共116页17构造方法示例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页页第17页/共116页18n最终方法是一种用finalfinal关键字修饰的方法n最终方法不能被子类重写,但可重载public class Tom public class Tom public public finalfinal void func()void func()最终方法第第19页页/共共116页页第18页/共116页19抽象方法是一种用abstractabstract关键字修饰的方法抽象方法只声明,不实现(没有方法体)抽象方法一般都要被子类重写,抽象类一般由子类继承,且子类要实现其中所有的抽象方法;否则子类也要声明为抽象的抽象类的对象不能用newnew创建抽象类中可以没有抽象方法若一个类中含有抽象方法则该类必须为抽象类(注意TomTom类的定义)思考:finalfinal和abstractabstract是否可同时修饰一个方法public public abstractabstract class Tom class Tom public public abstractabstract void func();void func();抽象方法第第20页页/共共116页页第19页/共116页20对象的概念n对象是一个动态概念,具有产生、使用和消亡的生命周期n通过newnew操作符创建对象n对象属性的使用:n对象名.属性;n对象方法的使用:n对象名.方法名();n当对象不再使用时,将由系统的垃圾回收机制进行回收。对象第第21页页/共共116页页第20页/共116页21n格式:访问修饰符 类名 对象名;n例如class ClassName class ClassName private String s;private String s;Circle circle;Circle circle;public String func()public String func()public final ClassName a;public final ClassName a;return return The String is:The String is:+s;+s;n与基本数据类型的变量声明格式类似对象的声明第第22页页/共共116页页第21页/共116页22格式:对象名 =new=new 类的构造方法(实参表););例如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页页第22页/共116页23n对象赋值格式:对象名 =对象名;对赋值号右边对象的要求:同类或子类n访问变量格式:对象名.变量名对于类变量常用:类名.变量名n访问方法格式:对象名.方法名(实参表)对于类方法常用:类名.方法名(实参表)对象的使用第第24页页/共共116页页第23页/共116页加载类A A时,类变量j j和类方法k k即被分配内存nullnulla1a2A0kj0 xCD010 xAB01nulla2f0 xCD260 xCD010 xCD260 xAB010 xAC02kfji00 xA002a10 xA002k0 xCD01f0 xCD26j0 xAB01i00 xBC010 xA0C0A a1,a2;a1=new A();a2=a1;a2=new A();class A int i;/实例变量 static int j;/类变量 public float f(int a1,int a2)/实例方法 public static float k(int a)/类方法 第第25页页/共共116页页第24页/共116页25说明:(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页页第25页/共116页类的创建和对象使用示例编写一个课程类Course,包含:3个成员变量:课程编号(cNumber)、课程名(cName)和学分数(cUnit);1个方法:printCourseInfo:用于输出课程的相关信息;编写Course类的测试程序(main方法),创建课程对象:编号为112101,课程名为Java程序设计,学分为3。要求输出课程的相关信息。26第第27页页/共共116页页第26页/共116页面向过程编程与面向对象编程比较实例:编写求解长方形面积和周长的程序1.1.面向过程的编程方法确定长方形周长和面积的算法。编写两个方法(函数)分别计算长方形的周长和面积求周长的方法(函数)和求面积的方法(函数)需要两个参数,分别是长方形的长和宽。2.2.面向对象的编程方法一个长方形可以看成一个长方形对象。一个长方形对象有两个状态(长和宽)和两个行为(求周长和求面积)。将所有长方形的共性抽取出来,设计一个长方形类。通过长方形对象的行为,就可以求出某个具体的长方形对象的周长和面积。27第第28页页/共共116页页第27页/共116页面向过程编程与面向对象编程比较结构化程序设计方法与面向对象程序设计方法地比较:结构化程序设计侧重于功能抽象,强调确定和分解系统的功能。其缺点:功能分解的随意性大系统功能最不稳定,易变化面向对象程序设计侧重于描述系统结构,功能抽象数据抽象,其优点:系统结构相对稳定灵活的机制,如继承、多态和动态绑定有利于修改和扩充系统功能28第第29页页/共共116页页第28页/共116页29主要内容类、域、方法和实例对象继承性多态性封装性包(package)关键字abstract、static、final和this接口内部类变量作用域范围和参数传递方式面向对象程序设计基本思想第第30页页/共共116页页第29页/共116页30继承性继承是OOPOOP中实现代码重用的一种方式继承是一种从已有的类创建子类的机制子类继承已有类的状态和行为,并可以扩充由继承而得到的类叫子类,被继承的类叫超类(父类)JavaJava不支持多继承(子类只能有一个直接超类)处于JavaJava类层次结构顶端的是ObjectObject类在未指定超类的类定义中,默认超类为ObjectObject第第31页页/共共116页页第30页/共116页JavaJava的继承结构继承具有传递性子类继承沿继承路径向上的所有父类的有关属性和方法。JavaJava的继承结构ObjectObjectB类C类ObjectA类B1类B2类B22B11类B21类第第32页页/共共116页页第31页/共116页32继承性的实现格式 访问修饰符 class class 子类名 extendsextends 超类名 示例 import javax.swing.*;import javax.swing.*;public class MyClasspublic class MyClass extends JFrame extends JFrame 第第33页页/共共116页页第32页/共116页33关键字:instanceof运算符:instanceof例如:if(p instanceof Circle)上面的条件为 true,当且仅当引用p所指向的对象是类Circle(或其子类)的实例对象第第34页页/共共116页页第33页/共116页this和super每个类中有两个隐含的对象thisthis与supersuper:thisthis是代表本类的一个对象,可以通过this.this.属性的形式来引用本类的属性;supersuper是代表父类的一个对象,可以通过super.super.属性的形式来引用父类的属性;使用thisthis与supersuper可以解决父类属性被隐藏的情况;如果在方法内部也有与类成员属性同名的变量,可以这样来区分它们(以变量名为x x为例):x x:代表方法的局部变量this.xthis.x:代表本类的成员属性值super.xsuper.x:代表从父类继承下来的但被隐藏的x x值第第35页页/共共116页页第34页/共116页35thisthis是一个代表当前对象的特殊关键字thisthis只能用在实例方法中,不能出现在类方法中通过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页页第35页/共116页36supersuper是一个代表超类的特殊关键字supersuper只能用在实例方法中,不能用在类方法中用supersuper调用超类的构造方法时只能是第1 1条语句子类的每个构造方法都必须显示/隐式地调用超类的某个构造方法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页页第36页/共116页继承规则父类父类 publicdefaultprotected private同一包中同一包中子类子类publicdefaultprotected不被继承不被继承37第第38页页/共共116页页第37页/共116页38构造方法是不可以继承的子类的每个构造方法都必须在一开始调用父类的某一个构造方法;若子类的构造方法未显式调用父类的构造方法,则系统默认调用的是父类的无参构造方法,此时如果父类中不存在无参的构造方法,就会出错创建子类对象时发生的事情若有 C extends BC extends B,B extends AB extends A,A extends A extends ObjectObject则当有 C c=new C();C c=new C();时,由于构造方法的调用规则,会沿着继承分支依次向上调用其祖先的构造方法,当到达根节点(Object)(Object)时,即开始沿着继承分支依次向下创建各父节点对象,一直到创建C C节点对象,这才完成了c c对象的创建过程继承规则第第39页页/共共116页页第38页/共116页392 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页页第39页/共116页40一个子类对象可赋值给一个超类对象B b=new B();B b=new B();A a=b;/AA a=b;/A是B B的父类但通过a a不能访问b b中新增加的变量和方法需要时可进行反向赋值,但需进行强制类型转换b=(B)ab=(B)a;则b b得到子类定义的所有变量和方法父类与子类直接类型转换第第41页页/共共116页页第40页/共116页41当一个父类对象接收不同的子类对象时,对于被覆盖的方法的调用可能会体现出动态多态性思考:如何确定到底调用那个类中定义的方法?u例子:ExampleCH03_MyTestABC.javaExampleCH03_MyTestABC.java继承示例:例子:ExampleCH03_Inheritance.javaExampleCH03_Inheritance.java父类与子类直接类型转换第第42页页/共共116页页第41页/共116页42主要内容类、域、方法和实例对象继承性多态性封装性包(package)关键字abstract、static、final和this接口内部类变量作用域范围和参数传递方式面向对象程序设计基本思想第第43页页/共共116页页第42页/共116页43多态性多态性是指在类定义中出现多个构造方法或出现多个同名的成员方法。对于同名的成员方法,多态性还包括在当前定义的类型中出现与其父类型同名的成员方法。优点:代码重用简化设计、简化代码便于程序扩展第第44页页/共共116页页第43页/共116页44多态性的种类1)静态的多态性重载 在同一类中同名方法在功能上的重载,要求同名的方法具有不同的参数列表 方法:成员方法、构造方法 不同参数列表:参数个数、参数类型、不同的 类型排列2)动态的多态性覆盖 在子类和父类的类体中均定义了具有基本相同声明的非静态成员方法(不含方法修饰词static)第第45页页/共共116页页第44页/共116页45静态的多态性(重载)在编译时就能够被识别针对的是同一个类内的同名方法例如:public int square(int x)return x*x;public double square(double x)return x*x;第第46页页/共共116页页第45页/共116页46识别重载方法识别标志:参数的个数、类型、数据类型的排列顺序返回值不能做为识别的标志第第47页页/共共116页页第46页/共116页47动态多态性(覆盖)在程序运行时才被识别重写父类的方法要求相同的声明子类的成员方法比其父类对应的成员方法具有相同或更广的访问控制方式例如:public class J_HelloApplet extends JApplet public void paint(Graphics g)g.clearRect(0,0,getWidth(),getHeight();g.drawString(小应用程序,您好!,10,20);第第48页页/共共116页页第47页/共116页示例ExampleCh03_Person48第第49页页/共共116页页第48页/共116页49主要内容类、域、方法和实例对象继承性多态性封装性包(package)关键字abstract、static、final和this接口内部类变量作用域范围和参数传递方式面向对象程序设计基本思想第第50页页/共共116页页第49页/共116页50包的概念包是有效管理类的一种机制,它可将相关的类组织在一起(类在包中)包的使用能够减少命名冲突问题,能够提供更多方面的保护包是分层次的,即采用树形结构定义JFCJFC中的类都存在于某个包中,使用它们时需要导入包第第51页页/共共116页页第50页/共116页51包的声明1.1.格式:package package 包名;2.2.说明packagepackage语句必须是源文件的第一条语句声明包用于指定编译后所生成类的存放位置未声明包时,为默认包,即存放在当前目录或设定的默认目录下包第第52页页/共共116页页第51页/共116页521.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页页第52页/共116页53导入方法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.注意:只有包中的公共类被导入说明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页页第53页/共116页54java.langjava.lang(由系统自动导入其中的类)java.appletjava.appletjava.sqljava.sqljava.awtjava.awtjava.awt.eventjava.awt.eventjavax.swingjavax.swingjavax.swing.eventjavax.swing.eventJava中常用的包第第55页页/共共116页页第54页/共116页55主要内容类、域、方法和实例对象继承性多态性封装性包(package)关键字abstract、static、final和this接口内部类变量作用域范围和参数传递方式面向对象程序设计基本思想第第56页页/共共116页页第55页/共116页访问权限Java中通过设置类的访问权限和类中成员的访问权限,来实现封装的特性。包的访问包的访问是没有控制的,根据需要导入即可类的访问修饰符public:公共类,任何类都可以访问默认(省略):友好类,同一包中的类可访问修饰符修饰符同包同包不同包不同包publicYesYes默认默认YesNo第第57页页/共共116页页第56页/共116页57类成员的封装性成员(域或方法)的访问控制方式:1)public2)private3)protected4)default(缺省方式)第第58页页/共共116页页第57页/共116页58成员的访问控制方式:public访问权限最大,可以在不同类、不同包的类中访问。package p1;public class Areapublic float getArea(float r)System.out.print(方法一:);return 3.14f*r*r;public double getArea(float x,int y)System.out.print(方法二:);return x*y;package p2;import p1.Area;class AreaTestpublic static void main(String args)Area a=new Area();System.out.println(a.getArea(2.0f);System.out.println(a.getArea(12,2.7f);第第59页页/共共116页页第58页/共116页59成员的访问控制方式:private目的:隐藏具体的实现细节访问权限最小,只能在同一个类中被访问。同一个类的方法中直接访问。同一个类的对象也可以引用本类的私有成员。class Tomprivate float weight;private static String name;private void out()System.out.println(name+体重:+weight+斤);public static void main(Stringargs)Tom.name=汤姆猫;Tom cat=new Tom();cat.weight=20;cat.out();第第60页页/共共116页页第59页/共116页成员的访问控制方式:private类中的私有成员不能在另一个类中引用私有的类变量和类方法也只能在本类中使用。60classJerrypublicstaticvoidmain(Stringargs)Tom.name=汤姆猫汤姆猫;/非法使用类变量非法使用类变量Tomcat=newTom();cat.weight=20;/非法引用变量非法引用变量weightcat.out();/非法调用方法非法调用方法out()第第61页页/共共116页页第60页/共116页61域常常是private 采用 public“get”方法读取数据采用 public“set”方法写数据class Tom private float weight;private static String name;public String getName()return name;public void setName(String name)this.name=name;成员的访问控制方式:private第第62页页/共共116页页第61页/共116页62成员的访问控制方式:protected介于public 和private之间同一个包内的所有类的所有方法都能访问该成员如果不在同一个包内的类的方法要访问该成员,则该类必须是该成员所在的类的子类第第63页页/共共116页页第62页/共116页63成员的访问控制方式:default(缺省方式)只有在同一个包内的类的方法才能访问该方法 第第64页页/共共116页页第63页/共116页64类成员封装性总结区分:类的访问控制方式区分:类的访问控制方式第第65页页/共共116页页第64页/共116页说明-类的继承性子类和父类在同一包中子类可继承其父类中非私有成员(不是private的成员)子类和父类不在同一包中子类只能继承受保护的和共有成员(public、protected)65第第66页页/共共116页页第65页/共116页综合练习创建软件包cn.edu.ujn,将Course类加入该包内将上例Course类的3个成员变量改为私有,并为其添加相应的set和get方法。并修改测试程序。为Course类添加构造方法,用于初始化课程编号、课程名和学分。并修改测试程序。为Course类添加一个静态变量cTotalNum,用于统计创建的课程对象数。并修改测试程序。第第67页页/共共116页页第66页/共116页67主要内容类、域、方法和实例对象继承性多态性包(package)封装性关键字abstract、static、final接口内部类变量作用域范围和参数传递方式面向对象程序设计基本思想第第68页页/共共116页页第67页/共116页用关键字abstractabstract修饰的类就是抽象类。没有方法体的方法,且首部用关键字abstractabstract修饰,就是抽象方法。声明抽象方法的格式:修饰符abstract abstract 返回值类型 方法名(形参列表););68抽象类(abstract)第第69页页/共共116页页第68页/共116页69抽象类(abstract)Java允许定义抽象(abstract)的类和方法抽象(abstract)的方法可以只提供方法的头部,但不提供实现的部分抽象(abstract)的方法只能是抽象(abstract)类中的方法例如:publicabstractclassAnimal publicStringname;publicintage;publicvoidprint()System.out.println(名字:+name);System.out.println(大小:+age);publicabstractvoidrun();publicabstractvoidcry();publicclassAnimal/错误错误publicStringname;publicintage;publicvoidprint()System.out.println(名字名字:+name);System.out.println(大小大小:+age);publicabstractvoidrun();publicabstractvoidcry();第第70页页/共共116页页第69页/共116页抽象类相关规则含有抽象方法的类必须用abstractabstract修饰,成为抽象类,抽象类中可以包含其他的非抽象方法;抽象类不能被实例化;如果从一个抽象类继承,而且想生成新类型的一个对象,就必须实现抽象基类中的每一个抽象方法,否则,派生类也必须使用abstractabstract修饰成为抽象类。抽象类对象变量可以用来引用派生类的对象;若A是抽象类,非抽象类B继承了A,可以有:A a=new B();70第第71页页/共共116页页第70页/共116页抽象方法与抽象类使用说明如果子类没有实现抽象基类(父类)中所有的抽象方法,则子类也必须定义成一个抽象类。即:抽象的子类也必须使用修饰符:abstract可以将没有任何抽象方法的类声明为abstract,避免由这个类直接创建任何的对象。abstract class Dog extends AnimalString type;public Dog()type=宠物狗;/public void run()public void cry()System.out.println(汪汪叫);71abstract class CatString type;public Dog()type=“宠物猫;public void cry()System.out.println(type);第第72页页/共共116页页第71页/共116页class Bird extends Animal/定义鸟类继承动物类public Bird()/构造方法初始化name=麻雀;age=3;public void run()/实现父类的抽象方法System.out.println(会飞);public void cry()System.out.println(叽叽喳喳);创建鸟类对象:练习示例:ExampleCh03_abstract.java72第第73页页/共共116页页第72页/共116页练习73抽象类:图形,抽象方法求面积(指出:图形必须有求面积的方法,但因为不同图形求面积的方法不一样,因此将此方法声明为抽象方法)子类:梯形类,实现了抽象类中求面积的抽象方法子类:圆,实现了抽象类中求面积的抽象方法。子类:长方形,实现了抽象类中求面积的抽象方法应用程序类:创建梯形、圆、长方形对象,分别进行计算。第第74页页/共共116页页第73页/共116页小结用abstract关键字来修饰一个类时,这个类叫做抽象类;用abstract来修饰一个方法时,该方法叫做抽象方法。abstract类必须被继承,abstract方法必须被重写抽象类不能被实例化(直接创建对象)。抽象方法只需声明,而不需实现(无方法体)74第第75页页/共共116页页第74页/共116页75关键字:static静态的(static)域和静态的(static)方法实际上隶属于类对象 静态的(static)域示例:System.out静态的(static)方法示例:main()示例:Math.sqrt()npublic static double sqrt(double a)第第76页页/共共116页页第75页/共116页76关键字:final可以修饰的对象:1)final 域:相当于定义常量,只能初始化一次,以后其值不能被修改2)final 方法:最终方法不能被子类重写,但可重载3)final 类:最终类,不能被其他类所继承示例:Examplech03_final.java思考:finalfinal和abstractabstract是否可同时修饰一个方法第第77页页/共共116页页第76页/共116页77主要内容类、域、方法和实例对象继承性多态性包(package)封装性关键字abstract、static、final和this接口内部类变量作用域范围和参数传递方式面向对象程序设计基本思想第第78页页/共共116页页第77页/共116页为什么要使用接口?类继承对于重用超类中的代码很有用,而Java只支持单继承,在遇到需要多继承的情况,可以通过接口来帮助实现。接口的使用是java的OOP概念中的“多态性”的一种表现。可以将接口理解为一个严格定义的抽象类。接口是一组抽象方法的定义和在类间共享它们的一种方式。78第第79页页/共共116页页第78页/共116页例如:类A类B类C吃早餐(三明治);吃早餐(喝咖啡);吃早餐(三明治);吃午餐(吃面条);吃午餐(吃苹果);吃午餐(吃西餐);吃晚餐(吃牛排);吃晚餐(麦当劳);吃晚餐(自助餐);接口是一组抽象行为,其可以结合到任何类,可以把行为添加到没有被超类提供的类中。综合为接口:接口 一日三餐 吃早餐();吃午餐();吃晚餐();79第第80页页/共共116页页第79页/共116页80接口(interface)接口是一组抽象方法定义和常量的集合,在接口中没有提供方法的实现。Java的接口是为相互没有关系的类实现同样的一组方法而提供的一种手段。接口是用来被使用的。定义为:publicinterface接口名成员变量:但它们必须是说明为public,static和final的常量成员方法:这些方法不能够有方法体。如同抽象方法一样,是用publicabstract修饰的方法。第第81页页/共共116页页第80页/共116页81示例接口(interface)中所有的方法和域必须都是 public的每个接口一般定义在一个.java 文件中 例1:通过接口定义一些常量public interface J_Constants public static final int ONE=1;public static final int TWO=2;public static final int THREE=3;/接口J_Constants结束例2:interface J_Shape public abstract void mb_draw(Graphics2D g);/接口J_Shape结束第第82页页/共共116页页第81页/共116页使用接口使用接口用implements关键字在类的定义中使用接口例如:publicclassBextendsAimplementsmyInterfaces类体82第第83页页/共共116页页第82页/共116页83注意事项接口中成员方法的默认方式是 public 和 abstract实现接口中的方法要用publicpublic修饰若未实现所有方法,该类必须是abstractabstract类public class C implements Runnable,ActionListener public void run()public void actionPerformed(ActionEvent evt)Runnable runnable1=new Runnable();Runnable runnable2=new C();ActionListener action=new C();第第84页页/共共116页页第83页/共116页84接口中成员域的默认方式是public、static和final接口不能用newnew实例化,但可接收赋值public class C implements Runnable,ActionListener public void run()public void actionPerformed(ActionEvent evt)Runnable runnable1=new Runnable();Runnable runnable2=new C();ActionListener action=new C();注意事项第第85页页/共共116页页第84页/共116页接口与抽象类的差别按照类的按照类的封装概念封装概念接接口口抽抽象象类类变量变量常量:必须同时使用常量:必须同时使用public,static和和final3个修饰符个修饰符没有限制没有限制方法方法所有方法只能被声明而不能所有方法只能被声明而不能被定义,并且都是被定义,并且都是public的的实现接口的一定要实现接口里定义的所有方法至少有一个方法只被至少有一个方法只被声明而没有被定义声明而没有被定义实现抽象类可以有选择地重写需要用到的方法用途用途被使用被使用被继承被继承85第第86页页/共共116页页第85页/共116页例如:publicinterfaceShapepublicabstractvoiddraw(Graphicg);publicinterfaceRectextendsShapepublicabstractvoidsetSize(Dimensionsize);publicabstractDimensiongetSize();86第第87页页/共共116页页第86页/共116页优点先定义一个抽象类的协议而不管其具体实现。多个类可共享相同的接口,相互间不用管其它类是如何定义该接口的方法。如果你使用了接口,其它用户就可以了解到如何调用这个类的方法。87第第88页页/共共116页页第87页/共116页类爷爷类奶奶类爸爸类妈妈聪明谦虚幽默善良Class 小明 extends 爸爸 幽默java 不支持多继承,所以小明不能用多继承的方式继承大家的优点:class 小明 extends 爸爸,妈妈,爷爷,奶奶n间接实现对类的多重继承作用88优点第第89页页/共共116页页第88页/共116页interface遗传聪明;/爷爷的优点谦虚;/奶奶的优点善良;/妈妈的优点class 小明 extends 爸爸 implements 遗传 /完美的小明 通过接口来达到目的:89优点第第90页页/共共116页页第89页/共116页90优点一个类可以继承多个接口例如:示例:Example03_Interface.javaExample03_Interface.javapublic class A extends B implements C,D 第第91页页/共共116页页第90页/共116页接口回调使用接口变量进行访问时,称为接口回调使用接口变量只能访问接口中声明的方法示例:ExampleCh03_interface_requestback.java91第第92页页/共共116页页第91页/共116页关于通用类型的说明接口变量 =实现该接口的类对象;设I I是接口,A A类实现了I I,则:I i=new A();I i=new A();A a=(A)i;A a=(A)i;A a=i;A a=i;父类对象 =该类的子类对象;设X X是Y Y的父类,则:X x=new Y();X x=new Y();Y y=(X)x;Y y=(X)x;Y y=x;Y y=x;从多继承角度说,接口是实现该接口类的父类父类型 x=ne
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


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

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


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