第4章 Java与面向对象技术09级_第1页
第4章 Java与面向对象技术09级_第2页
第4章 Java与面向对象技术09级_第3页
第4章 Java与面向对象技术09级_第4页
第4章 Java与面向对象技术09级_第5页
已阅读5页,还剩141页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java

Java与面向对象技术

口类的定义与对象的创建

口构造方法的作用及应用

口面向对象三大特征的实现

口抽象类与接口的应用

口包的创建与使用

口访问控制符的应用

Java重点及难点

口构造方法的作用及应用

口面向对象三大特征:封装性、继

承性和多态性的Java语言实现

口抽象类与接口的应用

口异常处理

&

Java2.2对象的基本概念

对象具有两方面的含义(考虑从哪些方面描述对象)

Java类的基本概念

口具有相同特征和行为的对象被抽象为类。

口类是对象的模板,包括一个对象的所有数

据和代码。

类是抽象的,对象是具体的

对象

Java

量对象的示例

Java

0姓名:布兰尼

职衔:收银员

年龄:35

体重:60千克

操作:

收款

打印帐单

行为

消息传递

Java

赢类和对象的示例

雇员

收银员系统管理员仓库管理员促销员采购经理

Java面向对象技术的实现

对象、类和实体的关系

/计算机世界\

现实世界

映射

对象实体

I实例化]:抽象

抽象

计算机逻辑的实现

类抽象数据类型

类是创建对象的模板,对象是类的实例

Java类的基本概念

赢类定义

[修饰符]class类名[extends父类名]]

[implements接口名表],

成员变量声明

成员方法声明

其中cIass>extends和impIements都是Java的关键字。

类的修饰符:[public|friendly][abstract][final]

缺省方式为friendly|package

声明成员变量

Java

声明成员变量格式为:

[〈修饰符〉]〈变量类型〉〈变量名〉;

[public|protected|private][static][final]

[transient][volatile]缺省为:friendly(package

publicclassDatel〃类声明

{、

intyear,month,day;〃成员变量

Java声明成员方法

类的行为由其方法实现,其他对象可以调用对象的方法来得

到该对象的服务。类中需要定义成员方法的声明和实现。

[〈修饰符>]<返回值类型〉〈方法名>([〈参数表〉])[throws〈异常类〉]

〈方法体〉

方法修饰符为:[public]protected|private][static]

[final|abstract][native][synchronized]

缺省为:friendly|package

oysiern.oui.pnnurnuaieisfyear+--i-rrionui-f-+uay;;

毫□方法的返回值

JclVCI

return表达式;

return;

publicclassDatel

{

intyear,month,day;

booleanisleapyear()//判断年份是否为闰年

{booleanlean;

lean=(year%400==0)|(year%100!=0)&(year%4==0);

returnlean;

}

}

publicclassDatel

intyear,month,day;

例voidsetdate(inty,intm,intd)〃设置日期值

(

year=y;month=m;day=d;

声}

明booleanisleapyear()〃判断年份是否为闰年

{

booleanlean;

期lean=(year%400==0)|(year%100!=0)&(year%4==0);

类returnlean;

}

voidprint()〃输出日期值

System.out.println(ndateis''+year+'-'+month+'-'+day);

}

Java类的实现

定义一个名为Rectangle表示长方形的类,

它包含doubIe类型的长Iength和宽width两

个数据成员和设置长方形长宽值的方法

setDimO>计算长方形面积的方法area()。

嬴练习题

定义Student类如下:

1.属性包括:学号,出生年份,数学成绩,

英语成绩和计算机成绩。

2.方法包括:

1)设置初值。

2)sum方法(计算并输出总成绩)

2)age方法(计算年龄)

彘变量的作用范围

jdVci

AJava允许在任何一个程序块中声明变量,该变量的

作用范围就是声明该变量的程序块,在作用域之外,

不能访问该变量。

»方法体中声明的局部变量的作用域在该方法内部。

不是类的成员变量。classAbc{.

inta,b,c,x=5;x为局部变量,作

若局部变量与类的‘..〃\r用域在方法f内

voidf(){-------------------

成员变量同名,intx=10;

则类的成员变量被隐藏。System.out.printlnf'x="+x);

)

嬴方法和变量的作用域

在Java语言中,方法与变量的作用域,根据

定义的位置不同,作用域也不全相同。当一

个方法使用某个变量时,以如下的顺序查找

变量:

import类和包

各级父类.

当前类厂2222^

当前方法

publicclassDatel

{

intyear,month,day;

voidsetdate(intyjntm,intd)〃设置日期值

year=y;month=m;day

}

booleanisleapyear()〃判断年份是否为闰年

booleanlean;

lean=(year%400==0)|(year%100!=0)&(year%4==0);

returnlean;

voidprint()〃输出日期值

System.out.printingdateis''+year+'-'+month+'-'+day);

}

