1、项目5 类和对象任务一 掌握类和对象基本知识任务二 掌握类的封装项目实战一 类和对象 5.1 任务一任务一 掌握类和对象基本知识掌握类和对象基本知识 5.1.1 面向对象基本概念面向对象基本概念 面向对象(面向对象(Object-oriented)就是一种)就是一种常见的程序结构设计的方法面,面向对象常见的程序结构设计的方法面,面向对象(OO)方法是一种程序设计方法,其基本思)方法是一种程序设计方法,其基本思想是使用抽象、对象、类、继承、消息、多想是使用抽象、对象、类、继承、消息、多态等基本概念进行程序设计。态等基本概念进行程序设计。1.1.抽象:抽象:科学研究中经常使用的一种方法,即是从现实
2、世界的众多的事物中抽出事物的本质特性而暂时不考虑它们的细节,得到众多事物的一个清晰的基本框架的手段而已。客观世界的对象和操作 计算机算法 解空间 数据 程序员对问题的表达(抽象)客观世界的算法 结果 客观世界的对象 程序设计的对象和操作 输出数据 问题空间 2.2.对象对象 对象没有一个明确的定义。我们可以将对象看作是现实生活当中头能够被识别、被理解,具有明确的行为、思想、感觉的人或事物。对象具有一些特征:对象是现实的抽象的事物,对计算机所能完成的任务的描述起到重要作用。对象应具有某些属性,即数据,同时也表现出特定的行为。可以通过对属性和行为的定义,将相似的对象划分为同一类。通过这个类还可以派
3、生出更多的具体的对象。对象之间还可以进行相互作用或相互操作,也就是说,一个对象可以通过执行某些指令来操作另外一个对象的数据。在和对象交互的过程中,对象内部的运作方式对用户是不可见的。这就保证了对象的安全性。对象可以被其他系统包含和复用。3.3.类类 类是现实世界某些对象的共同特征(属性和操作)的表示,是对象的蓝图或模型,通过类可以创建多个对象。4.4.封装封装 封装是把数据和方法放到一个类中的过程,即将信息隐蔽的过程。是什么促使我们将信息隐蔽呢?原因有两点:一、防止程序员接触他们不该接触的东西通常是内部数据类型的设计思想。若只是为了解决特定的问题,用户只需操作接口即可,毋需明白这些信息。二、只
4、允许库设计人员修改内部结构,不用担心它会对客户程序员造成什么影响。5.1.2 5.1.2 类的声明类的声明类的声明类的声明 类声明定义一个类的名称、访问权限、与其他类的关系等。声明类的格式为:类修饰符 class 类名 extends 父类名 implements接口名表 类体 说明:class 声明类的关键字。extends 指明本类继承的父类,在其后指定父类名 implements 指明本类使用的接口,在其后指定接口名表 类修饰符 用于指定类的使用特性和访问权限,例如类是否为抽象类或最终类等。可取以下三种之一:public 表明本类是共有类,在本包与其他包内均可访问。abstract 表明
5、本类为抽象类,必须被继承后才能使用。final 表明本类为最终类,不能被其他类继承。类声明紧接一对大括号,在大括号中是类体。【例例51】程序题目程序题目public class People public String name;public char sex;public int age;public String Idcard;public People()public Peple(String name,int age,String Idcard)this.name=name;this.age=age;this.Idcard=Idcard;public String getIdcard(
6、)return this.Idcard;public String setIdcard(String Idcard)this.Idcard=Idcard;下面是一些使用不同修饰符组合进行类定义的例子。(1)空类 class empty (2)最简单的类 class People 类体;(3)公有类public class People 类体;(4)最终类public final class People 类体;(5)抽象类public abstract class People 类体;(6)继承了父类People的子类public class Employee extends People 类
7、体;(7)继承了父类且实现了一个接口的类public class Employee extends People implements Comparable 类体;5.1.3 5.1.3 方法的声明方法的声明完整的成员方法声明语法格式:完整的成员方法声明语法格式:修饰符 方法返回值类型 方法名(形参数列表)throws 异常类 语句序列;return 返回值;例如,下面的程序是求最小值的方法声明。public int min(int a,int b)int c;c=(ab)?a:b;return c;说明:说明:(1)方法的修饰符是用于指定本方法的访问权限和特性,例如,方法是否为公有方法或类方
8、法等。方法的修饰符有以下几种:public|private|protected|default:该修饰符被称为访问控制修饰符,其规定了成员方法的可见范围。例如,public访问修饰符表示该方法可以被任何其他代码调用,而private表示方法只能被类中的其他方法调用。static该修饰符声明了本方法是类方法。final该修饰符声明了本方法为不可被子类所重写的最终方法。不可与abstract修饰符同时使用。abstract该修饰符声明了本方法为抽象类中的抽象方法,必须在非抽象的子类中实现具体操作。不可与final修饰符同时使用。(2)方法的返回值类型可以是基本数值型,也可以是任一引用类型,当没有返
9、回值时,其类型默认为void。(3)形参数列表用于接收方法调用时外界传来的参数,也可以没有参数,但注意的是小括号是不能省略的。每个参数都必须要有自己独立的类型声明,即使相邻的两个参数的类型是相同的也不能公用类型声明,参数之间要用逗号隔开。(4)throws 异常类:其中出现多个异常类时要用逗号隔开。5.1.4 5.1.4 方法调用及参数传递方法调用及参数传递1 1方法调用方法调用方法根据其是否带有static修饰符可以分为类方法和对象方法(实例方法)。(1)对象方法调用的格式:对象名方法名(实参列表);(2)类方法调用的格式:类名方法名(实参列表);没有返回值的方法调用,通常调用的方式比较简单
10、,一般直接构成方法调用语句。例如:System.out.println(“I am a boy!”);例如:int min0;min=Math.min(3,4);2参数传递参数传递(1)形参和实参【例例5 52 2】程序题目程序题目public class Test public int min(int a,int b)int c;c=(ab)?a:b;return c;public static void main(String args)int min=0,x=10,y=20;Test t=new Test();min=t.min(x,y);System.out.println(“min
11、is”+min);(2 2)值传递)值传递 【例例5 53 3】程序题目程序题目/简单类型是用值传递 class Test void method(int i,int j)i=i+10;j=j-10;public class CallByValue public static void main(String args)Test object=new Test();int a=25,b=30;System.out.println(调用前a和b的值:+a+b);object.method(a,b);System.out.println(调用后a和b的值:+a+b);(3 3)引用传递)引用传递【
12、例例54】程序题目程序题目/当参数为数组时,传递的方式为引用传递public class T2 public static void main(String args)int a=1,2,3;method2(a);System.out.println(a0);System.out.println(a1);System.out.println(a2);static void method2(int a)a0=0;a1=7;a2=8;【例例5 55 5】程序题目程序题目/当参数为对象时,传递的方式为引用传递class Test int a,b;Test(int i,int j)a=i;b=j;/传
13、递一个对象 void method(Test ob)ob.a=ob.a+10;ob.b=ob.b-10;public class CallByReference public static void main(String args)Test object=new Test(25,30);System.out.println(调用前object.a和object.b的值:+object.a+object.b);object.method(object);System.out.println(调用后object.a和object.b的值:+object.a+object.b);5.1.5 5.1
14、.5 对象的创建和使用对象的创建和使用1.1.对象声明对象声明类 对象2.2.对象的创建对象的创建(1)先声明对象,再创建对象格式一:格式一:类名 对象变量;新对象的声明对象变量=new 类名(参数列表);新对象内存空间的分配(2)声明对象的同时创建对象格式二:格式二:类名 对象变量=new 类名(参数列表);3.3.引用对象的成员变量和调用对象方法引用对象的成员变量和调用对象方法对象.成员变量对象.成员方法(参数列表)aday.year=2006;/引用对象的成员变量aday.setDate(2006,1,28);/调用对象的方法abcd.equals(abc)例如:People perso
15、n1=new People();People person2=person1;person1.name=“王明”;4 4thisthis引用引用 this用来访问本类的成员变量和成员方法的引用格式如下:(1)this成员变量 (2)this成员方法(参数列表)一般情况下,在以下几种情况下需要使用到this:第一,通过this调用另一个构造方法,用法是this(参数列表),这个仅仅在类的构造方法中,别的地方不能这么用。第二,函数参数或是函数中的局部变量和成员变量同名的情况下,成员变量被屏蔽,此时要访问成员变量则需要用“this.成员变量名”的方式来引用成员变量。第三,在函数中,需要引用该函所属类
16、的当前对象时候,直接用this。5 5supersuper引用引用 super用来访问父类的成员变量和成员方法的引用格式有以下几种:(1)super成员变量 (2)super(参数列表)(3)super.成员方法(参数列表)针对super的引用方式,下面总结一下super的用法:第一,在子类构造方法中要调用父类的构造方法,用“super(参数列表)”的方式调用,参数不是必须的。同时还要注意的一点是:“super(参数列表)”这条语句只能用在子类构造方法体中的第一行。第二,当子类方法中的局部变量或者子类的成员变量与父类成员变量同名时,也就是子类局部变量覆盖父类成员变量时,用“super.成员变量
17、名”来引用父类成员变量。当然,如果父类的成员变量没有被覆盖,也可以用“super.成员变量名”来引用父类成员变量,不过这是不必要的。第三,当子类的成员方法覆盖了父类的成员方法时,也就是子类和父类有完全相同的方法定义(但方法体可以不同),此时,用“super.方法名(参数列表)”的方式访问父类的方法。【例例5-65-6】程序题目程序题目class Personpublic int number;private String name;private int age;protected void setName(String name)this.name=name;protected void s
18、etAge(int age)this.age=age;protected void print()System.out.println(姓名:+name+,年龄:+age);public class DemoSuper extends Personpublic void print()System.out.println(DemoSuper:);super.print();public static void main(String args)DemoSuper test=new DemoSuper();test.setName(张三);test.setAge(20);test.print()
19、;【例例5-75-7】程序题目程序题目class Personpublic static void print(String s)System.out.println(s);Person()print(A Person.);Person(String name)print(A person name is:+name);public class Chinese extends PersonChinese()super();/调用父类构造函数(1)print(A chinese.);/(4)Chinese(String name)super(name);/调用父类具有相同形参的构造函数(2)pr
20、int(his name is:+name);Chinese(String name,int age)this(name);/调用当前具有相同形参的构造函数(3)print(his age is:+age);public static void main(String args)Chinese people=new Chinese();people=new Chinese(张三);people=new Chinese(张三,20);5.1.6 5.1.6 构造方法及特点构造方法及特点 1 1构造函数构造函数(1)构造函数1:public Integer(int value)this.value
21、=value;(2)构造函数2 public Integer(String a)throws NumberFormatException this.value=parseInt(s,10);2 2构造函数的特点构造函数的特点构造方法的使用局限在下述两个地方:(1)创建对象。(2)在构造方法的方法体的第一条语句,可以调用同类中的另一各构造方法或者是父类的构造方法。【例例5 58 8】程序题目程序题目 /下面的People类中包含两个构造函数。public class People public String name;public char sex;public int age;public S
22、tring Idcard;/第一种构造函数,一个不带任何参数和语句的构造函数 public People()/第二种构造函数,带有参数的构造函数 public People(String name,int age,String Idcard)this.name=name;this.age=age;this.Idcard=Idcard;【例例5 59 9】程序题目程序题目public class People public String name;public char sex;public int age;public String Idcard;public String getIdcard
23、()return this.Idcard;public String setIdcard(String Idcard)this.Idcard=Idcard;【例例5 51010】程序题目程序题目public class People public String name;public char sex;public int age;public String Idcard;public Peple(String name,int age,String Idcard)this.name=name;this.age=age;this.Idcard=Idcard;public String getI
24、dcard()return this.Idcard;public String setIdcard(String Idcard)this.Idcard=Idcard;【例例5 51111】程序题目程序题目 /例题510修改如下public class People public String name;public char sex;public int age;public String Idcard;public People()public People(String name,int age,String Idcard)this.name=name;this.age=age;this.
25、Idcard=Idcard;public String getIdcard()return this.Idcard;public String setIdcard(String Idcard)this.Idcard=Idcard;5.1.7 5.1.7 对象的初始化对象的初始化初始化的四个要点,如下:1如果有static,即静态成员定义,首先初始化static的变量。2static只初始化一次,在第二次创建类的对象的时候,就不会去执行static的语句。3变量的初始化在方法前。4在含有main的类中执行顺序是先做static,然后就是main,而不是像其它类一样,除了static就按顺序做下来
26、。5.2 任务二任务二 掌握类的封装掌握类的封装 5.2.1 5.2.1 访问权限访问权限访问控制符的修饰范围名称修饰符本类子类包所有类公共public可见可见可见可见私有private可见受保护protected可见可见可见友好可见可见注意:注意:(1)默认修饰符为friend类,但在Java语言中,friend不是关键字。所以在默认情况下,成员的访问范围只在本类和本包当中,其子类和其它类是不能访问的。(2)修饰符protected仅仅用于继承情况下。(3)当一个类成员的修饰符为public时,说明该成员可以被程序中任何其它代码访问。(4)当一个类成员的修饰符为private时,则该成员只能
27、它自身类的其它成员访问。访问控制符要放在成员类型的其他说明之前,也就是说,成员的声明语句必须以访问控制符开头。【例例5 51212】程序题目程序题目class Test1 int a;public int b;private int c;void setc(int i)c=i;int getc()return c;class Test2 public static void main(String args)Test1 object=new Test1();object.a=10;object.b=20;/object.c=100;/Error!object.setc(100);System.
28、out.println(a,b,and c:+object.a+object.b+object.getc();5.2.2 5.2.2 类变量和实例变量类变量和实例变量 1类变量类变量 类变量也称为静态变量,由static修饰,如:static int age;age就是类变量,它只能通过类来访问。类变量的访问格式不同于一般的实例变量。类变量的访问格式:类变量的访问格式:类名变量名类名变量名【例例5 51313】程序题目程序题目/下面的例子说明了类变量b在它的类之外如何被访问。class Demo static int a=42;static int b=99;void callme()Syst
29、em.out.println(a=+a);public class StaticByName public static void main(String args)Demo ob=new Demo();ob.callme();System.out.println(b=+Demo.b);2 2实例变量实例变量【例例5 51414】程序题目程序题目public class People public String name;public char sex;public int age;public String Idcard;/空构造方法 public People()/带三个参数的构造方法 p
30、ublic People(String name,int age,String Idcard)this.name=name;this.age=age;this.Idcard=Idcard;public static void main()People p1=new People();People p2=new People();3 3类变量和实例变量的区别类变量和实例变量的区别(1)实例变量没有static修饰符,它只能通过实例对象来访问,而类变量则直接通过类名来访问。(2)同一类的不同的实例对象有自己的实例变量,但是它们共享同一个类变量。当一个实例对象修改了它的实例变量时,不会影响其他的实例
31、对象。但当一个实例对象修改了类变量时,则会影响其他的对象实例。而类变量则是一变全变。(3)类变量要在使用前进行初始化,实例变量则不需要。5.2.3 5.2.3 类成员方法和函数数学方法类成员方法和函数数学方法1 1类成员方法类成员方法 类方法的调用格式:类方法的调用格式:类名方法名(实参列表)类名方法名(实参列表)【例例515】程序题目程序题目public class Example public static void display()System.out.println(类的方法);public void displayOne()System.out.println(对象的方法);pub
32、lic static void main(String args)Example.display();Example e=new Example();e.displayOne();类方法体有以下限制,一旦违反将导致编译错误:(1)类方法中不能引用对象变量(2)类方法中不不调用类的对象方法(3)在类方法中不能使用super、this关键字。2 2函数数学方法函数数学方法 sin(arg)cos(arg)tan(arg)asin(arg)acos(arg)atan(arg)atan2(arg1,arg2)正弦余弦正切余切反余弦反正切2个参数的反正切abs(arg)计算参数的绝对值max(arg1,
33、arg2)返回较大一个ceil(arg)返回大于等于该参数的最小整数floor(arg)返回小于等于该参数的最大整数round(arg)计算于参数值最接近的整数(参数floor或double)rint(arg)计算于参数值最接近的整数(参数double)min(arg1,arg2)返回小的一个IEEEremainder(art1,arg2)计算arg1除以arg2得到的余数sqrt(arg)求参数平方根cbrt(arg)求参数立方根pow(arg1,arg2)计算以arg1为底数,以arg2为指数的冥hypot(arg1,arg2)计算arg1和arg2的平方根exp(arg)计算e为底数以a
34、rg为指数的冥expm1(arg)计算e为底数以arg为指数的冥并减1log(arg)计算参数的自然对数log1p(arg)计算arg+1的自然对数log10(arg)计算参数的底数为10的对数random()返回一个大于0.0并且小于1.0的伪随机数(较常用)5.3 项目实战一 类和对象1.实战内容定义一个Person类,可以在应用程序中使用该类。要求具有:成员属性:Person类的属性(变量):姓名:name,字符串类型:String;性别:sex,字符型:char;年龄:age,整型:int。3个构造函数:public Person(String s)/设置姓名 public Perso
35、n(String s,char c)/调用本类的构造函数 Person(String s),设置性别 public Person(String s,char c,int i)/调用本类的构造函数PersonPerson(String s,char),设置年龄一个成员方法:public String toString()/获得姓名、性别和年龄利用定义的Person类,请实例化对象,输出下面结果:姓名:张三 性别:男 年龄:212.实战目的 通过实战,掌握类的定义方法;实例化对象。3.实战过程程序代码如下:public class Person private String name;privat
36、e char sex;private int age;public Person(String s)name=s;publicname=s;sex=c;public Person(String s,char c,int i)name=s;sex=c;age=i;public String toString()if(sex=M)|(sex=m)return 姓名:+name+性别:男+年龄:+age;else if(sex=W)|(sex=w)return 姓名:+name+性别:女+年龄:+age;elsepublic static void main(String args)Person p
37、1=new Person(张三,M,21);System.out.println(p1.toString();项目小结 本项目重点介绍了定义和使用类的基础知识。类是对象的蓝图或模型,它定义了对象的行为和属性。(1)类的定义类的三要素:类名、属性和方法。定义一个类包含3个步骤:属性声明、构造方法的定义和成员方法的定义。在定义完类之后要对数据进行初始化。若在类的属性和方法声明中使用了static修饰符,则说明该属性和方法是类属性和类方法,供本类的所有对象共享;没有被static修饰的属性和方法则只属于基于该类创建的某个对象。(2)对象 对象是类的实例,它的生命周期包括从对象被创建到对象的消亡,在这段时间它在内存中占有一定的空间。每个对象都具有:对象变量名;对象的状态;对象的行为,通常把它称为方法,通过它所接收的消息来定义。读者需要重点掌握的是构造方法的作用。类的方法声明中的this只有在运行中才与一个具体的对象联系,指向包含该方法体的对象。