1、创建类 类声明,在类的声明里,说明了类的名字及其它属性。下图说明了类声明中包含的各部分:,java 中的对象、类,创建类 类声明,说明:在类声明中, public、abstract、final为类的修饰符,是可选的,缺省时说明所定义的类是非public、非abstract、非final的类。,java 中的对象、类,创建类 类体,类体为该类的对象提供了在生存期内需要的所有代码。包括以下几部分:构造方法( constructor )成员变量( member variable )的声明方法(Method)的实现,java 中的对象、类,创建类 类体,1.构造方法定义:类中用来初始化新建的对象的方法
2、称构造方法。 特点:无返回类型,方法名与类名相同,java 中的对象、类,创建类 类体,1.构造方法说明:构造方法可被重载。 例如:public class Thing private int x;public Thing() x = 47;public Thing( int new_ x) x = new_ x;,java 中的对象、类,创建类 类体,1.构造方法说明: 其中变量和方法称为类的成员(成员变量和成员方法),而构造方法不是类的成员。每个类中至少有一个构造方法。定义类时如未定义构造方法,运行时系统会为该类自动定义缺省的构造方法。没有任何参数 没有body不做任何事情,java 中的
3、对象、类,创建类 类体,1.构造方法说明: 构造方法只能由new运算符调用构造方法同样也有访问权限的限制 publicprotectedprivatepackage,java 中的对象、类,创建类 类体,2.成员变量的声明 成员变量在类体中声明,但在构造方法和方法之外 。classDeclaration member variable declarationsconstructor declarationsmethod declarations,java 中的对象、类,创建类 类体,2.成员变量的声明 声明格式:,java 中的对象、类,创建类 类体,2.成员变量的声明 说明:accessLe
4、vel: 对成员变量的访问控制,有四级访问控制:public, protected, package, private。缺省时为package。static: 说明该变量为类变量,缺省时为实例变量。final: 指明该变量的值不能被改变,既该变量为常量。例 final double AVOGADRO = 6.023e23;,java 中的对象、类,创建类 类体,2.成员变量的声明 说明:type: 用于说明成员变量的类型。可以是基本数据类型,如int,float,boolean 等,也可以是引用类型,如数组名,类或接口名。在同一个类中不允许有同名的成员变量,但允许成员变量名和方法名相同。,ja
5、va 中的对象、类,创建类 类体,2.成员变量的声明 例子:public class SliderDemo public static final int FPS_INIT = 15; private int frameNumber = 0; protected int delay;boolean frozen = false Timer timer;private String name = Fred Flintstone;,java 中的对象、类,创建类 类体,3.方法的实现 与类相似,方法的声明也包括两部分:方法声明和方法体:如下图所示:,java 中的对象、类,创建类 类体,3.方法的
6、实现 方法声明:定义方法的属性,如访问控制级,返回值的类型,方法名字,参数等,java 中的对象、类,创建类 类体,3.方法的实现 返回值:返回值的数据类型必须和声明中的返回类型一致,或者完全相同,或者是它的一个子类 。当一个方法不需要返回值时,返回类型为void。,java 中的对象、类,public Number returnANumber() . . . ,创建类 类体,3.方法的实现 参数传递: 1)参数的类型可以是:简单数据类型:值传送。方法接收参数的值,但并不能改变这些参数的值 引用数据类型(数组类型、类或接口):地址传递。传递给方法的是数据在内存中的地址,见例题:Argument
7、Test.java,java 中的对象、类,创建类 类体,3.方法的实现 参数传递: 2)参数的命名:参数名字可以与类的成员变量 相同,但参数名会隐藏成员。变量为了区别参数与类的成员变量,我们必须使用thisclass Circle int x, y, radius; public Circle(int x, int y, int radius) this.x = x; this.y = y; this.radius = radius; ,java 中的对象、类,4.3 创建类 4.3.2 类体,3.方法的实现 方法体:定义:方法的实现部分,包括局部变量的声明和所有合法的java语句。局部变量
8、:在方法体内定义的变量称局部变量,局部变量的作用域限于方法内。如果局部变量的名字和类的成员变量的名字相同,则类的成员变量被隐藏可以使用this 调用当前类的成员变量。,第四章 java 中的对象、类、包和接口,创建类 类体,3.方法的实现 例题:class Variable int x=0,y=0,z=0; /class member variables void init( int x, int y ) this.x = x; this.y =y; int z=5; /local variable System.out.println(* in init *); System.out.pri
9、ntln(x = +x+ y = +y+ z = +z); ,java 中的对象、类,什么是继承,定义:利用现有的类(supperclass)定义新的类(subclass), 子类可以继承父类的属性和方法并可以增加新的属性和方法或重载父类的方法。继承的优点:子类提供了基于父类公共部分的更具体的行为。利用继承子类可以重用父类多次; 可以定义一个称为抽象类的父类来定义一般行为。,java 中的对象、类,什么是继承,交通工具,汽车,卡车,旅行车,小汽车,轿车,跑车,面包车,基类/ 祖先类,父类/子类/派生类,子类/派生类,java 中的对象、类,继 承,java 中的对象、类,1 理解继承2 类 j
10、ave.lang.Object3 final类和方法4 abstract类和方法,继 承 理解继承,父类、子类和继承成员变量的隐藏和方法的重写super关键字方法的重载运行时多态instanceof 操作符,java 中的对象、类,继 承 理解继承,java 中的对象、类,父类、子类和继承 例子:,继 承 理解继承,java 中的对象、类,父类、子类和继承 定义: 子类:继承而得到的类为子类 。子类继承父类的状态和行为,同时也可以修改父类的状态或重写父类的行为,并添加新的状态和行为 父类:被继承的类为父类,父类包括所有直接或间接被继承的类,继 承 理解继承,父类、子类和继承 Java语言是单继
11、承机制 ,不支持多重继承单继承是代码更加可靠。接口可以提供多继承功能。,java 中的对象、类,继 承 理解继承,面包车,交通工具,汽车,卡车,旅行车,小汽车,轿车,跑车,父类、子类和继承,java 中的对象、类,继 承 理解继承,父类、子类和继承 Java中,所有的类都是通过直接或间接地继承java.lang.Object得到的,java 中的对象、类,继 承 理解继承,父类、子类和继承创建子类通过在类的声明中加入extends子句来创建一个类的子类,其格式如下:class SubClass extends SuperClass 说明:如果缺省extends子句,则该类为java.lang.
12、Object的子类,java 中的对象、类,继 承 理解继承,父类、子类和继承 子类能够继承什么?子类能够继承父类中public和protected的成员。子类能够继承父类中没有访问控制的成员,只要子类和父类在同一个包内。子类不能继承父类隐藏的成员变量和重写的父类方法子类不能继承父类中private成员。子类不能继承父类中构造方法。因为构造方法不是类的成员,java 中的对象、类,继 承 理解继承,java 中的对象、类,成员变量的隐藏和方法的重写 变量的隐藏:子类中声明了和父类同名的变量,父类的成员变量被隐藏。 方法的重写:子类中定义了与父类相同的方法, 则父类的方法被重写。,继 承 理解继
13、承,java 中的对象、类,成员变量的隐藏和方法的重写例题: class SuperClass int x; void setX( ) x = 0; ,class SubClass extends SuperClass int x; /hide x in SuperClass void setX( ) /overload x = 5; ,继 承 理解继承,java 中的对象、类,成员变量的隐藏和方法的重写说明:重写的方法和父类中被重写的方法要具有相同的名字,相同的参数表和相同的返回类型子类通过成员变量的隐藏和方法的重写可以把父类的状态和行为改变为自身的状态和行为,继 承 理解继承,例题:方法的
14、重写,java 中的对象、类,继 承 理解继承,java 中的对象、类,成员变量的隐藏和方法的重写说明:子类中不能重写父类中的final method子类中必须重写父类中的abstract method, 否则子类也为抽象类。,继 承 理解继承,3. super 关键字 super用来引用当前对象的父类, super来实现对父类成员的访问。应用:子类在隐藏了父类的成员变量或重写了父类的方法后,常常还要用到父类的成员在重写的方法中使用父类中被重写的方法以简化代码的编写,java 中的对象、类,继 承 理解继承,3. super 关键字 super的使用有三种情况: 用来访问父类被隐藏的成员变量,
15、如:super.variable 用来调用父类中被重写的方法,如:super.Method ( paramlist ); 用来调用父类的构造函数,如 super( paramlist );例题:inheritance.java,Manager.java,java 中的对象、类,继 承 理解继承,3. super 关键字说明: 用来调用父类的构造函数super( paramlist )必须放在子类构造方法的句首。如果子类没有明确的调用父类的构造函数,编译器会自动的调用super()语句,它调用父类的默认构造函数。如果父类没有默认构造函数则编译出错。例题:Manager1.java,java 中的
16、对象、类,继 承 理解继承,4. 方法的重载(overloading) 在同一个类中名字相同但参数个数或类型不同的方法。返回值可以不同。例如:public void println( int i)public void println( float f)public void println( String s)见例题 MethodOverloadingTest.java,java 中的对象、类,继 承 理解继承,4. 方法的重载(overloading)构造方法也可以重载。可以在构造方法的第一条语句使用this来调用其他的构造方法。见例题 Employee.java,java 中的对象、类,
17、继 承 理解继承,5. 运行时多态对于重写或继承的方法,Java运行时系统根据调用该方法的实例的类型来决定选择哪个方法调用。,java 中的对象、类,继 承 理解继承,说明:对子类的一个实例,如果子类重写了父类的方法,则运行时系统调用子类的方法,如果子类继承了父类的方法(未重写),则运行时系统调用父类的方法。,java 中的对象、类,继 承 理解继承,5. 运行时多态class Avoid callme( )System.out.println(Inside As callme( ) method);class B extends Avoid callme( )System.out.print
18、ln(Inside Bs callme( ) method);public class Dispatchpublic static void main( String args )A a = new B( );a.callme( );,java 中的对象、类,运行结果为:C:java DispatchInside Bs callme( ) method,例题:,继 承 理解继承,5. 运行时多态,java 中的对象、类,例题:,class Student public: / float calcTuition() / class GraduateStudent extends Student
19、public: / float calcTuition() / ,void fn(Student x) x.calcTuition(); void main() Student s; GraduateStudent gs; fn(s); fn(gs);,继 承 理解继承,例题:Shapes.java为什么要上溯到父类呢?我们可以从以下例题中找到答案:例题:music.java例题:music1.java,java 中的对象、类,继 承 理解继承,6. instanceof 操作符用来判断对象属于哪个类,java 中的对象、类,public class Employee extends Obje
20、ctpublic class Manager extends Employeepublic class Engineer extends Employee- -public void doSomething( Employee e) if (e instanceof Manager) / Process a Manager else if (e instanceof Engineer) / Process an Engineer else / Process any other type of Employee,例如:,继 承 类 jave.lang.Object,java 中的对象、类,类j
21、ava.lang.Object处于Java开发环境的类层次树的根部,其他所有的类都直接或间接地为它的子类一个类如果没有声明继承某个类,则默认继承Object类。 public class Employee .等价于:public class Employee extends Object .,继 承 类 jave.lang.Object,java 中的对象、类,该类定义了一些所有对象最基本的状态和行为常用的有:equals()getClasstoStringfinalize notify notifyAll wait,继 承 类 jave.lang.Object,java 中的对象、类,equ
22、als()一般情况下需要覆盖Object中的equals()方法例如:Integer one = new Integer (1), anotherOne = new Integer (1);if (one.equals (anotherOne)System.out.println (“objects are equal”);if (one = = anotherOne)System.out.println (“objects are equal”);elseSystem.out.println (“objects are not equal”);,继 承 类 jave.lang.Object,
23、java 中的对象、类,2. getClass() getClass ( )方法是final方法,它不能被重写。它返回一个对象在运行时所对应的类的表示例如下面的方法得到并显示对象的类名:void PrintClassName( Object obj )System.out.println(“ The objects class is “ + obj.getClass( ).getName( ) );,继 承 类 jave.lang.Object,java 中的对象、类,2. getClass()可以用getClass创建一个类的实例,而不必在编译时即知道到底是哪个类。下例创建了一个与对象obj
24、具有相同类型的一个实例,所创建的对象可以是任何类。Object creatNewInstanceOf (object obj)return obj.getClass( ).newInstance( );,继 承 类 jave.lang.Object,java 中的对象、类,3. toString( ) toString( )方法用来返回对象的字符串表示.不同的对象显示的形式也不一样。例如:System.out.println(Thread.currentThread().toString(); 显示结果为:Threadmain,5,main int pInt = 500;Integer wIn
25、t = new Integer( pInt);System.out.println(wInt.toString();显示结果为:500,继 承 类 jave.lang.Object,java 中的对象、类,类java.lang.Object处于Java开发环境的类层次树的根部,其他所有的类都直接或间接地为它的子类一个类如果没有声明继承某个类,则默认继承Object类。 public class Employee .等价于:public class Employee extends Object .,继 承 final数据、方法和类,java 中的对象、类,1. final数据它可以是编译时的常
26、量它可以是运行时才初始化的常量见例题:FinalData.java,继 承 final数据、方法和类,java 中的对象、类,2. final方法有些方法不能被重写,这时把它限定为final方法,其格式为:final returnType finalMethod ( paramlist ),继 承 final数据、方法和类,java 中的对象、类,3. final类final类不能被继承。出于以下原因由于,有时候希望一些类不能被继承安全性的原因:如Java中的String类。面向对象的设计上的考虑:如果你认为一个类的定义已经很完美,不需要再生成它的子类,这时也应把它修饰为final类,继 承
27、final数据、方法和类,java 中的对象、类,3. final类定义一个final类的格式如下:final class finalClassName,继 承 final数据、方法和类,java 中的对象、类,3. final类final class Da int i = 7; int j = 1; void f() class Further extends Da /error,继 承 abstract类和方法,java 中的对象、类,abstract类:表示抽象的概念,不能够被实例化为一个对象。例如Java中的Number类定义一个抽象类的格式如下:abstract class abst
28、ractClass,继 承 abstract类和方法,java 中的对象、类,abstract方法:只有方法声明,没有具体实现的方法抽象类中可以包含抽象方法,为所有子类定义一个统一的接口,具体实现由子类完成。定义格式如下:abstract returnType abstractMethod( paramlist );说明:抽象类中不一定要包含abstract方法,但是,一旦某个类中包含了abstract方法,则这个类必须声明为abstract类。,4.7 继 承4.7.3 abstract类和方法,java 中的对象、类,abstract方法举例:,Graphic share certain
29、states (position, bounding box) and behavior (move, resize, draw).,继 承 abstract类和方法,java 中的对象、类,abstract方法举例:,abstract class GraphicObject int x, y; . . . void moveTo(int newX, int newY) . . . abstract void draw();,继 承 abstract类和方法,java 中的对象、类,abstract方法举例:,class Circle extends GraphicObject void dr
30、aw() . . . class Rectangle extends GraphicObject void draw() . . . ,继 承 abstract类和方法,java 中的对象、类,abstract方法举例:Shapes1.java,软件开发的方法,结构化程序设计方法是:程序=(算法)+(数据结构),主函数,函数1,函数1-1,函数2,函数3,函数1-2,函数2-1,函数3-1,函数3-2,数据1,数据3,数据2,java 中的对象、类,软件开发的方法,面向对象程序设计方法是:对象=(算法+数据结构)程序=(对象+对象+.)算法与数据结构是一个整体,算法离不开数据结构,算法只能适用于特定的数据结构。在面向对象中,算法与数据结构被捆绑成一个类,java 中的对象、类,