Java与面向对象技术(09级).ppt

上传人:牧羊曲112 文档编号:6509618 上传时间:2023-11-07 格式:PPT 页数:146 大小:1.51MB
返回 下载 相关 举报
Java与面向对象技术(09级).ppt_第1页
第1页 / 共146页
Java与面向对象技术(09级).ppt_第2页
第2页 / 共146页
Java与面向对象技术(09级).ppt_第3页
第3页 / 共146页
Java与面向对象技术(09级).ppt_第4页
第4页 / 共146页
Java与面向对象技术(09级).ppt_第5页
第5页 / 共146页
点击查看更多>>
资源描述

《Java与面向对象技术(09级).ppt》由会员分享,可在线阅读,更多相关《Java与面向对象技术(09级).ppt(146页珍藏版)》请在三一办公上搜索。

1、Java与面向对象技术,类的定义与对象的创建构造方法的作用及应用面向对象三大特征的实现抽象类与接口的应用包的创建与使用访问控制符的应用,重点及难点,构造方法的作用及应用面向对象三大特征:封装性、继承性和多态性的Java语言实现抽象类与接口的应用异常处理,2.2 对象的基本概念,变量,方法,客观世界的实体,程序中对象,对象具有两方面的含义(考虑从哪些方面描述对象),类的基本概念,类是抽象的,对象是具体的,具有相同特征和行为的对象被抽象为类。类是对象的模板,包括一个对象的所有数据和代码。,类的示例,形状类,动物类,汽车类,对象,“对象是存在的具体实体,具有明确定义的状态和行为。”,对象的示例,收银

2、员对象,顾客对象,顾客姓名:朱丽叶年龄:28体重:52千克操作:购买商品,状态,姓名:布兰尼职衔:收银员年龄:35体重:60千克操作:收款打印帐单,行为,消息传递,“消息指一个对象为执行某项特定操作而向另一个对象发送的请求”,类和对象的示例,雇员,收银员,系统管理员,仓库管理员,面向对象技术的实现,对象、类和实体的关系,类是创建对象的模板,对象是类的实例,类的基本概念,class Car int color;int name;int speed;void brake()void speedUp()void slowDown(),类定义,类的修饰符:public|friendly abstrac

3、t final缺省方式为 friendly|package,格式:修饰符 class 类名 extends 父类名 implements 接口名表 成员变量声明 成员方法声明,其中class、extends和implements都是Java的关键字。,声明成员变量,声明成员变量格式为:;,public class Date1/类声明 int year,month,day;/成员变量,public|protected|private static final transient volatile 缺省为:friendly|package,public class Date1 int year,m

4、onth,day;void print()System.out.println(date is+year+-+month+-+day);,声明成员方法,类的行为由其方法实现,其他对象可以调用对象的方法来得到该对象的服务。类中需要定义成员方法的声明和实现。,()throws,方法修饰符为:public|protected|private static final|abstract native synchronized缺省为:friendly|package,方法的返回值 return 表达式;return;,public class Date1 int year,month,day;boole

5、an isleapyear()/判断年份是否为闰年 boolean lean;lean=(year%400=0)|(year%100!=0),例:声明日期类,public class Date1 int year,month,day;void setdate(int y,int m,int d)/设置日期值 year=y;month=m;day=d;boolean isleapyear()/判断年份是否为闰年 boolean lean;lean=(year%400=0)|(year%100!=0),定义一个名为Rectangle表示长方形的类,它包含double类型的长length和宽widt

6、h两个数据成员和设置长方形长宽值的方法setDim()、计算长方形面积的方法area()。,类的实现,练 习 题,定义Student类如下:1.属性包括:学号,出生年份,数学成绩,英语成绩和计算机成绩。2.方法包括:1)设置初值。2)sum方法(计算并输出总成绩)2)age方法(计算年龄),变量的作用范围,Java允许在任何一个程序块中声明变量,该变量的作用范围就是声明该变量的程序块,在作用域之外,不能访问该变量。方法体中声明的局部变量的作用域在该方法内部。不是类的成员变量。,class Abc int a,b,c,x=5;void f()int x=10;System.out.println

