第3章 Java面向对象程序设计.docx
- 文档编号:10490871
- 上传时间:2023-02-13
- 格式:DOCX
- 页数:74
- 大小:386.61KB
第3章 Java面向对象程序设计.docx
《第3章 Java面向对象程序设计.docx》由会员分享,可在线阅读,更多相关《第3章 Java面向对象程序设计.docx(74页珍藏版)》请在冰豆网上搜索。
第3章Java面向对象程序设计
Java应用教程
第3章Java面向对象程序设计
第3章Java面向对象程序设计
3.1面向对象程序设计
3.2类和对象
3.3包
3.4继承
3.5多态
3.6特殊类
3.7接口
3.1面向对象程序设计
面向对象程序设计是力图使计算机语言对事务的描述与现实世界中该事务的本来面目尽可能一致.
类(class)和对象(object)是面向对象方法的核心概念.
类是对一类事务的描述,是抽象的,概念上的定义;对象是实际存在的该类事物的每个个体,因而也称为实例(instance).类是用来创建对象的模板,它包含被创建对象的属性和方法的定义。
类封装了一类对象的状态属性和方法是类对象原型,是一种抽象和复杂的数据类型.如:
integer是一个整数类,它描述了所有整数的性质.1,2等具体整数都是integer类的具体对象,都具备算术运算和大小的处理能力.
创建一个新类,就是创建了一种新的数据类型,实例化一个类,就创建了一个对象.
所以可把类理解为一种新的数据类型,一旦声明后,就可以用它来创建对象(实例).类是对象的模版,对象是类的实例,所以要使用对象,就必须先定义类.类包括了数据和代码两部分.数据是类中的实例变量,代码是类中的方法,两者都称为类的成员.
对象是一些相关的变量和方法的软件集.对象是模仿现实世界中的一些实体,如汽车有自己的状态属性(大车,小轿车,货车,颜色等)和行为(刹车,加减速度,换挡等),软件对象用多个变量来描述它的状态属性,用它的方法来执行它的行为.方法是跟对象有关联的函数.
3.2类和对象
Java语言与其它面向对象语言一样,引入了类和对象的概念,类是用来创建对象的模板,它包含被创建对象的属性和方法的定义。
因此,要学习Java编程就必须学会怎样去编写类,即怎样用Java的语法去描述一类事物共有的属性和行为。
对象的属性通过变量来刻画,而对象的行为通过方法来体现。
方法可以操作属性形成一定的算法来实现一个具体的功能。
类把属性和方法封装成一个整体。
3.1类的创建
类是组成Java程序的基本要素,也是Java中重要的引用数据类型.类封装了一类对象的状态属性和行为方法,是类对象的原型.创建一个新类,就是创建一种新的数据类型,即引用数据类型.。
一个Java类主要包括以下两部分:
▪类的声明
▪类体
3.1.1类的声明
语法格式:
[<修饰符>]class<类名>
[
[
{[<成员变量声明>]
[<构造函数声明>]
[<成员方法声明>]
}
[修饰符]用于指定类的访问权限,可选值为public、abstract和final说明类的属性。
public关键字声明的类可以在其它任何的类中使用;abstract关键字声明的类不能被实例化.final关键字声明的类不能被继承,即没有子类.final最终的,用于指定局部变量为常量。
.
Class是关键字用来定义类,类名必须是合法的Java标识符,并且首字母大写,但不是必须的。
extends是关键字,用来说明该类是SuperclassName类的子类,SuperclassName是该类的父类的名字(也称超类);
implements是关键字,用来声明本类要执行(实现)的一个或多个接口,interfaceNameList是本类所执行的接口的名字列表,以逗号分隔的.
两个大括号间的内容为类体.
如:
classPerson叫作类声明,Person是类名称,习惯类名第一个字母大写,但不是必须的.
{
…
…
}
3.1.2类体
类体跟在类声明的后面,它是嵌入在大括号{}间的.类体中定义该类中所有的变量和所支持的方法.如:
classPerson
{
intage;//成员变量
intgetAge(){//成员方法
returnage;
}
VoidsetAge(inti){//成员方法
age=i;
}
}
类中所定义的变量和方法都是类的成员.
3.1.3成员变量和局部变量
类的状态是由它的成员变量给出的,可以在类体中声明一个类的成员变量.在类体中,变量声明部分所声明的变量被称为类的成员变量(有全局变量的概念,在整个类中有效);在方法体中,声明的变量和方法中的参数被称为局部变量.
对类的成员变量来说,分为实例成员变量和类变量,如果用修饰符static声明的变量称为类变量(也称静态变量-本质上是全局属性),可以直接通过类名访问,类名.静态变量。
没有static声明的为实例成员变量用对象来访问.
成员变量的类型可以是Java中的任意数据类型,包括简单类型,类,接口和数组.成员变量在类的定义中声明,在类中成员变量的名字是唯一的,并且首字母小写,第二个单词首字母大写。
.在创建对象的同时创建有关的成员变量,成员变量创建后系统自动对其进行默认初始化或显示初始化.成员变量依附于对象(局部变量)的存在而存在,具有与对象相同的生存期和作用域.如:
publicclassPerson{
privateintage;//私有实例成员变量
publicStringname=“Lila”;//公有实例成员变量
}
对于一个成员变量,可以使用不同的限定符,以限定不同的访问权限.
private:
变量可以被类中的代码访问.
public:
适用所有类访问
friend:
变量可以被工程或组件中的代码访问.(友好的变量-default)
protected:
可以被继承的类访问.
static:
用来指定一个变量是静态变量(类变量),没有static修饰的变量是实例变量,类变量可以由类方法访问(反过来说类方法只能对类变量操作),也可以由实例方法访问(实例方法既能对类变量操作也能对实例变量进行操作).
final:
用来声明一个常量,通常常量用大写字母.
volatile:
用来声明一个由多线程共享的变量,使得各线程对该变量的访问能保持一致.
在方法或语句块内部定义的变量被称为局部变量,局部变量仅在它的方法内有效,局部变量须先声明和初始化.
局部变量声明语法格式:
DataTypevarName1[=value1][,varName2[=value2]…..]
局部变量声明和初始化
publicvoidamethod(){//成员方法
inti;//在成员方法中声明的变量为局部变量i但未初始化
intj=i+5;//声明局部变量但未初始化,出错.
Doubled=3.14;
MyDatem;
m=newMyDate(12,10,1967);
System.out.println(m.getyear());
局部变量的作用域就是它所在的方法或语句块,在程序调用方法时,局部变量才被创建并可用,随方法的退出,局部变量将被销毁.
例3-1Testvarible.java—定义和使用局部变量﹑关键字this
publicclassTestvarible{
privateinti=1;
publicvoidmethod1(){//method1()方法中局部变量i与成员变量i名字相同,成员变量i被隐藏
inti=4,j=5;
this.i=i+j;//要在该方法内使用成员变量i,必须使用关键字this
System.out.println(i);//输出局部变量i的值4
System.out.println(this.i);//输出成员变量i的值9
method2(7);
}
publicvoidmethod2(inti){//method2()
intj=8;
this.i=i+j;
System.out.println(i);//输出局部变量i的值7
System.out.println(this.i);//输出成员变量i的值15
}
publicstaticvoidmain(String[]args){
Testvariblet=newTestvarible();
t.method1();
//System.out.println(i+j);//是否可以?
//System.out.println(t.i);//是否可以?
}
}
执行结果:
3.1.4成员方法
Java中类的对象行为由类的成员方法来实现。
类的成员方法由方法声明和方法体两部分组成。
其一般格式如下:
[修饰符]<方法返回值的类型><方法名>([参数列表]){
[方法体]
}
[修饰符]用于指定方法的访问权限,可选值为public、protected和private。
方法返回值的类型用于指定该方法的返回值的类型,如果该方法没有返回值,必须使用关键字void进行标识。
方法返回值的类型可以是任何Java数据类型。
方法名用于指定成员方法的名称,方法名必须是合法的Java标识符。
[参数列表]用于指定方法中所需的参数。
当存在多个参数时,各参数之间应使用逗号分隔。
方法的参数可以是任何Java数据类型。
方法体是方法的实现部分,在方法体中可以完成指定的工作,可以只打印一句话,也可以省略方法体,使方法什么都不做。
需要注意的是:
当省略方法体时,其外面的大括号一定不能省略。
用修饰符static声明的方法称为类方法(静态方法),可以直接通过类名访问,类名.静态方法(参数列表…)。
否则称为实例方法,用对象来调用.
.
例3-2Testmethod.java–定义和使用方法
classTestmethod{
//定义实例成员变量doublex,y.
doublex,y;
//定义静态变量floatmark
staticfloatmark;
//定义实例成员方法,实例方法既能对类变量操作,也可以对实例变量操作,返回值类型float
floattotal(floata,floatb)
{
floattotal;
x=0.4;y=0.6;
total=(float)(x*a+y*b);
returntotal;//total=(0.4*67+0.6*98)=85.6返回给调用方mark
}
//定义静态方法(类方法)只能对静态变量(类变量)mark操作,不能对实例成员变量x,y操作.
staticvoidsetmark(floati)
{mark=i;}
//定义静态成员方法取的成绩
staticfloatgetmark()
{returnmark;}
//类的实例成员方法
publicvoiddisplay()
{System.out.println("Thetotalscore"+"="+mark);
}
publicstaticvoidmain(String[]args)//main方法
{
Testmethodtm=newTestmethod();//创建类的对象
mark=tm.total(67,98);//调用total(floata,floatb)方法并传递参数
tm.display();//调用display()方法打印成绩
tm.setmark(96);//调用静态方法
//Testmethod.setmark(98);//是否可以?
tm.display();
//System.out.println("Thetotalscore"+"="+Testmethod.mark);//是否可以?
}
}
执行结果:
3.1.4.1多态
多态是面向对象程序设计的重要部分,是面向对象的3个基本特性之一。
在Java语言中,通常使用方法的重载(Overloading)和覆盖(Overriding)或称为方法的重写实现类的多态性。
3.1.5方法的重载
方法重载(overloading)是指在一个类中,出现多个方法名相同,但它们在参数类型,个数和顺序上有所不同的方法,则称为方法的重载.Java在执行具有重载关系的方法时,将根据调用参数的个数和类型区分具体执行的是哪个方法,重载和方法的返回值无关,返回值可相同也可不相同。
(在编译时进行参数匹配选择)
【例3-3】Testoverload.java-方法的重载
classTestoverload
{
Stringname;
Stringsex;
voidstudent(){
name="wangfei";
System.out.println("name="+name);//输出学生姓名
}
//方法重载接受姓名参数
voidstudent(Stringstr){
name=str;
sex="male";
System.out.println("name="+name+"sex="+"male");//输出姓名和性别
}
//方法重载接受姓名和性别参数
voidstudent(Stringstr,Stringn){
name=str;
sex=n;
System.out.println("name="+name+"sex="+sex);//输出姓名和性别
}
//方法重载接受姓名和年龄参数
booleanstudent(Stringstr,inta)
{name=str;
intage=a;
System.out.println("name="+name+"age="+age);//输出姓名和年龄
returntrue;
}
publicstaticvoidmain(Stringargs[]){
Testoverloadd=newTestoverload();//创建Testoverload类的对象实例
//对象调用类的各成员实例方法并传递实参给接受的形参实现方法的重载
d.student();
d.student("Liyan");
d.student("Liyan","female");
d.student("Yanlan",22);
}
}
例子可看出4个方法有相同名student,但它们有不同的参数个数,不同的参数类型和不同的返回值.在调用方法时,可不带参数,或带一个参数﹑两个参数.编译器会根据参数列表数目及类型来决定调用哪个方法.
注意:
如果两个方法的参数类型和个数完全一样,只是返回类型不一样,则会出现编译错误,因为返回值的类型不能区分重载的方法。
执行结果:
3.1.6构造函数(方法)
构造函数(方法)用来对创建的对象的所有成员变量进行初始化的特殊的方法,在创建对象时立即被调用或系统自动调用,方法名同类名,并且没有返回值,也不需要使用关键字void进行标识,如:
publicclassApple{
publicApple(){//方法名同类名构造方法
}
}
构造函数特点
(1)构造函数的名称必须与它所在的类的名字完全相同.
(2)构造函数不返回任何数据类型,即它是void型,但不能写void.
(3)构造函数一般不能由编程人员显示地直接调用,必须通过运算符new调用或在创建对象时由系统自动调用.
构造函数是个初始化理想的存储单元,因为它必须在调用任何其它方法之前运行,而且对于每个对象,它只运行一次.当然,可以基于一个类创建出许多对象.
一个类可能包含一个或多个构造函数,它提供从类创建对象的初始化.如果在创建类时没有为类定义任何构造函数,系统会自动产生一个构造函数,称为默认构造函数.默认构造函数不带参数,并且方法体是空的.因此所有Java类都有构造函数,它用来对新的对象进行初始化.
声明构造函数的语法:
[
}
【例3-4】Useconstruct.java–使用构造函数
classMydata{//声明类Mydata
privateintday;//声明类的成员变量
privateintmonth;
privateintyear;
publicMydata(){//声明无参数构造函数,构造函数名称和它的类名完全相同
day=12;//初始化成员变量
month=12;
year=1986;
}
publicMydata(inty){//声明有参数构造函数
day=1;
month=05;
year=y;
}
publicMydata(intd,intm,inty){//声明有参数构造函数
day=d;
month=m;
year=y;
}
publicvoiddisplay(){
System.out.println(day+“-”+month+“-”+year);//输出成员变量值
}
publicstaticvoidmain(Stringargs[]){
Mydatam1=newMydata();//创建Mydata类的实例对象并实现构造方法的重载
Mydatam2=newMydata(2000);
Mydatam3=newMydata(1,01,2005);
m1.display();//对象调用display()方法输出成员变量值
m2.display();
m3.display();
}
}
执行结果:
Java支持对构造函数的重载,一个类就可以有多个构造函数,例程有四个构造函数,名字相同,但参数列表不同,构成方法重载.编译器会根据参数列表数目和类型区分这些构造函数,构造函数根据参数来初始化堆栈的大小.创建对象时,选择构造函数要看它的参数是否最好反映了想初始化的新对象.
注意:
构造函数不能有返回值,是因为返回值需要在调用时对一个变量进行赋值.构造函数是由系统自动调用的,不能对变量赋值,所以不能有返回值.
4.3.3对象的引用和实体
当用类创建一个对象时,类中的成员变量被分配内存空间,这些内存空间称为该对象的实体,而对象中存放着引用,以确保实体由该对象操作使用。
1.参数传值
当方法被调用时,方法中的参数必须要实例化,即参数变量必须要有具体的值。
在Java中所有的参数都是传值的,也就是说,方法中参变量的值是调用方指定的值的副本。
方法如果改变参数的值,但不会影响参数传值的变量的值。
2.基本数据类型参数的传值可传入较高数据类型,如不可向int型传一个float值,但可以向double型参数传递一个float值。
3.引用数据类型参数的传值-传递的是变量的引用而不是变量所引用的实体。
如果改变参数变量所引用的实体,就会导致原变量的实体发生同样的变化,因为两个同类型的的引用型变量有相同引用时,就会有同样的实体。
但是改变参数的引用不会影响向其传值的变量的引用。
【例4.5】Example4_5.java-参数传值
classPeople
{intmoney;
voidsetMoney(intn)
{money=n;//8888
}
}
classA
{voidf(doubley,Peoplep)//传入值0.8,对象zhang
{
y=y+1;
p.setMoney(100);//调用setMoney方法传入值100
System.out.println("参数y的值分别是:
"+y);//1.8
System.out.println("参数对象p的money是:
"+p.money);//100
}
}
publicclassExample4_5
{publicstaticvoidmain(Stringargs[])
{
doubley=0.8;//局部变量
Peoplezhang=newPeople();
zhang.setMoney(8888);
Aa=newA();
System.out.println("在方法f被调用之前对象zhang的money是:
"+zhang.money+"y的值是:
"+y);
a.f(y,zhang);
System.out.println("在方法f被调用之后main方法中y的值仍然是:
"+y);//方法改变参数的值,但不会影响参数传值的变量的值,值传递。
System.out.println("在方法f被调用之后main方法中对象zhang的money是:
"+zhang.money);//100引用传递
}
}
【例4.6】Example4_6.java–圆锥对象
class圆
{double半径;
圆(doubler)//构造函数
{半径=r;
}
double计算面积()
{return3.14*半径*半径;
}
void修改半径(double新半径)
{半径=新半径;
}
double获取半径()
{return半径;
}
}
class圆锥
{圆底圆;
double高;
圆锥(圆circle,doubleh)//构造函数
{this.底圆=circle;//将底圆成员变量设为圆对象(引用传递)
this.高=h;
}
double计算圆锥体积()
{doublevolume;
volume=底圆.计算面积()*高/3.0;//圆对象调用圆类.计算面积()的成员方法取的圆面积求出圆锥体积
returnvolume;
}
void修改底圆半径(doubler)
{底圆.修改半径(r);
}
double获取底圆半径()
{return底圆.获取半径();
}
}
classExample4_6
{publicstaticvoidmain(Stringargs[])
{圆circle=new圆(10);//创建圆对象
//创建圆锥对象把圆对象的引用参数圆对象﹑圆锥高传入给圆锥构造函数
圆锥circular=new圆锥(circle,20);
System.out.println("圆锥底圆半径:
"+circular.获取底圆半径());
System.out.println("圆锥的体积:
"+circular.计算体积());
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第3章 Java面向对象程序设计 Java 面向 对象 程序设计
![提示](https://static.bdocx.com/images/bang_tan.gif)