Java的对象类方法和接口.docx
- 文档编号:30625894
- 上传时间:2023-08-18
- 格式:DOCX
- 页数:15
- 大小:25.08KB
Java的对象类方法和接口.docx
《Java的对象类方法和接口.docx》由会员分享,可在线阅读,更多相关《Java的对象类方法和接口.docx(15页珍藏版)》请在冰豆网上搜索。
Java的对象类方法和接口
1.1什么叫对象?
什么叫方法?
什么叫面向对象的程序设计?
面向过程的程序设计语言最重要的特点是按照解决问题的一个一个步骤来设计程序。
这种语言是与解决相对比较简单的问题,当程序规模较大时,将显得纷繁复杂。
“对象”原来是描述自然界时使用的一个词语。
比如,现在我正在写讲义,桌上的稿纸、手中的笔、案头的参考书、身后的电脑以及窗外的鸟都可以成为对象
面向对象,就是将世界看成由许多彼此之间能联络的对象组成。
不少程序设计语言借用了对象这个词语作为一个专用名词,此时,对象也是具有状态和行为两个特征。
在程序设计中,对象的状态时相对处于静态的,用变量来描述和表达;而对象的行为时动态的,他们通过“方法”来实现和完成,所以方法一定是实现对象行为的语句块。
从功能上讲,方法和子程序、函数很相似。
变量和方法是彼此有关、相互依赖的。
当然,计算机都是用数据来表示对象的状态的,也是通过对数据的操作和修改来体现某个方法的功能的。
1.2Java作为面向对象的程序设计语言有什么特点?
Java是面向对象的程序设计语言,从面向对象这个角度看,体现了如下三个特点:
a:
封装性—面向对象的程序设计语言都是把数据和处理数据的操作结合在一起而构成一个整体,这就是对象。
对象的使用者只能看到对象的外部特性,比如,其主要功能、如何调用等,而看不到内部如何实现这些功能。
作为面向对象的程序设计语言,程序中的数据就是变量,程序对数据作处理则成为方法。
变量和方法都被封装在对象中。
所以,一个对象就是变量和方法的集合,其中变量表明这个对象的状态,方法实现这个对象所具有的行为,而且在程序中将这些变量和方法进行封装,使它们成为一个模块,再用一个名字来代表这个模块。
这样,以后得更高层的程序设计中,就不必关心某个对象的行为到底是怎样实现的。
可见,将对象封装就是为了使模块尽可能少地展现其内部细节,而只是以一种界面来面向外部。
对象的封装性减少了程序各部分之间的依赖,使程序的复杂性降低,而可靠性提高,并便于修改。
b:
继承性—面向对象的程序设计中,对象是从类创建出来的,这一点即将在下面的解答中说明。
在Java中,许多类组成层次化结构。
一个类的上一层成为父类,而下一层成为子类。
一个类可以继承其父类的变量和方法,而且这种集成具有传递性。
就是说,一个类可以继承其上一层和其再上一层的变量和方法。
这种可传递的继承性使得下层多个相似的对象可以共享上层类的数据和程序代码,而子类又可以再继承父类的基础上增添新的内容和功能。
这种代码共享和代码可增添的继承特性使Java既灵活又方便提高效率。
c:
通信相关性—一个对象往往涉及多个行为。
体现在程序设计中,一个对象往往包含多个方法,每一个方法对应一个行为。
所以,一个对象完成某个动作也就是程序执行相应的方法。
于是,就涉及对象之间通过交互来实现复杂的行为,这叫对象之间的通信。
利用通信可以实现一个对象往另一个对象的信息传递。
信息传递设计三个要素:
一是信息接收对象;二是接收对象中用哪个方法完成指定的动作;三是比方法需要的参数。
由于信息传递的要素非常清晰,所以用在变成中将很方便。
这种通信相关性使得许多复杂功能得以实现,却有能避免编程的错综复杂。
2.1什么叫释放对象?
Java中怎么释放对象?
所谓释放对象,实质上就死后释放掉分配给对象的内存空间。
Java中,对象的释放是自动完成的,不需要程序员在编程时关注这一点。
Java运行系统具有所谓“垃圾收集”机制,这种机制会周期性地检测对象是否还在使用,如发现有长期不用的对象,则给予释放,回收分配给这些对象的内存,这就是垃圾收集。
具体运行中,垃圾收集是由一个成为Java垃圾收集器的程序实现的。
当一个对象在使用时,Java运行系统会将其对象的内存空间设置标记;而当一个对象结束使用时,会自动清除标记。
有了这种标记设置和清除的规则,Java垃圾收集器就可以通过周期性地扫描所有Java对象有关的内存区域标记,将没有标记的内存区列入可供分配的范畴,从而起到垃圾收集作用。
因为垃圾收集器涉及读/写操作,相对较慢,所以,尽管扫描过程是周期性进行的,但垃圾收集操作却以较低优先级留待系统空闲周期中才得以完成。
除了自动收集垃圾外,Java运行系统也允许程序员通过调用方法system.gc()请求垃圾收集。
此外,Java系统开始运行时,会自动调用一个名为finalize()的方法,此方法的功能之一也是释放对象所占的内存。
3.1类的结构和属性
在Java程序中,类是基本的组成要素,所有对象都是由类创建的,新的类必须在已有类的基础上构造,这成为类的派生。
大多数类都是派生得到的。
派生得到的新类成为已有类的子类,而次已有类成为父类。
3.2类是怎样一种结构?
什么叫类的成员变量?
类的结构分为两部分,一是类的说明,二是类体。
格式如下:
classDeclaration{classBody}
a:
类的说明—类的说明由关键字class、类的名字和类的属性三部分组成。
关键字class用固定的小写格式,类的名字是由程序员起的,可以用任意一个名词,但书写格式必须符合Java编码规定,这两部分是类的说明中必须有的内容。
类的属性石可选的,用来说明此类有关的各种特性,包括说明这个类的父类是哪一个,访问这个类有什么限制等。
b:
类体—类体是类的主题内容,它包括两部分:
变量说明和方法。
在前面已经讲到,在Java的类中,变量表明类的状态,方法实现类的行为,正是这两部分内容构成了类体。
习惯上将类中的变量成为类的成员变量。
成员变量的类型可以为Java的任意数据类型。
在一个类中,成员变量的名字是唯一的,但成员变量的名字可以和方法的名字相同。
所以,将刚才列出的类的格式再具体化一些,那就应该如下所示:
classclassName{
memberVariableDeclarations//变量说明
methodDeclarations//方法说明
}
在比较复杂的程序中,方法往往是由许多成分构成的方法体。
方法体中包含此方法要用的变量(称为局部变量),还包含多个语句构成的语句组。
在类体中,通常首先列出成员变量,然后是方法,但这不是严格规定的。
必须严格遵守的规则是:
类的成员变量定义必须放在类体中,但又不能包含在某个方法中。
3.3类的属性包含哪三方面的内容?
举例说明怎样表示这些内容?
并作综合。
类的属性用来说明三方面的内容,即:
a.指出此类的父类(extends部分)--大多数类都是从父类派生得到的,父类也被称为超类(SuperClass)。
在类的属性中,用关键字extends和父类名构成一个语素来说明这一点。
这个语素一般放在类名字和类体之间,即采用如下格式:
extendsSuperClass比如:
classImaginaryNumberextendsNumber{...}
有许多类是从Java系统提供的软件包java.lang中的Object类派生来的,这样派生的类一般不再在属性中指出父类的名字。
我们一般称这些类的父类为隐含的,实际上,其父类就是Object。
Object是Java中最原始的类。
可见,extends部分是可选的;
b.指出此类提供的借口(implements部分)--接口是和类很相似的一种数据结构,接口专门供给类调用。
如果一个类要调用。
这里,我们要说明的是,如果一个类要调用接口,格式如下:
implementsInterfaceList其中,implements是专门用来调用接口的关键字,而InterfaceList是接口的名字。
比如,有一个名为Collection的接口被雷ImaginaryNumber调用,那么,类ImaginaryNumber的属性中就可以看到有Implements部分:
classImaginaryNumberextendsNumberImplementsCollection{...}
通常,Implements部分放在extends部分后面,但Implements部分也是可选的,并非每个类的属性中都有这部分内容;
c.指出类的特性(修饰部分)--大多数类都可以再派生出子类,但是出于安全性的考虑,Java规定有些类不能再派生出子类。
这样,就有了一种特别的类叫最终类。
在类的属性中用关键字final来说明这种属性。
Final放在类属性的前面。
比如finalclassImaginaryNumberextendsNumberImplementsCollection{...}在这个类定义中,前面用final指出类ImaginaryNumber是一个最终类。
还有一些类不能创造出对象来,它们仅仅是为了让子类来继承而设计的,这些类称为抽象类。
这也是一种特殊的类,在类的属性中用关键字abstract来说明这种特性。
Abstract也要放在属性的前面。
比如:
abstractclassImaginaryNumberextendsNumberImplementsCollection{...}
可以想到,抽象类不可能是最终类;反过来,最终类也不可能是抽象类,它们的特性正好相反,所以,abstract不会和final同时出现。
我们已经知道,由类创建出对象,而多个类组成包,同一个包中的类可以互相访问。
但是有一种类,它们不但可以被同一个包中的类访问,还可以被包以外的其它类或对象访问,这些类被称为公共类。
在类说明中用public来说明公告类特性,public放在类属性的最前面。
与public相对应,还有一些类只能被同一个包中的其它类访问,这种类用private来说明特性。
实际上,public和private表明了类的一种访问权限。
综上所述,一个类的说明应该是按如下形式:
【modifiers】classClassName【extendsSuperClassName】【ImplementsInterfaceList】{...}(方括号可选)
在这些成分中,只有关键字class和类名字是必须得,其它均为可选成分。
如果没有某个可选成分,在编译时,Java编译器将赋予此类以相应的默认成分。
比如:
非公共类、非专用类、非最终类、非抽象类,不调用任何接口,父类为Object等。
4.1类的成员变量定义时包含哪几部分内容?
类的成员变量必须放在类体中,但不能包含在某一个方法体内,最简单的成员变量表示如下:
typevariableName(变量类型变量名)
实际编程中,类的成员变量在定义时往往还包含它的属性,属性指下列三方面内容:
a—变量的访问权限:
表示满足什么条件此变量可以被访问。
访问权限用关键字publicprivateprotected活privateprotected。
b—是否为静态变量:
如为静态变量,则将被从此类创建的所有对象共享。
就是说,可以有许多对象对一个静态变量进行不同操作。
静态变量用关键字static表示。
c—是否为常量:
Java往往将常量也统称为变量,常量在程序中试不能被改变的,如果企图改变,则编译时会产生出错误指示。
如果一个变量其实是常量,则用final表示。
综合起来成员变量表示如下:
【variableModifier】typevariableName。
5.1方法是怎样一种结构?
在形式上,方法的结构和类的结构相似。
方法也有两部分组成,一时方法说明,二是方法体。
其格式如下所示:
methodDeclaration{methodBody}
a--方法说明:
方法说明(methodDeclaration)指出方法类型、方法名、访问权限和入口参数。
所谓方法类型,其实是指此方法执行以后得返回值类型。
返回值可以使Java允许的任何一种数据类型,包括简单类型和数组这样的复杂类型。
如果某个方法没有返回值,则称此方法的返回值void类型。
方法名可以使符合Java编码规定的任何标识符。
方法的访问权限从含义上和类的成员变量的访问权限类似。
访问权限规定了此方法可以被什么样的对象调用。
方法的入口参数是由调用这个方法的对象提供的。
但是,一个方法的入口参数个数和类型都在方法说明中做了规定,方法被调用时,必须符合这些规定。
正是因为每个方法常常有不同的入口参数个数和类型,所以,Java允许具有不同入口参数类型或个数的几个方法用同一个名字。
由于入口参数不同,编译器因此能区分它们。
b—方法体:
方法体是完成方法功能的语句块,通常将这语句块用大括号{}括起来。
其实,细分起来,方法体内部从形式上也可以分为两部分:
一部分是变量,另一部分是语句。
方法体内部定义的变量只供本方法使用,成为局部变量。
综上所述,一个方法的具体节后应如下所示:
【modifiers】typemethodName(para1,para2,...){methodBody}
5.2this和super在方法中有什么特殊作用?
它们用在什么情况下?
this和super是Java的两个关键字,它们用在方法体中作为两个特殊的变量前缀和方法前缀。
This用来指明当前对象的成员变量或方法,以区分于同名的局部变量和其他同名的方法,而super则用于指出父类的变量和方法。
this的使用场合--一个对象中的方法一般可以直接访问通一个对象的成员变量。
但是,有时候方法体内部定义的变量和成员变量名字相同,还有时方法的入口参数和对象的成员变量名字相同,那么就需要将第三者区别清楚。
因此,专门用this来指明当前对象的成员变量或当前对象的方法。
比如:
classThreeColor{
inth,s,b;
ThreeColor(inth,ints,intb){
this.h=h;/*其中,右边的h为方法的入口参数,this.h为成员变量,这个语句使方法的入口参数值赋于成员变量。
*/
}
}
Super的使用场合—在Java中,由父类派生子类,这样,子类的成员变量可能和父类的成员变量名字相同,子类的方法也可能和父类的方法一样。
当需要调用父类的同名方法或使用父类的同名变量时,在子类中,可用关键字super作前缀来指明父类成员变量和方法。
比如:
classSuperCa{
intx;
SuperCa(){
X=5;
System.out.println(“SuperCax=”+x);
}
VoiddoCa(){
System.out.println(“SuperCa.doCa()”);
}
}
CalssSubCaextendsSuperCa{
Intx;
SubCa(){
super();
x=8;
System.out.println(“SubCax=”+x);
}
VoiddoCa(){
super.doCa();
System.out.println(“insubCa.doCa()”);
System.out.println(“super.x=”+super.x);
}
}
上述例子中,在两种情况下用了super。
一是子类调用父类的构造方法,用了super()语句;二是子类SubCa调用父类的方法doCa()时,用了super.doCa()语句。
6.1两个特殊的构造方法(构造方法和main()),构造方法的功能是什么?
有什么特性?
在每个类中,都有一种特殊的方法,成为构造方法,构造方法的功能是对从这个类新创建的对象分配内存空间和进行初始化。
每次创建对象时,系统便自动调用相应类的构造方法。
构造方法的特殊之处还在于它不能独立的方法名字,而且只能有入口参数,而没有返回值。
但实际上,构造方法仍然是有名字的,构造方法的名字叫init,这是由编译器隐含提供的,但此名不允许程序员使用。
所以,通常总是将类的名字作为构造方法的名字。
当从一个类创建某个对象时,要用关键字new来建立对象,即为新建的对象分配内存。
New语句的功能实际上就是调用类中的一个构造方法。
其实,在一个类中常常有多个构造方法,通过不同的入口参数互相区分。
这多个构造方法往往可以创建多个不同的对象。
这些构造方法中,一般有一个构造方法是不带入口参数的,它称为默认的构造方法。
比如:
publicRectangle();//默认的构造方法
publicRectangle(intvalue,intvalue);//带两个整型入口参数的构造方法
publicRectangle(intvalue,intvalue,intvalue)//带三个整型入口参数的构造方法
6.2main方法由什么特点?
Main方法也是一个特殊的方法。
在Java的每个应用程序(Application)中,都必须有main方法。
也正是main方法的有无,区分了能独立运行的应用程序和不能独立运行的Applet程序。
Applet中一定没有main方法,而应用程序中一定包含main方法。
Java解释器运行字节码文件时,首先寻找mian方法,然后一次为程序的入口点开始运行。
如果一个应用程序不含main方法,那么,Java解释器会拒绝解释和执行这个程序。
而Applet中由于没有main方法,所以只能用带Java功能的浏览器或另一个成为Java观察器的appletviewer来运行。
实际上,在main方法中,可以有许多语句,通过语句可以创建对象,也可以调用其他对象中的方法。
当main方法结束时,程序也运行结束。
Main方法的结束可以是语句块的结束,这是常用的办法,但也可以采用System.exit语句调用系统类的exit方法退出。
在Java程序中,一般只含有一个main方法。
如果一个程序含有多个main方法,那么,解释器执行程序时,只有程序最前面的第一个类所包含的main方法作为程序运行的入口点,其余类中的main方法就仅仅作为一般的方法,因而这些main方法失去了其特殊性。
为了程序的可读性好,我们提倡一个程序中只用一个main方法。
main方法的参数和其他方法的参数也不同。
main方法没有返回参数,而它的入口参数就是应用程序运行时在命令行给出的参数。
7.1什么叫多重继承?
Java不采用类的多重继承而用单一继承机制有什么优点?
Java不带用C++语言中的多重继承机制,这位编程带来方便。
多重继承是指一个雷可以使多个父类的子类,这使类的层次关系变得很复杂;而且,如果几个父类含有相同的成员变量或相同的方法,那就回给子类的变量和方法的继承及调用带来混乱,Java采用单一继承机制,就能很清楚地表明类的层次关系,从而避免了混乱。
7.2什么叫变量隐藏?
什么叫方法置换?
举例说明方法置换的原理?
在子类对父类的继承中,如果子类的成员变量和父类的成员变量同名,此时成为子类隐藏(override)了父类的成员变量。
这种情况下,子类使用的变量是它自己的变量,而不是父类的同名变量。
于是,父类的成员变量不能被子类简单继承,如果子类要调用父类的变量,则必须借助super关键字。
还有一种情况是子类的方法名和父类的方法名相同,并且返回值的类型和入口参数的数目、类型均相同,那么在子类中,从父类继承的方法就会被置换掉。
比如:
classBird{
protectedintx;
protectedinty;
protectedBrid(intx,inty){//Peace的构造方法
this.x=x;
this.y=y;
}
publicvoiddraw(){...}
}
classPeaceextendsBird{
privateintw;
privateinth;
publicPeace(intx,inty,intw,inth){
super(x,y);
this.w=w;
this.h=h;
}
publicvoiddraw(){//peace类的draw()方法
System.out.println(“Peace:
”+x+”,”+y+”,”+w+”,”+h);
}
}
ClassSparrowextendsBird{
privateintr;
publicSparrow(intx,inty,intr){//Sparrow的构造方法
super(x,y);
this.r=r;
}
publicvoiddraw(){//Sparrow类的draw()方法
System.out.println(“Saprrow:
”+x+”,”+y+”,”+r);
}
}
publicclassdraw(){
publicstaticvoidmain(Stringargs[]){
BirdS1=newPeace(1,2,100,200);//创建对象S1
BirdS2=newSparrow(10,20,100);//创建对象S2
S1.draw();//调用Peace的draw()方法
S2.draw();//调用Sparrow的draw()方法
}
}
从上述例子中,从类Bird派生出两个子类Peace和Sparrow。
这三个类中,都包含一个名为draw()的方法,而且这三个方法的入口参数要求均相同,返回值要求也想透。
在34行开始的必然的BirdProgram程序中,有一个main方法,36和37行的语句则分别定义了两个对象S1和S2,它们分别是从类Peace和雷Sparrow创建的。
所以,S1.draw()语句对象S1调用了类Peace中的draw()方法,而S2.draw()语句使对象S2能够调用类Sparrow中的draw()方法,这楼里,调用的都不是父类中同名的draw()方法,由此体现出父类被子类继承后,它的方法被子类的同名方法只换了。
只有子类和父类有同名、同返回值和同入口参数的方法时,才存在子类对父类的方法置换关系。
但有时程序设计中仍然想使用父类中的那个有置换者的方法,此时,可借助关键字super来实现。
7.3什么是抽象类?
什么是抽象方法?
它们有什么特点和用处?
抽象类是一种特殊的类。
从这种类不能创建对象,而只能由其派生子类所以,抽象类是专门用来作为其他类的父类的。
在抽象类中优势还包含抽象方法。
所谓抽象方法,是指只给出定义,但不包含实现语句的方法。
这种抽象方法的实现必须由子类来完成。
比如在java.lang包中,有一个名为Number的类,它是一个代表程序中所有数字的抽象类。
如果由此来创建某个数字对象,那将没有什么现实意义。
但是,它可以作为Array类、Int类等代表具体的特定的数据类的父类。
抽象类的定义格式中包含关键字abstract。
比如abstractclassBird{inti=1;}
在抽象方法的定义中也用关键字abstract,但是abstract在方法中使用时由如下限制:
1—构造方法不能冠以abstract;
2—凡是定义为static或private型的方法不能再加abstract;
3—如果父类中已有同名的abstract方法,那么,子类中就不能再由同名的抽象方法。
另外,还有一点要指出,抽象类中不一定有抽象方法,但包含抽象方法的类必须为抽象类。
8.1Java的接口有什么特点?
引入接口的定义带来什么优点?
Java中,接口是和类相似的一种机制。
不过,从结构上,接口有如下特点:
1—接口中关键字interface来定义,而不是用class;
2—接口中定义的变量全是最终的静态变量;
3—接口中没有自身的构造方法,而且定义的其它方法全是时抽象方法,即只提供方法的定义,而没有提供方法的实现语句。
4—接口采用多重继承机制,而不是采用类的单
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 对象 方法 接口
![提示](https://static.bdocx.com/images/bang_tan.gif)