4、

publicclassDatel

{

:二

voidsetdate(inty/ntmzintd)

声{intyear,month,day;

明year=y;month=m;day=d;

日}

booleanisleapyear()

(

类return(year%400==0)|(year%100!=0)&(year%4==0);

}

voidprint()

(

System.out.println(ndateis''+year+'-'+month+'-'+day);

}

Java对象的声明与创建

s

创建对象

inti;i0

Datela;anull

a=newDate1();a0x03456789yearo

montho

dayo

<

急成员变量初始化

JdVd

当类中的某个成员基本数据类型缺省初值

变量属于基本数据booleanfalse

类型时,即使没有char'\0'(null)

为它提供初值,byte(byte)O

Java也保证它有一short(short)O

个初始值。int0

longOL

publicclassDatelfloatO.Of

intyear,month,day;DoubleO.Od

)引用类型null

另外执行构造方法,可进行初始化

嬴对象的使用

访问对象成员的一般形式为:

对象名.成员变量名

对象名.成员方法名()

运算符”.”在这里称为成员运算符

鱼对象的使用

Java

□引用成员变量publicclassDatel

intyear,month,day;

voidsetdate(intyintm,intd)

v对象名〉,〈变量名〉z

year=y;

month=m

a.year=2006;day=d;

a.month=3;}

a.day=6;Datela=newDate1()

a0x03456789year

a.day++;month

day

调用成员方法

工格式:〈对象名〉.V方法名>([<参数表>])

publicclassDatel

上参数传递一一值<

intye3rzmonth,day;

void$etdate(intyjntmjntd)〃设置日期值

{

year=y;mouth=m:day=<1:

a,setdate(2006,|

booleani$leapyear()〃判断年份是否为闺年

booleanlenn:

lean=(yeai°o400==0)|(year°ol00!=0)&(ye;uoo4==0):

letiunlean:

)

voidprint()〃输出日期值

i

morSystem.outpi'iiiHii(,,(Iateis**+year+*-*+mo»tk+*-*+<lay);

}

a0x03456789year

month

day

publicclassDatel

intyeai7monthzday;

voidsetdate(inty,intm,intd)

