1、-1-理解OOP编程思想掌握Java中创建类和对象的方法掌握Java的方法重载掌握包的创建和使用方法掌握Java访问修饰符的使用掌握静态变量、静态方法的使用目标目标-2-面向对象思想面向对象思想 面向对象概述:p 面向对象主要包括面向对象的分析(面向对象主要包括面向对象的分析(Object Oriented Analysis,OOA)、)、面向对象的设计(面向对象的设计(Object Oriented Design,OOD)、面向对象编程)、面向对象编程(Object Oriented Programming,OOP)。)。p OOA就是以面向对象就是以面向对象“类类”的概念去认识问题、分析问
2、题。的概念去认识问题、分析问题。p OOD是在是在OOA的基础上设计数据模型,从而建立所要操作的对象以及它的基础上设计数据模型,从而建立所要操作的对象以及它们之间的联系。们之间的联系。p OOP则是在前两者的基础上,对数据模型进一步细化,定义它包含的数则是在前两者的基础上,对数据模型进一步细化,定义它包含的数据的类型和任何能够操作它的逻辑程序。每个不同的逻辑程序被认为是据的类型和任何能够操作它的逻辑程序。每个不同的逻辑程序被认为是一个方法。一个方法。-3-面向对象编程面向对象编程OOP 面向对象编程:p 面向对象编程的组织方式围绕面向对象编程的组织方式围绕“对象对象”,而不是围绕,而不是围绕“
3、行为行为”;围绕数;围绕数据,而非逻辑。据,而非逻辑。p 一个类的实现实例被称作一个一个类的实现实例被称作一个“对象对象”,或者被称作一个类的,或者被称作一个类的“实例实例”。p 一个类可以有多个实现对象,即类是一个范围,而对象则是类的一个具一个类可以有多个实现对象,即类是一个范围,而对象则是类的一个具体的实体。体的实体。p 类是具有相同状态(属性)和行为(方法)的一组对象的集合,类是具有相同状态(属性)和行为(方法)的一组对象的集合,它与对象之间的关系如图:它与对象之间的关系如图:-4-面向对象机制面向对象机制-1 封装封装 封装就是把对象的属性(状态)和方法(行为)结合在一起,并尽可能隐蔽
4、对象的内部细节隐蔽对象的内部细节,成为一个不可分割的独立单位(即对象),对外形成一个边界,只保留有限的对外接口保留有限的对外接口使之与外部发生联系。封装的原则封装的原则 使对象以外的部分不能随意存取对象的内部数据,从而有效的避免了外部错误对它的“交叉感染”。数据隐藏特性提升了系统安全性,使软件错误能够局部化,减少查错和排错的难度。如:微波炉,将线路板(属性)封装在微波炉内部,使用者无法接触到,而通过面板按钮(方法)简单的操控线路板工作。-5-面向对象机制面向对象机制-2 继承 继承是软件重用软件重用的一种形式,它通过重用现有类的属性和方法,并增加新功能或修改现有功能来构建新的类。多态多态是指在
5、父类中定义的属性或方法被子类继承之后,可以具有不同的表现行为。这使得同一个属性或方法在父类及其各个子类中具有不同的语义。如:“人”这个类抽象了这个群体的一般特性,“学生”和“老师”都具备“人”所定义的一般性,但其各自又有各自的特殊性,在保持了一般性和特殊性的情况下,作为一个新类而存在。如:动物会“叫”,“猫”和“鸟”都是动物的子类,但其“叫”声是不同的-6-类与对象-1 类 类就是对象的模板,而对象就是类的一个实例。类由属性和方法构成:p 对象的特征在类中表示为成员变量,称为类的属性。对象的特征在类中表示为成员变量,称为类的属性。p 类的方法是对象执行操作的一种规范。方法指定以何种方式操作对象
6、的类的方法是对象执行操作的一种规范。方法指定以何种方式操作对象的数据,是操作的实际实现。数据,是操作的实际实现。Java中类声明格式访问符 修饰符 class 属性 方法用于声明类、属性或方法的访问权限,具体可取public、protected、private或缺省。修饰符,可用的有abstract,static或final等,这些修饰符用于说明所定义的类有关方面的特性 类与对象-2 声明一个类 定义一个长方形(Rectangle)类,有长、宽属性,对每个属性都提供相应的get/set方法。public class Rectangle/*长方形宽度*/private double width;
7、/*长方形高度*/private double length;/*成员变量对应的方法*/public double getWidth()return width;public void setWidth(double width)this.width=width;public double getLength()return length;public void setLength(double length)this.length=length;-7-类与对象-3 对象的创建当创建完一个类时,就创建了一种新的数据类型。可以使用这种类型来声明该种类型的对象。要获得一个类的对象一般需要两步:p声
8、明该类类型的一个变量。p创建该对象(即在内存中为该对象分配地址空间),并把该对象的引用赋给声明好的变量。这是通过使用new运算符实现的。创建Rectangle类的对象Rectangle rectangle=new Rectangle();或Rectangle rectangle;rectangle=new Rectangle();Rectangle rectangle=null;“null”关键字表示“空”,用于标识一个不确定的对象,即没有内存地址的对象。因此可以将null赋给引用类型变量,但不可以赋给基本类型变量。-8-构造方法-1 类的构造方法 p 构造方法是一种特殊的方法,在对象被创建时
9、用来初始化对象;p 它具有和它所在的类完全一样的名字;p 构造方法和类的方法类似,只不过构造方法没有返回类型;p 构造方法的任务是初始化一个对象的内部状态。()语句;-9-构造方法-2 类的构造方法实例 在Rectangle 类的基础上,基于width和length两属性来创建构造方法,代码如下所示:public class Rectangle private double width;private double length;/*利用width和length创建构造方法*/public Rectangle(double width,double length)this.width=widt
10、h;this.length=length;/省略如果在Java程序中没有定义任何的构造方法,则编译器将会自动加上一个不带任何参数的构造方法即缺省构造方法,该方法不存在于源程序中,但可以使用。-10-this对象 this对象的使用 this关键字代表当前所在类的对象,即本类对象,用于解决变量的命名冲突和不确定性问题;在没有同名的情况下,可以直接使用属性的名字。图3-4 this关键字-11-对象的初始化过程 对象的初始化过程 Rectangle rectangle=new Rectangle(3,5);注意:如果在类中没有定义任何的构造方法,则编译器将会自动加上一个无参构造方法;一旦创建了自己
11、的构造方法,缺省的构造方法将不复存在,如果需要则手动添加无参构造方法。-12-类的方法-1 类的方法 方法是类行为的体现,其他对象可以根据类的方法对类进行访问。类的方法包括方法的说明和方法的实现两部分,格式如下所示:access modifiers methodName()注意:方法的返回类型是该方法运行后返回值的数据类型;如果方法没有返回值,则方法的返回类型为void。使用对象 当分配完一个对象后,可以使用点操作符“.”来实现对属性和方法的访问:对象名.属性;/访问对象的属性 对象名.方法名();/访问对象的方法-13-类的方法-2 类的方法实例对Rectangle进行扩展,定义方法outp
12、ut()使用字符界面显示长方形的信息,代码如下所示:public class Rectangle/省略变量定义及构造方法定义/省略 get和set方法/*输出长方形的长宽信息*/public void output()System.out.println(长方形的长为:+length);System.out.println(长方形的宽为:+width);public static void main(String args)Scanner scanner=new Scanner(System.in);System.out.println(请输入长方形的长:);double length=sca
13、nner.nextDouble();System.out.println(请输入长方形的宽:);double width=scanner.nextDouble();/利用构造方法创建一个Rectangle类型的对象Rectangle rectangle=new Rectangle(width,length);/调用output方法rectangle.output();执行结果如下:请输入长方形的长:3请输入长方形的宽:5长方形的长为:3.0长方形的宽为:5.0-14-参数传递参数传递-1 在Java编程语言中,给方法传递参数的方式有两种:p按值传递(call by value),将要传递的参数
14、的值传递给被调方法,被调方法通过创建一份新的内存拷贝来存储传递的值,然后在内存拷贝上进行数值操作,所以按值传递不会改变原始参数的值。通过具体实例来说明按值传递,代码如下所示:public static void main(String args)int num=5;System.out.println(调用change方法前:+num);/创建一个CallByValue类型的对象CallByValue callByValue=new CallByValue();callByValue.change(num);System.out.println(调用change方法后:+num);/*定义ch
15、ange方法*/public void change(int num)num+=5;System.out.println(在change中 num的值为:+num);在Java中,当传递基本数据类型的参数给方法时,它是按值传递的执行结果如下:调用change方法前:5在change中 num的值为:10调用change方法后:5-15-参数传递参数传递-2p引用传递(call by value),将参数的引用(类似于C语言的内存指针)传递给被调方法,被调方法通过传递的引用值获取其指向的内存空间,从而在原始内存空间直接进行操作,这样将导致原始内存空间状态的修改。代码如下所示:class Call
16、ByRef int a,b;CallByRef(int i,int j)a=i;b=j;void change(CallByRef obj)obj.a=50;obj.b=40;System.out.println(在change方法中 obj.a=+obj.a+,obj.b=+obj.b);public class Test public static void main(String args)CallByRef obj=new CallByRef(15,20);System.out.println(调用change方法前 obj.a=+obj.a+,obj.b=+obj.b);obj.ch
17、ange(obj);System.out.println(调用change方法后 obj.a=+obj.a+,obj.b=+obj.b);执行结果如下:调用change方法前 obj.a=15,obj.b=20在change方法中 obj.a=50,obj.b=40调用change方法后 obj.a=50,obj.b=40-16-方法重载 重载(Overload)在Java程序中,如果同一个类中存在两个方法同名,方法的签名(参数个数、参数类型、类型排列次序)上也一样,将无法编译通过。但在Java中多个方法重名是允许的,只要保证方法签名不同即可,这种特性称为方法重载(overload)。方法重载
18、需遵循如下两条规则:p方法名相同;p参数列表(个数、类型、顺序)不同;注意:返回值不影响方法重载。构造方法也可以重载。-17-18-包包-1 包(package)Java允许使用包将多个类组织在一起。借助于包可以方便的组织管理类,并将自定义的类与其它的类库分开管理。Java就是使用包来管理类库的。使用包维护类库比较简单,只要保证在同一个包下不存在同名的类即创建一个包也比较简单:只要将package命令作为一个Java源文件的第一句就可以,该文件中定义的任何类将属于指定的包。示例代码如下:package mypackage;public class Rectangle .-18-包包-2 包中类
19、的访问一个类可以访问其所在包的所有类。访问其他包的类有如下两种方式访问:p使用import语句导入要访问的类,如:p使用的类名前直接添加完整的包名,如:import java.util.*;import mypackage.school.Student;java.util.Date now=new java.util.Date();mypackage.school.Student tom=new mypackage.school.Student();注意:*指明导入当前包的所有类,不能使用类似于java.*的语句来导入以java为前缀的所有包的所有类。-19-20-封装 封装pJava中为了将
20、数据有效的保护起来,提供了访问修饰符用来声明、控制属性、方法乃至类本身的访问,以实现隐藏一个类的实现细节,防止对封装数据未经授权的访问,此种形式称为“封装”。p引入封装,使用者只能通过事先定制好的方法来访问数据,可以方便的加入控制逻辑,限制对属性的不合理操作,有利于保证数据的完整性。p实现封装的关键是不让外界直接与对象属性交互,而是要通过指定的方法操作对象的属性,如下图所示:-20-21-访问修饰符-1 访问修饰符Java中定义了private(私有的)、protected(受保护的)和public(公共的)的访问修饰符,同时也定义了一个缺省的访问级别,用于声明类、属性、方法的访问权限。明确访
21、问修饰符的限制是用好“封装”的关键:p使用public访问修饰符,类的成员可被同一包或不同包中的所有类访问,也就是说,public访问修饰符可以使类的特性公用于任何类;p使用protected访问修饰符允许类本身、同一包中的所有类和不同包中的子类访问;p如果一个类或类的成员前没有任何访问修饰符时,它们获得缺省的访问权限,缺省的可以被同一包中的其他类访问;pprivate访问修饰符是限制性最大的一种访问修饰符,被声明为private的成员只能被此类中的其他成员访问,不能在类外看到。-22-访问修饰符-2 Java中访问控制表访问控制访问控制private成员成员缺省成员缺省成员protected
22、成员成员public成员成员同一类中成员同一类中成员 同一包中其他类同一包中其他类 不同包中子类不同包中子类 不同包中非子类不同包中非子类 -23-访问修饰符-3 修饰符实例-1首先,定义MyClass1类结构 package p1;public class MyClass1 public int a=5;private int b=10;protected int c=20;int d=30;public void func1()System.out.println(func1);private void func2()System.out.println(func2);System.out
23、.println(b);protected void func3()System.out.println(func3);void func4()System.out.println(func4);-24-访问修饰符-4 修饰符实例-2 然后,定义MyClass2类结构 package p1;class MyClass2 public void func1()System.out.println(func1 of MyClass2);-25-访问修饰符-5 修饰符实例-3最后,定义Test类,假如将Test类放在与MyClass1和MyClass2同一个包p1下,在Test中访问MyClass1
24、、MyClass2及其成员的可行性如下:public class Test public void func()MyClass1 obj1=new MyClass1();System.out.println(obj1.a);/公共属性,任何地方都可以访问System.out.println(obj1.b);/Error,私有属性类外无法访问System.out.println(obj1.c);/受保护属性同包的类或子类可以访问System.out.println(obj1.d);/缺省属性同包的类可以访问obj1.func1();/公共方法,任何地方都可以访问obj1.func2();/Err
25、or,私有方法类外无法访问obj1.func3();/受保护方法同包的类或子类可以访问obj1.func4();/缺省方法同包的类可以访问MyClass2 obj2=new MyClass2();/同一包中的缺省类可以访问 -26-访问修饰符-6 修饰符实例-4假如将Test类放在与MyClass1和MyClass2不同的包下,在Test中访问MyClass1、MyClass2及其成员的可行性如下:public class Test public void func()MyClass1 obj1=new MyClass1();System.out.println(obj1.a);/公共属性,任
26、何地方都可以访问System.out.println(obj1.b);/Error,私有属性类外无法访问System.out.println(obj1.c);/Error,受保护属性同包的类或子类才可以访问System.out.println(obj1.d);/Error,缺省属性同包的类才可以访问obj1.func1();/公共方法,任何地方都可以访问obj1.func2();/Error,私有方法类外无法访问obj1.func3();/Error,受保护方法同包的类或子类才可以访问obj1.func4();/Error,缺省方法同包的类才可以访问MyClass2 obj2=new MyCl
27、ass2();/缺省访问级别同包才可以访问 -27-访问修饰符-7 修饰符实例-5假如Test类继承了MyClass1,并且不在同一个包下,在Test中访问MyClass1、MyClass2及其成员的可行性如下:public class Test extends MyClass1 public void func()System.out.println(a);/公共属性,任何地方都可以访问System.out.println(b);/Error,私有属性类外无法访问System.out.println(c);/受保护属性同包的类或子类可以访问System.out.println(d);/Err
28、or,缺省属性同包的类才可以访问func1();/公共方法,任何地方都可以访问func2();/Error,私有方法类外无法访问func3();/受保护方法同包的类或子类可以访问func4();/Error,缺省方法同包的类才可以访问MyClass2 obj2=new MyClass2();/缺省访问级别同包才可以访问 -28-静态变量和方法-1 静态变量和方法p 在Java中,可以将一些成员限制为“类相关”的,而前面介绍的成员是“实例相关”的。p“实例相关”的成员描述的是单个实例的状态和方法,其使用必须要通过类的实例来完成;p “类相关”是在类的成员前面加上“static”关键字,从而直接通
29、过类名就可以访问。注意:类的静态变量和静态方法,在内存中只有一份,供该类的所有对象共用。通过具体的实例来说明静态变量和方法的使用:对Rectangle进行修改,隐藏area和perimeter,利用output来输出长方形的面积和周长。代码如下所示:-29-静态变量和方法-2public class InstanceCounter/用于统计创建对象的个数public static int count=0;public InstanceCounter()count+;/用于输出count的个数public static void printCount()System.out.println(创建
30、的实例的个数为:+count);public static void main(String args)for(int i=0;i 100;i+)InstanceCounter counter=new InstanceCounter();InstanceCounter.printCount();执行结果如下:创建的实例的个数为:100-29-30-类是具有相同属性和方法的对象的抽象定义对象是类的一个实例,拥有类定义的属性和方法Java中通过关键字new创建一个类的实例对象构造方法可用于在new对象时初始化实例信息类的方法和构造方法都可以重载定义访问修饰符用来限制类的信息(属性和方法)的封装层次Java中的访问修饰符有:public、protected和private包可以使类的组织层次更鲜明Java中使用package定义包,使用import导入包静态变量和静态方法 小结小结谢 谢 Thanks for listening.