7、(“x=+x);,x为局部变量,作用域在方法f内,若局部变量与类的成员变量同名,则类的成员变量被隐藏。,方法和变量的作用域,在Java语言中,方法与变量的作用域,根据定义的位置不同,作用域也不全相同。当一个方法使用某个变量时,以如下的顺序查找变量:,public class Date1 int year,month,day;void setdate(int y,int m,int d)/设置日期值 year=y;month=m;day=d;boolean isleapyear()/判断年份是否为闰年 boolean lean;lean=(year%400=0)|(year%100!=0),例:

8、声明日期类,public class Date1 int year,month,day;void setdate(int y,int m,int d)year=y;month=m;day=d;boolean isleapyear()return(year%400=0)|(year%100!=0),int year,month,day;,对象的声明与创建,Car demoCar;,声明对象,实例化对象,声明对象的同时实例化对象,类名 对象名;,对象名=new 类名(),运算符new为对象分配内存空间,它调用对象的构造方法,返回引用,类名 对象名=new 类名(),0XA058,demoCar=n

9、ew Car();,对象的声明与创建,创建对象,int i;,Date1 a;,a=new Date1();,成员变量初始化,当类中的某个成员变量属于基本数据类型时,即使没有为它提供初值,Java也保证它有一个初始值。,public class Date1 int year,month,day;,另外执行构造方法,可进行初始化,对象的使用,访问对象成员的一般形式为:对象名.成员变量名 对象名.成员方法名(),运算符”.”在这里称为成员运算符,对象的使用,引用成员变量.a.year=2006;,public class Date1 int year,month,day;void setdate(

10、int y,int m,int d)year=y;month=m;day=d;,Date1 a=new Date1();,2006,a.month=3;a.day=6;a.day+;,3,6,7,参数传递值传递,void setdate(int y,int m,int d)year=y;month=m;day=d;,a.setdate(2006,3,6),调用成员方法,格式:.(),2006,3,6,例:声明日期类,public class Date1 int year,month,day;void setdate(int y,int m,int d)year=y;month=m;day=d;

11、boolean isleapyear()return(year%400=0)|(year%100!=0),对象的构造和初始化,在用new生成对象实例时:new(参数表);系统自动初始化所有变量,步骤为:分配新对象的空间,并进行默认的初始化执行显式的成员初始化 执行构造方法,默认的初始化,实例化对象时,系统会对成员变量进行默认的初始化。,显式成员初始化,例如:在Date1类的定义中,若有:class Date1 int year=2011;,则实例化a时:Date1 a=new Date1();a.year的值被初始化为2011。,构造方法,在Java中,任何变量在被使用前都必须先设置初值。Ja

12、va提供了为类的成员变量赋初值的专门功能:构造方法。,作用:对成员变量进行初始化。构造方法的名字必须与类名相同。构造方法没有返回值,并且没有void修饰符。在实例化对象的时候由new运算符自动调用。,对象名=new 类名(参数表);,构造方法,例:使用构造方法为日期赋初值,public class Date2 int year,month,day;Date2(int y,int m,int d)year=y;month=m;day=d;void print()System.out.println(date is+year+-+month+-+day);,class Date2_ex publi

13、c static void main(String args)Date2 a=new Date2(2006,3,6);a.print();,void setdate(int y,int m,int d)year=y;month=m;day=d;,Date2 a=new Date2();a.setdate(2006,3,6);,一个类中可以有多个具有不同参数列表的构造方法。若一个类没有构造方法,系统会自动为类生成一个 默认的构造方法,其参数列表及方法体均为空。Date2()如果程序员在类中定义了一个以上的构造方法,则 自动屏蔽掉默认的构造方法。程序员定义的构造方法中,最好包括一个参数表为 空的构

14、造方法,否则在调用new Xxxx()时会出错。构造方法不能继承。,构 造 方 法的说明,注意:一旦我们自己定义了构造方法,系统将不再为我们提供默认的不带参数的构造方法。,public class Date2 int year,month,day;Date2(int y,int m,int d)year=y;month=m;day=d;Date2(int y,int m)year=y;month=m;Date2(int y)year=y;,public static void main(String args)Date2 a=new Date2(2006,3,6);Date2 b=new Da

