上节课内容提问•内容提问Java面向对象设计1本课内容•面向对象的思想•类、属性和方法•对象的创建和使用•构造方法•重载1.面向对象的基本概念•OOP:ObjectOrientedProgramming,是目前主流的程序设计语言,传统的编程技术是结构化、面向过程的•OOP是对现实世界运行方式的模拟,按人们思维习惯来描述问题、解决问题•对象(object)和类(class)是面向对象方法的核心概念–类是对相同或相似事物的一种抽象,描述了一类事物的共同特征–对象是实际存在的某类事物的个体,也称之为类的实例(instance)对象(Object)•对象是对现实世界中事物的建模,拥有状态和行为(Anobjectisasoftwarebundleofrelatedvariablesandmethods)•状态--成员变量,行为--成员方法variablesmakeupthecenterMethodssurroundandhidetheobject'snucleusfromotherobjectsprovidemodularityandinformationhidingbenifits类(Class)•类是对相似行为的对象的一种抽象,描述了属于该类型的所有对象的性质---统一的属性和操作方式(Aclassisablueprintorprototypethatdefinesthevariablesandthemethodscommontoallobjectsofacertainkind)•类就是对象的数据类型,对象是类的实例–Fruitapple,grape;•从一个类可以创建多个对象,这些对象具有相同的行为,但各自拥有自身的状态以对象思考问题以面向对象的思维来思考一个问题的解答时,会将与问题相关的种种元素视为一个个对象,简单地说,面向对象的思维就是以对象为中心来思考问题,然而什么又叫做以以对象为中心来思考问题”呢?我不想用太多抽象的字眼来解释这些词语,这里提出一个实际问题,并尝试以面向对象的方式来思考有一个账户,账户中有存款余额,您可以对账户进行存款与提款的动作,并可以查询以取得存款余额。要以对象为中心来思考问题,首先要识别出问题中的对象,以及对象上的属性与可操作的方法。识别问题中的对象与属性账户是一个比较单纯的问题,可以从问题中出现的名词来识别出对象,描述中有账户与余额两个名称,基本上这两个名称都可以识别成对象,当然在这个简单的问题当中,我们先识别账户这个对象。识别出对象后,接下来我们看看对象上有什么属性(Property),像对象上拥有什么特征或是可表示的状态.属性是对象的静态特征,属性基本上也可以从名词上识别,在这个例子中,您可以将余额作为账户的属性之一。账户账户余额识别对象上的方法接着要识别对象上的方法,也就是对象上的动态特征,即对象可以“干什么”,用我们专业的话说就是对象本身可操作或供操作的接口。根据描述“存款”、“提款”、“余额查询”可以识别为方法账户存款余额存款提款查询余额练习:Car.javaUseCar.java什么是类和对象、属性和方法的定义、类的实例化、类成员的访问类和对象之间的关系类不是对象(却是用来创建它们的模型)类是对象的蓝图,它告诉虚拟机如何创建某种类型的对象。Java虚拟机类•如何获得对象?调用类的构造函数创建对象类的构造函数创建一个个对象虚拟机定义构造函数与类名称同名的方法称为构造函数,它没有返回值。构造函数的作用就是让您在构造对象实例的同时初始化一些必要信息,构造函数在创建对象实例的时候被调用。构造函数有无参和有参两种形式系统默认提供一个无参的构造函数。一旦您定义一个有参的构造函数,系统不再提供默认的构造函数对象的产生和使用创建对象实例的根本途径是构造器,通过new关键字来调用某个类的构造器即可创建这个类的实例//定义一个Person类型的变量Personp;//通过new关键字调用Person类的构造器,返回一个Person实例,将该Person实例赋给p变量。p=newPerson();对象、引用有这样一行代码p=newPerson();这行代码创建一个Person实例,这个实例在堆内存里。在java中,通过new运算符创建出的对象,都被放入到堆内存里.Personp;p栈内存p=newPerson();nameage堆内存通过new关键字生成的对象存放在堆内存里对象引用java不允许直接操作内存,所以我们无法直接操作堆内存里的对象,如果想要操作对象,必须通过引用Personp=newPerson();引用可以通过引用p来操作对象上的方法p.setName(张三)对象引用对象、引用•当一个对象被创建后,这个对象将保持在堆内存,Java程序不允许直接访问堆内存的对象,只能通过引用访问。•如果堆内存里的对象没有任何引用指向它,这个对象也就成了垃圾,Java的垃圾回收机制将回收该对象,释放该对象所占的内存.•因此,如果希望通知垃圾回收机制回收某个对象,只需要切断该对象的所有引用变量和它之间的关联即可,也就是把这些引用设为null构造方法特征1.与类同名,用new调用2.构造器没有任何返回类型,哪怕是void也不行。假如指定了返回值,那么Java会视为一个普通的方法。3.只要类中显式地定义一个或多个构造器,那么Java不会再为你定义一个默认的构造器new关键字•new关键字的作用:•(1)为该对象分配内存空间;•(2)返回该内存空间的引用,返回首地址;(引用是指指针的别名)•(3)调用构造函数,构造函数自动将成员赋初值。练习•1、定义一个类Person此类有成员属性:name,age,sex,有说话say(),吃饭eat()行为要求说话的内容是:我叫name男年龄:age吃饭eat()说:我爱吃水果“•定义Test测试类,调用say,eat(),•提示:a.定义拥有参数的构造方法初始化成员属性,b.如果系统不允许提供有参构造,程序如果实现操作符:=,==,equals使用操作符=•基本数据类型是传植•对象是改变其引用Assignment.java操作符==/equals操作符==/equals•1、==比较的是地址(否是同一个对象),如果是具体的阿拉伯数字的比较(基本数据类型),值相等则为TRUE,•如:inta=10与longb=10L与doublec=10.0都是相同的(为true),因为他们都指向地址为10的堆栈;•2、String的equals()方法比较的是两个String对象的内容是否一样Equivalence.java重载(Overload)方法•java允许一个类中有多个同名的方法,只要形参列表不同就行重载重载•方法重载是让类以统一的方式处理不同类型数据的一种手段。Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。调用方法时通过传递给它们的不同个数和类型的参数来决定具体使用哪个方法,这就是多态性。方法重载•1.构造器重载•2.方法重载构造器重载是指同一个类中存在着若干个具有不同参数列表的构造函数。这样,在创建该类的对象时,就可以根据不同的情况选择不同的构造函数,提高编程灵活性。SimpleConstructor2.java重载特征•方法名相同•参数列表不同•在同一个类中•方法体不同方法重载OverloadingOrder.java重载练习•1.定义一个类Book,当我知道书的名字或书的价格的时候可以获得这本书,或我知道书的出版商和书名时也可以获得一本书。请用OO设计这个类,并测试。•2.一个矩形可用两个点表示,一个三角形可用三个点来表示,一个圆可用一个点和一个半径来表示。请实现三个同名方法(calArea),分别计算给出的矩形、三角形和圆形的面积。矩形为Rect,三角形为Triangle,圆形为Circle(请注意大小写)。(每个点用x,y两个坐标表示,x坐标在前,y坐标在后).This关键字This关键字的使用1.在构建器里调用构建器尽管可用this调用一个构建器,但不可调用两个。构建器调用必须是我们做的第一件事情Flower.java2.解决局部变量和成员变量名称相同的问题•DemoThis.java类的初始化顺序顺序:•类变量•构造方法•普通方法•练习:OrderOfInitialization.java课后作业第1题:编译、运行本课例题;第2题:编写一个student类,有学号、姓名、年龄等属性。要求提供一到多个构造方法,成员变量的设置、访问方法,第3题:编写一个test类,对student类进行第4题:编译、运行test类。课后作业2•编写一个Java程序,它具有两个类:Employee和WageCalculator。•类Employee具有有关雇员信息的一下详细信息,即,姓名、雇员号码、已工作时间(小时)、每小时工工资。WageCalculator创建Employee类的实例并获得雇员的详细信息以计算工资并打印到控制台。使用Emoloyee类的构造器为其中的不同变量赋值。