您好,欢迎访问三七文档
当前位置:首页 > 财经/贸易 > 资产评估/会计 > java实践Class 6 (1) (1)
Chapter06(1)面向对象YangLijieContent•面向对象概念•类与对象•封装性•构造方法•匿名对象•实例——类设计分析•传递引用及基本应用•this关键字•static关键字•代码块•构造方法私有化•对象数组•内部类•实例2面向对象基本概念•程序发展经历了两个主要阶段:面向过程、面向对象。•对于面向对象与面向过程可以用一个例子解释,如有两位师傅要设计一个首饰盒,那么做这个首饰盒的出发点会有两种方式:3–面向对象:针对用户提出的要求进行分析,并将分析的结果设计成一张完整的图纸,与用户确认,然后将一切的准备工作全部处理完后再分块制作,最后将各个小的部分组装在一起。–面向过程:用户提出哪些要求,师傅就针对用户的要求进行制作,直接制作出一个完整的整体,本身也不准备好做首饰盒需要的工具,随需取用工具。•从以上两种方式看出,“面向对象”比“面向过程”更能适应用户的变化,而一旦用户有变化,“面向过程”基本上要推倒重做,“面向对象”可以适应变化。4封装性(Encapsulation)•对外部不可见•两层含义:–把对象的属性和行为看成一个密不可分的整体,将两者“封装”在一个不可分割的独立单位中。–“信息隐蔽”把不需要外界知道的信息隐藏起来。有些对象的属性与行为允许外界知道或使用,但不允许修改;有些则不允许外界知道,或只允许使用对象的功能,尽可能隐蔽功能实现的细节。5•在程序设计中,把描述对象属性的变量与实现功能的方法结合在一起,定义为一个程序单位,保证外界不能任意修改内部的属性值,也不能任意调动内容的功能方法。•封装的另一个特点:为封装在一个整体内的变量和方法规定不同级别的“可见性”或访问权限。6继承性(Inheritance)•扩展类的功能•首先拥有反映事物一般特性的类,然后在其基础上派生出反映特殊事物的类。•如,已有汽车的类,该类描述了汽车的普遍属性和行为,进一步产生轿车的类。轿车类继承于汽车类。轿车类不但拥有汽车类的全部属性和行为,还增加轿车特有的属性和行为。7•被继承的类称为父类或超类,而继承产生的类称为子类或派生类。由继承机制,派生类继承超类的所有成员,并相应地增加自己的一些新的成员。•继承机制增强了程序代码的可复用性,提高了软件的开发效率,降低了程序错误的可能性,为修改扩充提供了便利。•一个子类只允许继承一个父类,为单继承;允许继承多个父类,为多继承。Java中通过接口(Interface)的方式弥补由于Java不支持多继承而带来的子类不能享用多个父类的成员的缺点。8多态性(Polymorphism)•多态是允许程序中出现重名的现象。Java中有两种形式:–方法的重载:一个类中,允许多个方法使用同一个名字,但方法的参数不同,完成的功能也不同。–对象的多态性:子类对象可以与父类对象进行相互转换,且根据其使用的子类的不同,完成的功能也不同。•多态的特性使程序的抽象程度和简捷程度更高,有助于程序的分组协同开发。9Content•面向对象概念•类与对象•封装性•构造方法•匿名对象•实例——类设计分析•传递引用及基本应用•this关键字•static关键字•代码块•构造方法私有化•对象数组•内部类•实例10类与对象的关系•面向对象的核心组成部分:–类与对象•类是对某一类事物的描述,是抽象的、概念上的定义;•对象是实际存在的该事物的每个个体,也称实例(instance)。11类:定义出一个基本的模版,代表着一个共性。对象:每一个具体的人,根据不同给不同的姓名,代表一个个性。类和对象另一种解释•生产汽车,首先设计一个汽车的设计图纸,然后按照图纸的结构生产汽车。产出的汽车结构和功能相同,但每辆车的具体内容,如颜色、是否天窗都存在差异。12•实例中,图纸规定了汽车该有的基本组成,包括外型、内部结构、发动机等信息的定义,这个图纸可称为一个类,显然仅有图纸是无法使用的。•通过这个模型生产出的一辆辆具体汽车是可以被用户使用的,所以称其为对象。13类的定义•类由属性和方法组成。•属性定义的是类需要的一个个具体信息,实际上一个属性就是一个变量,而方法是一些操作的行为。类的定义语法如下:14•属性也可称为变量–在类中的属性实际上是一个个变量,有时也称为Field(成员)。•定义一个Person类15ClassPerson{Stringname;intage;publicvoidtell(){System.out.println(“姓名:”+name+”,年龄:”+age);}}类中定义方法补充说明•上述方法的定义与之前讲解的方法定义有区别,没有加上static关键字,因为此时定义的方法要由对象调用,而不像之前的与主方法main()定义在一个类中且由主方法直接调用。16•表示类的定义(Person类图)–第一层:表示类的名称,类名称要求开头首字母大写。–第二层:表示属性定义,按照“访问权限属性名称:属性类型”的格式定义,本类中声明属性时没有任何访问权限,暂时不加任何符号。–第三层:表示方法的定义,按照“访问权限方法名称():方法返回值”的格式定义,本类中声明方法加上“public”,所以使用“+”表示。另,如果方法中传递参数,格式为:“访问权限方法名称(参数名称:参数类型,…):方法返回值”17小结•了解面向对象的三个主要特征•掌握类与对象的定义格式•必须先有类之后才能产生对象,类中规定了对象的操作行为18对象的创建及使用•一个类定义之后不能直接使用,需要产生对象。•对象的创建格式:•以上格式与之前数组定义的格式相似,因为类和数组都属于引用数据类型。19•在主方法中实例化了一个Person对象,对象名称为per。与之前的数组开辟空间一样,对象的实例化也要划分堆、栈空间的。具体内存分配如下:20•所有的对象名称保存于栈内存,而对象具体内容保存于对应的堆内存中,必须使用关键字new才能开辟堆内存空间,其中保存对象属性信息。此时,刚实例化完,属性内容默认值。21栈内存per堆内存name=null;age=0;指向对应的堆内存空间Personper=newPerson();使用new开辟堆内存空间•栈中存放的是堆空间的地址。•方便理解栈的作用:“将对象名称保存在栈内存中”•准确说法:“在栈内存中实际上保存的是其对应的堆内存空间的访问地址”22•了解了分配关系,即可为属性赋值,并调用类中的方法。如下语法实现:23访问属性:对象名称.属性名访问方法:对象名称.方法名()•为属性赋值:•上面程序为属性赋值,并通过类中方法把内容直接输出,属性赋值完的内存:24•问题:对象是保存在栈内存中,属性保存在堆内存中,那么方法呢?•在程序中所有的方法是保存在全局代码区之中的。此区域的内容是所有对象共享的。25未实例化异常•如一个对象要被使用,对象必须被实例化(实例化对象,并不单单指的是直接通过new关键字实现的,只要其有堆内存的空间指向,则表示实例化成功),如一个对象没有被实例化而直接调用了对象中的属性或方法,如下:•异常如下:26Personper=null;per.name=“张三”;per.age=30;per.tell();Exceptioninthread“main”java.lang.NullPointerException创建多个对象•以上是一个对象的创建方法,依照此格式可同时创建多个对象,每个对象会分别占据自己的堆、栈空间。•例:创建两个对象2728classPerson{Stringname;//声明姓名属性intage;//声明年龄属性publicvoidtell(){//取得信息System.out.println(姓名:+name+,年龄:+age);}}publicclassClassDemo04{publicstaticvoidmain(Stringargs[]){Personper1=null;//声明per1对象Personper2=null;//声明per2对象per1=newPerson();//实例化per1对象per2=newPerson();//实例化per2对象per1.name=张三;//设置per1中的name属性内容per1.age=30;//设置per1中的age属性内容per2.name=李四;//设置per2中的name属性内容per2.age=33;//设置per2中的age属性内容System.out.print(per1对象中的内容--);per1.tell();//调用类中的方法System.out.print(per2对象中的内容--);per2.tell();//调用类中的方法}}•程序实例化两个Person对象,每当出现new关键字时,必定开辟新的堆内存空间,即per1和per2分别指向各自的堆内存空间。29栈内存per1per2堆内存name=“张三”;age=30;name=“李四”;age=33;指向对应的堆内存空间Personper1=newPerson();Personper2=newPerson();使用new开辟堆内存空间•类是引用数据类型,从数组的使用上可看出,引用数据类型就是指一段堆内存空间可以同时被多个栈内存指向。•所谓引用数据类型,实际上传递的是堆内存的使用权,可同时为一个堆内存空间定义多个栈内存的引用操作。•每个栈内存空间都可以修改堆内存的内容。如下例:3031classPerson{Stringname;//声明姓名属性intage;//声明年龄属性publicvoidtell(){//取得信息System.out.println(姓名:+name+,年龄:+age);}}publicclassClassDemo05{publicstaticvoidmain(Stringargs[]){Personper1=null;//声明per1对象Personper2=null;//声明per2对象per1=newPerson();//实例化per1对象per2=per1;//把per1的堆内存空间使用权给per2per1.name=张三;//设置per1中的name属性内容per1.age=30;//设置per1中的age属性内容//设置per2中的对象内容,实际设置per1对象内容per2.age=33;System.out.print(per1对象中的内容--);per1.tell();//调用类中的方法System.out.print(per2对象中的内容--);per2.tell();//调用类中的方法}}32堆内存name=null;age=0;栈内存per1per2堆内存name=null;age=0;栈内存per1per2堆内存name=“张三”;age=30;栈内存per1per2堆内存name=“张三”;age=33;栈内存per1per233classPerson{Stringname;//声明姓名属性intage;//声明年龄属性publicvoidtell(){//取得信息System.out.println(姓名:+name+,年龄:+age);}}publicclassClassDemo06{publicstaticvoidmain(Stringargs[]){Personper1=null;//声明per1对象Personper2=null;//声明per2对象per1=newPerson();//实例化per1对象per2=newPerson();//实例化per2对象per1.name=张三;//设置per1中的name属性内容per1.age=30;//设置per1中的age属性内容per2.name=李四;//设置per2中的name属性内容per2.age=33;//设置per2中的age属性内容per2=per1;//将per1的引用传递给per2System.out.print(per1对象中的内容--);per1.tell();//调用类中的方法System.out.print(per2对象中的内容--);p
本文标题:java实践Class 6 (1) (1)
链接地址:https://www.777doc.com/doc-6291281 .html