15、te2(2006,3);,public class Date2 int year,month,day;Date2(int y,int m,int d)year=y;month=m;day=d;Date2(int y,int m)year=y;month=m;Date2(int y)year=y;Date2()public static void main(String args)Date2 a=new Date2(2006,3,6);Date2 a=new Date2(2006,3);Date2 a=new Date2();,为Date2类添加一个构造方法,要求能够对所赋初值进行检验:月份在1

16、12之间,日期在131之间。,public class Date2 int year,month,day;Date2(int y,int m,int d)year=y;month=(m=1),class PersonString name;int age;String sex;public Person(String s1)name=s1;public Person(String s1,int x)name=s1;age=x;,任务二实现,public Person(String s1,int x,String s2)name=s1;age=x;sex=s2;public void eat()

17、System.out.println(Its delicious!);,class TestPersonpublic static void main(String args)Person p1=new Person(Tom);Person p2=new Person(John,20);Person p3=new Person(Bob,22,male);System.out.println(p1.name+p1.age+p1.sex);System.out.println(p2.name+p2.age+p2.sex);System.out.println(p3.name+p3.age+p3.s

18、ex);,通过构造方法赋初值,对象的销毁,Java的垃圾回收机制自动判断对象是否在使用,并能够自动销毁不再使用的对象,收回对象所占的资源。程序中也可以使用析构方法finalize()随时销毁一个对象,将资源还给系统。,对象的销毁,finalize方法,没有参数,也不返回值。一个类只能有一个finalize()。,finalize方法的说明方式如下:protected void finalize()throws Throwable,protected void finalize()System.out.println(“have been collected”),2.4.1 类的封装,封装(en

19、capsulation):类的设计者把类设计成一个黑匣子,使用者只能看见类中定义的公共方法,而看不见方法的实现细节,也不能直接对类中的数据进行操作。封装的目的隐藏类的实现细节;迫使用户通过接口去访问数据;增强代码的可维护性。,如何封装,1.访问权限 2.设置类的访问权限 3.设置类成员的访问权限,包,包(package)是Java提供的一种区别类名字空间的机制,是类的组织方式。包对应一个文件夹,包中可以再有包,称为包等级。同一个包中的类名不可以重复,不同包中的类名可以相同。有助于避免命名冲突。,包,Java中预定义了许多包,常用的有:java.lang语言包,提供Object、String等基

20、础类java.util实用包,提供日期类等实用类java.awt抽象窗口工具包java.text文本包java.io输入输出流的文件包java.applet Applet应用程序包网络功能包,创建包,package 包名1.包名2.,语法格式如下:,注意:在Java程序中,package语句必须是程序的第一条非空格、非注释语句。,创建包举例,package mypackage.personmanage;public class Person public String name;public int age;public void getInfo()System.out.println(nam

21、e);System.out.println(age);public void eat()System.out.println(Its delicious!);,package mypackage.personmanage;这条语句指定这个包中的文件存储在目录 path/mypackage/personmanage下。包层次的根目录path是由环境变量CLASSPATH来确定的。,导入包,1、使用import语句 import 包名.标识符;import 包名.*;import java.util.Date;import java.util.*;Date day=new Date();,2、直接

22、使用包 java.util.Date day=new java.util.Date();mypackage.personmanage.Person p=new mypackage.personmanage.Person();,导入包举例,package yourpackage;import mypackage.Person;class Student extends Person String school;public void study()System.out.println(Studding);public static void main(String args)Student s=

23、new Student();s.name=John;s.age=19;s.school=“华北电力大学;s.getInfo();s.study();,访问权限,权限修饰符允许的访问级别,设置类的访问权限,可以用public将类设置为公有的。公有类可以被其他类所访问和引用。在一个源程序中,public类只能有一个。可以不用权限修饰符。(包访问性)只能被同一个包中的类访问和引用。不允许使用public以外的权限修饰符。,public class Date1/公有的类class Date1/非公有的类private class Date2,3.设置类中成员的访问权限,类中的成员,包括成员变量成员方法

