第三章-面向对象上课件

上传人:沈*** 文档编号:241652772 上传时间:2024-07-13 格式:PPT 页数:65 大小:198.50KB
返回 下载 相关 举报
第三章-面向对象上课件_第1页
第1页 / 共65页
第三章-面向对象上课件_第2页
第2页 / 共65页
第三章-面向对象上课件_第3页
第3页 / 共65页
点击查看更多>>
资源描述
第三章面向对象上7/13/20241本章内容:n面向对象的概念n类和对象n构造方法n方法和方法的参数传递nstaticn内部类7/13/202421.面向对象的概念n问题:求长方形的面积和周长?n通常面向过程作如下思考:1.长方形的面积和周长算法2.编写两个方法,就是如何求的3.要考虑需要那些参数(长,宽)7/13/20243面向过程的程序代码:intzc(intlength,intwidth)return2*(length+width);intmj(intlength,intwidth)returnlength*width;voidmain(stringargs)println(长方形的周长为:+zc(10,5);println(长方形面积为:+mj(10,5);7/13/20244面向对象的思想:n1.一个长方形可以看成是一个长方形对象n2.一个长方形对象有两个状态(长和宽),两种行为(求周长和求面积)n3.将所有长方形的共性抽取出来,设计一个类n4.通过长方形对象的行为,就可以求出某个具体长方形对象的周长和面积7/13/20245设计的类RectanglenclassRectangle intlength,width;/定义两个参数/定义一个方法,用于求周长 intperimeter()return2*(length+width)/定义一个方法,用于求面积 intarea()returnlength*width 7/13/20246cont.public class Test publicstaticvoidmain(Stringargs)Rectanglerect1=newRectangle();rect1.length=10;rect1.width=5;System.out.println(“方形的周长为”+rect1.perimeter();System.out.println(“长方形的面积为”+rect1.area();7/13/202472.类和对象n对象对象有两个层次的概念n现实生活中对象指的是客观世界的实体;n程序中对象就是一组变量和相关方法的集合,其中变量表明对象的状态,方法表明对象所具有的行为。变量变量方法方法7/13/20248类class Car class Car int color_number;int color_number;int door_number;int door_number;int speed;int speed;void brake()void brake()void speedUp()void speedUp()void slowDown()void slowDown()现实生活中的对象可以将现实生活中的对象可以将现实生活中的对象经过抽象,映射为程序中经过抽象,映射为程序中的对象。对象在程序中是的对象。对象在程序中是通过一种抽象数据类型来通过一种抽象数据类型来描述的,这种抽象数据类描述的,这种抽象数据类型称为类(型称为类(class)。)。抽象数据类型7/13/20249类n类是描述对象的“基本原型”,它定义一类对象所能拥有的数据和能完成的操作。在面向对象的程序设计中,类是程序的基本单元。n类是创建对象的模型,模式或蓝图。但它没有保留用于存储数据的空间。每个对象都是类的一个实例,并拥有存储自己数据的空间,因此有自己的状态房屋的设计蓝图-根据蓝图建造的房屋类对象类是创建对象的模型,模式或蓝图7/13/202410类Carcar1;Carcar2;CarcarN;7/13/202411类的成员n域变量(field):与类及其对象相关联的数据变量,其中保存类或对象的状态。n方法(method):包含类的可执行代码并定义了对象的行为。7/13/202412类定义的语法规范类的修饰符类的修饰符 class 类名称类名称 extends 父类名称父类名称implements 接口名称列表接口名称列表 变量定义及初始化;变量定义及初始化;方法定义及方法体;方法定义及方法体;类体,其类体,其中定义了该类中所有中定义了该类中所有的变量和该类所支持的方法,的变量和该类所支持的方法,称为成员变量和成员方法。称为成员变量和成员方法。类的修饰符:public abstract|final 缺省方式为缺省方式为 friendly7/13/202413域变量-field域修饰符域修饰符 域变量数据类型域变量数据类型 域名域名1,域名域名2=变量初值变量初值;public|protected|private static final transient volatile成员变量的类型可以是Java中任意的数据类型,包括简单类型,类,接口,数组。在一个类中的成员变量应该是唯一的。7/13/202414方法方法修饰字方法修饰字 返回类型返回类型 方法名称方法名称(参数参数1,参数参数2,)throws exceptionList (statements;)/方法体:方法的内容方法体:方法的内容public|protected|private static final|abstract native synchronized返回类型可以是任意的Java数据类型,当一个方法不需要返回值时,返回类型为void。7/13/202415cont.n参数的类型可以是简单数据类型,也可以是引用数据类型(数组、类或接口),参数传递方式是值传递。n若声明了方法的返回值类型,则在方法体结尾要有“return表达式;”语句。注意类型要一致。n方法体是对方法的实现。它包括局部变量的声明以及所有合法的Java指令。局部变量的作用域只在该方法内部。7/13/202416对象的产生和使用n对象的创建n通过new操作符创建一个对象实例例如:Car c1=new Car();n对象的引用和对象是两个不同的概念:对象的引用变量存储了对象的地址.7/13/202417n对象的构造过程n为对象开辟空间,并对对象的成员变量进行缺省的初始化;n对成员变量进行指定的初始化;n调用构造方法。7/13/202418域变量的缺省初值nJava中域变量的缺省初值都是确定的:nchar变量的初值为:u0000nboolean变量的初值为:falsenbyte,short,int,long变量的初值为:0nfloat变量的初值为:0.0fndouble变量的初值为:0.0n引用变量的初值为:null7/13/202419对象的使用n对象的使用:对象的使用是通过一个引用类型的变量来实现,包括引用对象的成员变量和方法,通过运算符“.”可以实现对变量的访问和方法的调用。n例如:nCar demoCar=new Car();ndemoCar.setNumber(9999);n/多个引用可以指向同一个对象nCar de=demoCar;7/13/202420class Car int carNumber;void setNumber(int carNum)carNumber=carNum;void showNumber()System.out.println(“My car No.is:”+carNumber);public class CarDemo public static void main(String args)Car demoCar=new Car();demoCar.setNumber(9999);demoCar.showNumber();My car No.is:99997/13/202421对象的比较n=:比较两个变量的值是否相等。基本类型:引用类型:变量的值就是其中存放对象的地址(两个引用变量是否指向同一个对象)n方法equals()比较两个对象的内容是否相等。注意:类Object中的equals()方法默认的认为对象只有和自己是相等,除非重写该方法。7/13/202422例如:String str1=new String(“abc”);String str2=new String(“abc”);String str3=str1;str1=str2,str1=str3?str1.equals(str2),str1.equals(str3)?结论:String类中重写了Object中的equlas()方法,只要两个字符串的内容相等,就认为是为true.7/13/202423class A int i;A a1=new A();A a2=new A();a1=a2?a1.equals(a2)?结论:如果是自己定义的类默认情况下,对象只和自己是相等的7/13/2024243.构造方法(Constructor)nJava中的每个类都有构造方法,用来初始化该类的一个新的对象。n构造方法具有和类名相同的名称;n不返回数值,也不能用void,也不能包含return;n系统会在创建对象时会自动执行构造方法。n构造方法应包含的内容是:初始化对象的成员变量,其它的初始化工作7/13/202425缺省的构造方法n如果程序中没有定义构造方法,则创建实例时使用是系统产生的缺省构造方法,它是一个无内容的空方法。n相反,一旦定义了自己的构造方法,就不会使用默认的构造方法了。7/13/202426class Person String name=“unknown”;int age=-1;public void Person(String n)name=n;Person li=new Person(“li”);Person liu=new Person();7/13/202427调用重载的构造方法n一个类可以有多个构造方法(重载),根据创建对象时使用的参数的不同来决定执行哪一个n如果有一个类有几个构造方法,可以通过使用关键字this作为一个方法调用来复制其中一个构造方法的某方面效果到另一个构造方法中。n对于this的任何调用,如果出现,在任何构造函数中必须是第一个语句。7/13/202428class Personclass Person String name=“unknown”;String name=“unknown”;int age=-1;int age=-1;public Person()public Person()public Person(String n)public Person(String n)name=n;name=n;public Person(String n,int a)public Person(String n,int a)name=n;name=n;age=a;age=a;7/13/202429Person p1=new Person();Person p2=new Person(“liming”);Person p3=new Person(“liming”,20);7/13/202430重载方法-overloadingnJava中,同一个类中的一个或多个方法使用同一个名字,只要方法的参数的个数和类型不同.这就是方法的重载。例如:public void println(int i)public void println(float f)public void println(String str)n调用方法时,根据提供的参数的类型选择其中合适的一种方法.7/13/202431cont.n两个规则适用于重载方法:n方法的参数表必须有足够的不同,以至于允许区分出正确的方法被调用。正常的拓展晋升(如,单精度类型float到双精度类型double)可以被应用。n方法的返回类型可以各不相同,但不能作为方法重载的依据。7/13/202432eg.class Overload void run()System.out.println(“no parameters”);void run(int a)System.out.println(“one parameters:”+a);Overload eg=new Overload();eg.run();eg.run(10);eg.run(12.3);签名signature:就是指方法名和参数的个数和类型,不包括返回类型或抛出异常的列表.7/13/2024334.this 引用特殊的对象引用-this调用方法总是通过某个对象或类来进行的,在方法的内部,this引用可以用来引用当前执行的对象.在静态的方法中没有this引用.7/13/202434cont.this引用可以用于区分构造方法的参数和同名的实例变量.如:class Person String name=“unknown”;int age=-1;public Person()public Person(String name)this.name=name;7/13/202435cont.this也可用在构造方法内来调用重载的构造方法,但是必须放在构造方法的第一行.public Person(String name)this.name=name;public Person(String name,int age)this(name);this.age=age;7/13/2024365.垃圾回收方法n对象的finalize()方法n继承自Objectn在对象被当成垃圾从内存中释放前调用n垃圾回收器是系统级的线程后台运行的,回收的时机不确定n不能保证每个对象的finalize()方法都被调用7/13/202437class Person public void finalize()System.out.println(“the object is goning!”);public static void main(String args)new Person();new Person();new Person();System.out.println(“the program is ending!”);7/13/202438强制启动垃圾回收器 System.gc()class Person public void finalize()System.out.println(“the object is goning!”);public static void main(String args)new Person();new Person();new Person();System.gc();System.out.println(“the program is ending!”);7/13/2024396.方法的参数传递n参数传递是值传递n基本数据类型传递的就是该数据的值本身n引用类型数据传递的也是这个变量的值本身,即对象的引用,而非对象本身。n对象的内容可以在被调用的方法中改变,但对象的引用是不会改变的7/13/202440cont.class PassValuepublic void changeInt(int value)value=50;System.out.println(value);PassValue pt=new PassValue();int i=1;pt.changeInt(i);System.out.println(i);输出为1.0,没有改变i的值7/13/202441cont.class PassStr public void changeString(String value)value=“PassRef”;System.out.println(value);PassRef pt=new PassRef();String s=“Hello World!”;pt.changeString(s);System.out.println(s);7/13/202442cont.class A int val=1;class PassRef void changeObj(A a)a.val=10;System.out.println(a.val);A a1=new A();PassRef ref=new PassRef();ref.changObj(a1);System.out.println(a1.val);7/13/2024437.static 静态的静态变量nstatic用在变量之前,表明它们是属于类的,称为类变量(静态变量)。若无static修饰,则变量和方法分别是实例的方法和变量。n类变量的生存期不依赖于对象,其它类可以不用通过创建该类的实例,直接通过类名访问它们。7/13/202444例如:class Chinese static String country=“China”;String name;int age;Chinese(String name)this.name=name;void showInfo()System.out.print(“name:“+name+”age:“+age);7/13/202445nChinese a,b,c,d;na=new Chinese(”a”);nb=new Chinese(“b”);nc=new Chinese(“c”);nd=new Chinese(“d”);na.country=“中国“;nChinese.country=“China”;nd.country=“zhongguo”7/13/202446cont.Chinese cString nameChinese aString nameChinese bString namestatic Stringcountry=“china”;Chinese dString name7/13/202447统计程序中产生多少个实例对象:class A private static int count=0;public A()count+;7/13/202448静态方法-static methodnstatic method可以通过类名调用,而不必创建该类的任何对象.n声明为static的方法有几个约束条件:只能调用其他的static 方法只能访问static数据不存在可用的对象引用-没有this引用.7/13/202449class Test String str=”hello”;public static void main(String args)System.out.println(str);上面程序有没有错误?如何改正?7/13/202450n方法一:将成员变量改成类变量class StaticError static String str=”hello”;public static void main(String args)System.out.println(str);7/13/202451n方法二:先创建一个类的实例class Test String str=“hello”;public static void main(String args)Test test;test=new Test();System.out.println(test.str);7/13/202452n静态代码块 static block:在类被载入时,执行并且只被执行一次。class Chinese static String country;String name;int age;static country=“china”;System.out.println(country);当生成多个Chinese对象时候,而仅输出一次china!7/13/2024538.内部类 inner classn在一个类内部定义的类被称为嵌套类(作为成员,或在代码块内部)n外部类的成员可以被其内部类访问n内部类的成员不能被其外部直接访问n在类中定义的内部类n可以直接访问和引用它的外部类的所有变量和方法n可以声明为private 和protectedn在内部类对象保存了一个对外部类对象的引用7/13/202454class Outerint outer_i=100;void test()Inner in=new Inner();in.display();class Inner void display()System.out.print(outer_i);7/13/202455n在外部类之外对内部类引用:n先创建外部类的实例n通过外部类的实例再创建内部类的实例nOuter o=new Outer();nOuter.Inner i=o.new Inner();7/13/202456n静态嵌套类class Outerint outer_i=100;static class Inner void display()System.out.print(outer_i);7/13/202457n注意:n用static 修饰的内部类,就相当于是一个外部定义的类如可以直接使用:Outer.Inner a=new Outer.Inner();nstatic 内部类不能使用外层封装类的非static的成员变量7/13/202458class Outerprivate int size =100;class Innerprivate int size=50;public void doStuff(int size)size+;/形参this.size+;/Inner类的成员变量Outer.this.size+;/Outer类的成员变量7/13/202459n方法中定义的内部类n在定义局部内部类的块外是完全不能访问的n可以加的修饰符只有:finaln在定义该类的作用域可以访问所有变量。(只有局部变量或方法参数被声明为final,它才可被访问)7/13/202460class InOutint i=100;void test(final int iarg)final int i=20;class Inner public void sayHello()System.out.println(i);System.out.println(InOut.this.i);System.out.println(iarg);7/13/202461指出程序中错误,并改正程序,上机验证(1)public class Exercise1int i;public static void main(String args)System.out.println(i=+i);7/13/202462(2)public class Excercise2public static void main(String args)int i=10;short j;int k=j;j=i;System.out.println(j);7/13/202463(3)public class Exercise3public static void main(String args)int i;System.out.println(i);7/13/202464(4)public class Exercise4public static void main(String args)int i,j;boolean k;k=i&j;System.out.println(k);7/13/202465
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


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


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

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


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