■例{year=y;month=m;day=d;

:booleanisleapyear()

声{return(year%400==0)|(year%100!=0)&(year%4==0);

明}

为voidprint()

□{System.out.println(ndateis"+year+'」+month+'」+day);

期}

来publicstaticvoidmain(Stringargs[])

{Datela=newDatel();

a.setdate(2006,3?6);

a.printQ;

System.out.println(a.year+nisaleapyear,n+a.isleapyear());

嬴对象的构造和初始化

在用new生成对象实例时:

〈变量名〉=new〈类名〉(参数表);

系统自动初始化所有变量,步骤为:

-分配新对象的空间,并进行默认的初始化

-执行显式的成员初始化

■执行构造方法

晶默认的初始化

基本数据类型缺省初值

实例化对象时,booleanfalse

系统会对成员char'\0'(null)

byte(byte)O

变量进行默认

short(short)O

的初始化。int0

longOL

floatO.Of

DoubleO.Od

引用类型null

<

Java显式成员初始化

例如:在Datel类的定义中,若有:

classDatel

{intyear=2011;

则实例化a时:

Datela=newDatel();

a.year的值被初始化为2011。

构造方法

Java

在Java中,任何变量在被使用前

都必须先设置初值。Java提供了

为类的成员变量赋初值的专门功

能:构造方法。

构造方法

Java

作用:对成员变量进行初始化。

构造方法的名字必须与类名相同。

-构造方法没有返回值,并且没有void修饰符。

■在实例化对象的时候由new运算符自动调用。

对象名=new类名(参数表);

:

使publicclassDate2

voidsetdate(inty,intm,intd)

用{intyear,month,day;

{year=y;month=m;day=d;}

构Date2(inty5intm,intd)

{year+monthvm;day=d;}

造、;

voidprint()\\\

{System.ouujH-innn(noateis"+year+'-'+month+'-'+day);

classDate2_ex\\\

期{publicstaticvoidmain(StHng\rgs[])

赋{Date2a=newDate2(2006,3,6);

a.print();Date2a=newDate2();”

a.setdate(2006,396);

弃构造方法的说明

Java

>一个类中可以有多个具有不同参数列表的构造方法。色

>若一个类没有构造方法,系统会自动为类生成一个

默认的构造方法,其参数列表及方法体均为空。

Date2(){}

>如果程序员在类中定义了一个以上的构造方法,则

自动屏蔽掉默认的构造方法。

>程序员定义的构造方法中,最好包括一个参数表为日

空的构造方法,否则在调用newXxxx()时会出错。

>构造方法不能继承。’

①|注意:一旦我们自己定义了构造方法,系统将不再为|—

->我们提供默认的不带参数的构造方法。㈢

JapublicclassDate2

{intyear,month,day;

Date2(inty,intm,intd)

{yearmlsmthXm;day=d;}

Date2(int\

{year=ykmX

Date2(inty)\\\\\

{year=y;}\

publicstaticvoid[])

{Date2a=newDatez^ob^.3,6);

Date2b=newDate2(2006,3);

<

publicclassDate2

{intyear,month,day;

Date2(inty,intm,intd)

{year=y;month=m;day=d;}

Date2(inty,intm)

{year=y;month=m;}

Date2(inty)

{year=y;}

Date2(){}

publicstaticvoidmain(Stringargs[])

{Date2a=newDate2(2006,3,6);

Date2a=newDate2(2006,3);

Date2a=newDate2();

为Date2类添加一个构造方法,要求能够对所赋初值

进行检验:月份在1〜12之间,日期在1〜31之间。

publicclassDate!

{intyear,month,day;

Date2(inty,intm,intd)

{year=y;

month=(((m>=l)&(m<=12))?m:1);

day=(((d>=l)&(d<=31))?d:1);

嬴任务二实现

通过构造方

classTestPerson

法赋初值

publicstaticvoidmain(String[]args)

Hersonpl=newHerson("lom");

Personp2=newPerson("John",20);

Personp3=newPerson("Bob",22,',male");

System.out.println(p1.name+p1.age+p1.sex);

System.out.println(+p2.age+p2.sex);

System.out.println(+p3.age+p3.sex);

}

}

嬴对象的销毁

>Java的垃圾回收机制自动判断对象是否在使用,

并能够自动销毁不再使用的对象,收回对象所

占的资源。

>程序中也可以使用析构方法巾nalize()随时销毁

一个对象,将资源还给系统。

对象的销毁

Java

finalize方法的说明方式如下:

protectedvoidfinalize()throwsThrowable

{…}

■finalize方法,没有参数,也不返回值。

■一个类只能有一个finalize()。

protectedvoidfinalize()、

{

System,out.printin(uhavebeencolldc/ed’?)

急2.4.1类的封装

□封装(encapsulation):类的设计者把类设计

成一个黑匣子,使用者只能看见类中定义的公

共方法,而看不见方法的实现细节,也不能直

接对类中的数据进行操作。

□封装的目的

>隐藏类的实现细节;

>迫使用户通过接口去访问数据;

>增强代码的可维护性。

如何封装

Java

1.访问权限

2.设置类的访问权限

3.设置类成员的访问权限

Java包

口包(package)是Java提供的一种区别类名字

空间的机制,是类的组织方式。

口包对应一个文件夹,包中可以再有包,

称为包等级。

口同一个包中的类名不可以重复,不同包中的类

名可以相同。

口有助于避免命名冲突。

彘包

口Java中预定义了许多包,常用的有:

java.lang语言包,提供Object、String等基础类

java.util实用包,提供日期类等实用类

java.awt抽象窗口工具包

java,text文本包

java.io输入输出流的文件包

java.appletApplet应用程序包

网络功能包

J哥创建包

语法格式如下:

package[包名1[.包名2[.[…皿

注意:在Java程序中,package语句必须

是程序的第一条非空格、非注释语句。

赢创建包举例

packagemypackage.personmanage;----------------------------------------►声明包

publicclassPerson

{

publicStringname;

publicintage;

publicvoidgetlnfo()

(

System.out.println(name);

packagemypackage.personmanage;

这条语句指定这个包中的文件存储在目录

pa%力/mypackage/personmanage下。

包层次的根目录加曲是由环境变量CLASSPATH来确定的。

Java导入包

1、使用import语句

import应名.标识符;

import包名.*;

importjava.util.Date;

importjava,utiI.*;

Dateday=newDate();

2、直接使用包

java.util.Dateday=newjava.util.Date();

mypackage.personmanage.Personp=new

mypackage.personmanage.Person();

彘导入包举例

packageyourpackage;

〔importmypackage.Person;_____

classStudentextendsPerson{

Stringschool;

publicvoidstudy(){

System.out.println("Studding");

}

publicstaticvoidmain(String[]args){导入包

Students=newStudent();

="John";

s.age=19;

s.school二"华北电力大学”;

s.getlnfo();

s.study();}}

已访问权限

权限修饰符允许的访问级别

权限修饰符同一类同一包不同包的子类所有类

公有的(public)

保护的(protected),

默认的(friendly)/

私有的(private)

■逑设置类的访问权限

IJava

可以用public将类设置为公有的。

>公有类可以被其他类所访问和引用。

»在一个源程序中,public类只能有一个。

□可以不用权限修饰符。(包访问性)

»只能被同一个包中的类访问和引用。

□不允许使用public以外的权限修饰符。

publicclassDatel〃公有的类

classDatel〃非公有的类

privateclassDate^^

.设置类中成员的访问权限

□类中的成员,包括publicclassDatel

<

intyear,month,day;

工成员变量

voidsetdate(intyzintm,intd)

(

工成员方法year=y;

month=m;

□声明类中的成员时,day=d;

)

可以用权限修饰符来}

限制其他类的对象访privateintyear,month,day;

问该成员。publicvoidsetdate()

Java设置类中成员的访问权限

Lpublic

工protected保护的,说明该类成员能

4无(friendly为■默认的,说明该类成员能

被同一类中的其他成员、

工privat

私有的,该类成员只能被

同一类中的其他成员访问。

publicprivate

只有该类可以访

所有类均可访问

protected默认

该类及其子类的

成员可以访问,相同包中的类可

同一个包中的类以访问

也可访问

publicclassDate3

{privateintyear,month,day;

publicDate3(inty,intm,intd)

{year=y;

month=(((m>=1)&(m<=12))?m:1);

day=(((d>=1)&(d<=31))?d:1);

}

)

classDate3_ex

{publicstaticvoidmain(Stringargs[])

{Date3a=newDate3(2006,3,10);

System.out.println(a.year);

publicclassDate3

{privateintyear,month,day;〃成员变量,私有的

publicDate3(inty?intm,intd)

{year=y;month=(((m>=l)&(m<=12))?m:1);

day=(((d>=l)&(d<=31))?d:1);

)

publicbooleanisleapyear()

{return(year%400==0)|(year%100!=0)&(year%4==0);}

publicintgetyear(){returnyear;}

)

classDate3_ex

{publicstaticvoidmain(Stringargs[])

{Date3a=newDate3(2010.3.10);

System.out.println(a.getyear()卜”isaleapyear,n+a.isleapyear());

=实例成员与类成员

Java

■属于类的变量和方法----static

Astatic用在变量或方法前,表明它们是属于类的,

称为类方法(静态方法)或类变量(静态变量)。

A若无static修饰,则是实例方法和实例变量。

漏实例成员与类成员

A实例变量:每次创建对象时,系统都创建实例变

量的拷贝。每一个对象都有一个实例变量。

A类变量:运行时,只为该类的第一个对象分配内存

单元,其后创建的所有对象都共享这一类变量。

&

一classUser

(

staticintcount=0;

类voidlogin()

{count++;

System.out.println("你是第"+count+”位访问者)

}

)

classCount

(

应publicstaticvoidmain(Stringargs[])

(

用Useru1=newUser();

u1.login();

Useru2=newUser();

u2.login();

}

}

嬴实例成员与类成员

■实例方法

A即可以访问类变量,也可以访问实例变量。

A实例方法只能通过对象来调用。

■类方法

A只能使用其内部定义的局部变量或类变量。

A即可以通过对象来调用,也可以通过类名来调用。

»目的:使方法独立于类的实例,使用类去访问。

口实例变量允许超前引用类变量

口实例变量不能超前引用实例变量,静

态变量不能超前引用静态变量

口实例方法中允许超前引用实例变量和

类变量

口类方法中只允许访问类变量,但允许

超前引用

例:实例成员与类成员

publicclassDate4

{privateintyear,mon^h;classDate4_ex

staticintcount={publicstaticvoidmain(S*in^^rgs[])

publicDate4(inty,intm,intd){Date4a=newDate4(2011,);

{year=y;a.print_count();a.print();

month=m;Date4b=newDate4(2011,5,1);

day=d;b.print_count();b.print();

count++;a.finalize();Date4.print_count();

publicstaticvoidprint_count())

{System.out.print("count*'+count+,,,,);}

publicvoidprint()

{System.out.println(ndateisn+year+,-,+month+,-,+day);}

publicvoidfinalizeQ{count—;count=ldateis2011-3-1

count=2dateis2011-5-1

count=l

彘类方法的应用

publicclasslsPrime{

publicstaticbooleanprime(intx)

(

for(intk=2;k<=Math.sqrt(x);k++)

{

if(x%k==0)

returnfalse;

}

returntrue;

})

ClassTestlsPrime{

publicstaticvoidmain(Stringargs[])

{

for(intm=10;m<=100;m++)

{

if(IsPrime.prime(m))

System.out.println(m+“是素数。

}

)

}

三类变量——静态初始化程序

Java

口通过执行一段程序来对类变量进行初始化。

口格式:

static{

)

彘实例成员与类成员

实例变量与类变量

privateintyear,month,day;〃实例变量,私有的

staticintcount=0;〃类变量

实例方法与类方法

publicstaticvoidprint_count()〃类方法,只能访问类变量

publicvoidprint()〃实例方法

a

Java

classStaticError

{,

Stringmystring="hello”;

publicstaticvoidmain(Stringargs[])

(

System.out.println(mystring);

编译时错误信息:non-staticvariablemystringcannotbe

referencedfromastaticcontextSystem.out.println(mystring);95o

为什么不正确:只有实例方法可以访问实例变量。

Java解决的办法

1.[寻变量改成类变量

classStaticError

<

staticStringmystring=uhelIo59;

publicstaticvoidmain(Stringargs[])

<

System.out.println(mystring);

}

}

lava

2.先创建一个类的实例

classNoStaticError

<

Stringmystring="hello”;

publicstaticvoidmain(Stringargs[])

<

NoStaticErrornoError;

noError=newNoStaticErrorQ;

System.out.println(noError.mystring);

}

}

彘名法承(inheritance)

口类继承是指一个类可以继承其他类的非

私有成员,实现代码复用。

口被继承的类称为父类,继承父类后产生

的类称为子类。

彘继承的优点

java

嬴Java中继承的特点

object类

Java

口Java中的类都是Object的子类。

口Object类定义了所有对象都必须具有的基本状态

和行为,例如,等待条件变量、转化为字符串、

通知其他对象条件变量已改变等。

□Java中的每个类都从Object类继承了变量和方

法,因而Java的所有对象都具有Object对象的

基本状态和行为。

object类

Java

□publicfinalClassgetClass()

获取当前对象所属的类信息,返回Class对象。

□publicStringtoString()

返回当前对象本身的有关信息,按字符串对象返回。

□publicbooleanequals(Objectobj)

比较两个对象是否是同一对象,是则返回true。

□protectedObjectclone()

生成当前对象的一个拷贝,并返回这个复制对象。

□protectedvoidfinalize()throwsThrowable

定义回收当前对象时所需完成的资源释放工作。

Java

■何时选择继承?

一个很好的经验:“B是一个A吗?”

如果是,则让B做A的子类。

常犯的错误A有一个B吗?例如让汽

车轮子成为汽车的子类是错误的

嬴继承的实现

classSubClassextendsSuperClass

□如缺省extends子句,则该类为java.Iang.Object的子类。

□可以继承访问权限为public、protected>frendly的成员

变量和方法;

□不能继承访问权限为private的成员变量和方法。

□构造方法不能继承。

Java例:子类继承超类的成员变量

publicclassPersonclassStudent

{Stringname,sex;

Stringname,sex;intage;

intage;

Stringdept;

)

classStudentextendsPerson

Stringdept;

<

publicclassPerson

.

{protectedStringname;protectedintage;

子•

Person(Stringnl,intal){name=nl;age=al;}

n

类n

publicvoidprint(){System.out.println(name+

+age);}

继5

承)

超classStudentextendsPerson

类{protectedStringdept;

的Student(Stringnl,intal,Stringdl)

成{name=nl;age=al;dept=dl;}

员publicstaticvoidmain(Stringargs[])

方{Personpl=newPerson,李广

法pl.print();

S

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论