24、声明类中的成员时,可以用权限修饰符来限制其他类的对象访问该成员。,public class Date1 int year,month,day;void setdate(int y,int m,int d)year=y;month=m;day=d;,private int year,month,day;public void setdate(),public protected 无(friendly)private,设置类中成员的访问权限,公有的,说明该类成员可被所有类的对象使用。,保护的,说明该类成员能被同一类中的其他成员、或其子类成员、或同一包中的其他类访问。,默认的,说明该类成员能被同一类

25、中的其他成员、或同一包中的其他类访问。,私有的,该类成员只能被同一类中的其他成员访问。,类中成员的访问修饰符,public class Date3 private int year,month,day;public Date3(int y,int m,int d)year=y;month=(m=1),class Date3_ex public static void main(String args)Date3 a=new Date3(2006,3,10);System.out.println(a.year);,public class Date3 private int year,month

26、,day;/成员变量,私有的 public Date3(int y,int m,int d)year=y;month=(m=1),class Date3_ex public static void main(String args)Date3 a=new Date3(2010,3,10);System.out.println(a.year()+is a leap year,+a.isleapyear();,public int getyear()return year;,a.getyear(),属于类的变量和方法staticstatic用在变量或方法前,表明它们是属于类的,称为类方法(静态方法

27、)或类变量(静态变量)。若无static修饰,则是实例方法和实例变量。,类变量在各实例间共享,class ABCD char data;static int share_data;class Demo ABCD a,b,c,d;,实例成员与类成员,实例变量:每次创建对象时,系统都创建实例变 量的拷贝。每一个对象都有一个实例变量。类变量:运行时,只为该类的第一个对象分配内存 单元,其后创建的所有对象都共享这一类变量。,实例成员与类成员,类变量的应用,class Userstatic int count=0;void login()count+;System.out.println(你是第+cou

28、nt+位访问者);class Count public static void main(String args)User u1=new User();u1.login();User u2=new User();u2.login();,实例方法即可以访问类变量,也可以访问实例变量。实例方法只能通过对象来调用。类方法只能使用其内部定义的局部变量或类变量。即可以通过对象来调用,也可以通过类名来调用。目的:使方法独立于类的实例,使用类去访问。,实例成员与类成员,注意,实例变量允许超前引用类变量实例变量不能超前引用实例变量,静态变量不能超前引用静态变量实例方法中允许超前引用实例变量和类变量类方法中只允

29、许访问类变量,但允许超前引用,class Date4_ex public static void main(String args)Date4 a=new Date4(2011,3,1);a.print_count();a.print();Date4 b=new Date4(2011,5,1);b.print _count();b.print();a.finalize();Date4.print_count();,例:实例成员与类成员,public class Date4 private int year,month,day;static int count=0;public Date4(in

30、t y,int m,int d)year=y;month=m;day=d;count+;public static void print_count()System.out.print(count=+count+);public void print()System.out.println(date is+year+-+month+-+day);public void finalize()count-;,count=1 date is 2011-3-1count=2 date is 2011-5-1count=1,类方法的应用,public class IsPrimepublic static

31、 boolean prime(int x)for(int k=2;k=Math.sqrt(x);k+)if(x%k=0)return false;return true;Class TestIsPrimepublic static void main(String args)for(int m=10;m=100;m+)if(IsPrime.prime(m)System.out.println(m+“是素数。);,类变量静态初始化程序,通过执行一段程序来对类变量进行初始化。格式:static,实例成员与类成员,实例变量与类变量 private int year,month,day;/实例变量,私

32、有的 static int count=0;/类变量实例方法与类方法 public static void print_count()/类方法,只能访问类变量 public void print()/实例方法,class StaticError String mystring=“hello”;public static void main(String args)System.out.println(mystring);,编译时错误信息:non-static variable mystring cannot be referenced from a static context System.

33、out.println(mystring);”。,为什么不正确:只有实例方法可以访问实例变量。,1.将变量改成类变量class StaticError static String mystring=“hello”;public static void main(String args)System.out.println(mystring);,解决的办法,2.先创建一个类的实例class NoStaticError String mystring=“hello”;public static void main(String args)NoStaticError noError;noError=

34、new NoStaticError();System.out.println(noError.mystring);,继承(inheritance),父类,子类,类继承是指一个类可以继承其他类的非私有成员,实现代码复用。被继承的类称为父类,继承父类后产生的类称为子类。,继承的优点,Java中继承的特点,注意:在Java语言中,只允许单继承。,Java中的类都是Object的子类。Object类定义了所有对象都必须具有的基本状态和行为,例如,等待条件变量、转化为字符串、通知其他对象条件变量已改变等。Java中的每个类都从Object类继承了变量和方法,因而Java的所有对象都具有Object对象的

35、基本状态和行为。,object类,public final Class getClass()获取当前对象所属的类信息,返回Class对象。public String toString()返回当前对象本身的有关信息,按字符串对象返回。public boolean equals(Object obj)比较两个对象是否是同一对象,是则返回true。protected Object clone()生成当前对象的一个拷贝,并返回这个复制对象。protected void finalize()throws Throwable 定义回收当前对象时所需完成的资源释放工作。,object类,何时选择继承?一个很

36、好的经验:“B是一个A吗?”如果是,则让B做A的子类。,常犯的错误A有一个B吗?例如让汽车轮子成为汽车的子类是错误的,继承的实现,class SubClass extends SuperClass,关键字,如缺省extends子句,则该类为java.lang.Object的子类。可以继承访问权限为public、protected、frendly的成员变量和方法;不能继承访问权限为private的成员变量和方法。构造方法不能继承。,例:子类继承超类的成员变量,public class Person String name,sex;int age;,class Student extends Pe

37、rson String dept;,class Student String name,sex;int age;String dept;,例:子类继承超类的成员方法,public class Person protected String name;protected int age;Person(String n1,int a1)name=n1;age=a1;public void print()System.out.println(name+,+age);class Student extends Person protected String dept;Student(String n1

38、,int a1,String d1)name=n1;age=a1;dept=d1;public static void main(String args)Person p1=new Person(李广,21);p1.print();Student s1=new Student(“陈小瑞”,19,计算机系);s1.print();,李广,21陈小瑞,19,子类继承超类的成员变量,如果子类声明一个与超类成员变量同名的成员变量,子类的成员变量就隐藏了超类的成员变量。这里的隐藏是指子类拥有了两个相同名字的变量,一个继承自超类,另一个自己定义。当子类执行继承自超类的操作时,处理的是继承自超类的变量,而当

39、子类执行它自己定义的方法时,所操作的是它自己定义的变量,而把继承自超类的变量“隐藏”起来了。,class A int data=3;void aprint()System.out.println(data=+data);class B extends A int data=5;void bprint()System.out.println(data=+data);public static void main(String args)B b=new B();System.out.println(data=+b.data);b.aprint();b.bprint();,data=5data=3d

40、ata=5,当子类中的变量名与超类的相同,超类的变量被隐藏。当子类执行继承自超类的方法时,使用继承自超类的变量,当子类执行它自己的方法时,使用自己定义的变量。,方 法 的 覆 盖,子类可以继承父类的方法,也可以自己定义与父类的方法名、参数表及返回类型完全一致的方法,来覆盖父类的方法,即子类中的方法隐藏了父类中同名同参数表的方法。在子类中,若要调用父类中被覆盖的方法,可以使用super。,this引用,指代当前对象本身 格式为:this 访问当前对象的变量和方法。格式为:this.this.调用本类的构造方法。格式为:this(),This引用,构造方法的形式参数与类的成员变量名相同时,需要使用

41、this。在构造方法中调用其他重载的构造方法,用this(参数列表)的形式。,class Date1 int year,month,day;Date1(int year)this.year=year;,class Date1 int year,month,day;Date1(int y)year=y;Date1(int y,int m)this(y);month=m;Date1(int y,int m,int d)this(y,m);day=d;Date1()class Apublic static void main(String args)Date1 d1=new Date1();Date

42、1 d2=new Date1(2006);Date1 d3=new Date1(2006,3);Date1 d4=new Date1(2006,3,25);System.out.println(date:+d4.year+d4.month+d4.day);,this(),当一个构造方法需要调用另一个构造方法时,应使用this,同时这个调用语句应该是整个构造方法的第一个可执行语句。,class Date private int year,month,day;/构造方法,略 void printDate()/输出日期,略 boolean isLeap()/判断是否为闰年,略 private int

43、 daysInYear()/计算日期在本年为第几天,略,This的使用,class Date int countDay(Date d1,Date d2)/计算两个日期相距的天数 d2.year=d1.year;if(d1.monthd2.month|d1.month=d2.month,调用:today.countDay(today,birthday),This的使用,class Date int countDay(Date d1,Date d2)d2.year=this.year;if(this.monthd2.month|this.month=d2.month,int countDay(Da

44、te d2),This的使用,调用:today.countDay(today,birthday),调用:today.countDay(birthday),super引用,使用关键字super,可以引用被子类隐藏的超类 的成员变量和成员方法,称为super引用。访问被子类隐藏的超类的成员变量和成员方法。super.变量名super.方法名 调用超类的构造方法。super(参数列表),public class Person4 static int count=0;protected String name;protected int age;public Person4(String n1,int

45、 a1)/构造方法 this.name=n1;this.age=a1;this.count+;public int olderthan(Person4 b)/比较两个人的年龄 return this.age-b.age;public void print()System.out.print(this.getClass().getName()+);System.out.print(count=+this.count+);System.out.println(+this.name+,+this.age);,例:this和super引用,class Student4 extends Person4

46、protected String dept;Student4(String n1,int a1,String d1)super(n1,a1);/调用超类的构造方法 dept=d1;public static void main(String args)Person4 p1=new Person4(李大广,21);p1.print();Student4 s1=new Student4(陈小瑞,19,计算机系);s1.print();System.out.println(年龄差=+p1.olderthan(s1);,例:this和super引用,super必须是子类构造方法的第一条语句。,当一个消

47、息(method)被发送给一个实例时,系统会在类层次树上进行查找。假设向类D的对象发送了一条消息M().,方法查找,如果方法 M()在类 D中定义,则执行此方法。否则在D的父类(C)中查找此方法。如果仍未找到,则沿类的层次继续向上查找,直到Object类。,方法查找的路径,可以使用super关键字来指定方法查找的开始位置。,方法查找的路径,构造方法的继承,构造方法不能继承,但子类在创建对象时要对继承来自父类的成员进行初始化,因此,在创建子类时除了执行子类的构造方法外,还需要调用父类的构造方法,具体遵循原则如下:,当子类未定义构造方法时,创建对象时将无条件地调用父类的无参构造方法;对于父类的含参

48、数构造方法,子类可以在自己构造方法中使用super调用它,但super调用语句必须是子类构造方法中的第一个可执行语句;子类在自己的构造方法中如果没有用super明确调用父类的构造方法,则在创建对象时,将自动先执行父类的无参构造方法,然后再执行自己定义的构造方法。,instanceof 对象运算符,操作符instanceof用来判断对象是否属于某个类的实例。若是则返回true,否则返回false。,public void method(Employee e)if(e instanceof Manager)/do something as a Manager else if(e instanceo

49、f Secretary)/do something as a Secretary else/do something else,例题:用向量实现,创建3个学生对象(学号、姓名、年龄)和4个教师对象(教工号、姓名、系别),并且输出。,创建向量的对象,import java.util.*;class Stu String xh;String xm;int nl;public Stu(String xh1,String xm1,int nl1)xh=xh1;xm=xm1;nl=nl1;void disp()System.out.println(学生:+xh+xm+nl);,class Tech St

50、ring zh;String xm;String xb;public Tech(String zh1,String xm1,String xb1)zh=zh1;xm=xm1;xb=xb1;void disp()System.out.println(教师:+zh+xm+xb);,public class StuTer public static void main(String s)Vector st=new Vector();st.addElement(new Stu(101,李明,18);st.addElement(new Stu(102,王大力,20);st.addElement(new

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号