area_total+=shape[i].area();
(2)类的修饰符——abstract举例
v解决方案
(3)类的修饰符——final
vfinal所修饰的类不可以有子类
v如果把一个应用中有继承关系的类组织成一棵倒长的树,所有类的父类是树根,每一个子类是一个分支,那么声明为final的类就只能是这棵树上的叶结点,它不可能再有分支子类
(3)类的修饰符——final
v被定义为final的类通常是一些有固定作用、用来完成某种标准功能的类
Ø如Java系统定义好的用来实现网络功能的InetAddress、Socket等
v在Java程序中,当通过类名引用一个类或其对象时
Ø实际真正引用的既可能是这个类或其对象本身
Ø也可能是这个类的某个子类及子类的对象,即具有一定的不确定性
v将一个类定义为final,则可以将它的内容、属性和功能固定下来,与它的类名形成稳定的映射关系,从而保证引用这个类时所实现的功能的正确无误
补充:
abstract与final的使用注意点
vabstract和final修饰符不能同时修饰一个类
Ø因为abstract类自身没有具体对象,需要派生出子类后再创建子类的对象
Øfinal类不可能有子类,这样abstractfinal类就无法使用,也就没有意义
v但是abstract和final可以各自与其他修饰符合用
Ø例如一个类可以是publicabstract的,也可以是publicfinal的
✓这里的public是访问控制符
Ø当一个以上的修饰符修饰类或类中的域、方法时,这些修饰符之间以空格分开,写在class关键字之前,修饰符之间的先后排列次序对类的性质没有影响
二.Java的类
1.Java类概念
2.类的修饰符
❆3.域(成员变量)
4.方法
(1)成员变量(域)
v类的成员变量描述了该类的内部信息,一个成员变量可以是简单变量,也可以是对象、数组等其他结构型数据。
v成员变量的格式:
[修饰符]变量类型变量名[=初值];
Ø在定义类的成员变量时,可以同时赋初值,但对成员变量的操作只能放在方法中。
(1)成员变量(域)
v域是类和对象的静态属性,可以是基本数据类型变量,也可以是其他类(系统类或自定义类)的对象
v定义域的操作就是说明变量或创建对象的操作
v与类相似,域(成员变量)也可以拥有若干修饰符,包括访问控制符和非访问控制符
v本节讨论域的非访问控制符
(2)成员变量修饰符——static
v用static修饰的域是仅属于类的静态域(staticfield)
v静态域本质特点:
Ø它们是类的域,不属于任何一个类的具体对象
Ø不保存在某个对象的内存区间中,而是保存在类的内存区域的公共存储单元
Ø对于该类的任何一个具体对象而言,静态域是一个公共的存储单元,任何一个类的对象访问它时,取到的都是相同的数值
Ø任何一个类的对象去修改它时,也都是在对同一个内存单元进行操作
(2)成员变量修饰符——static举例
v程序定义对应200电话卡的类PhoneCard200
Ø所有200电话卡的接入号码都是“200”,所以定义静态域connectNumber标志所有PhoneCard200对象的接入号码
Ø使用200电话卡通话的附加费对每张电话卡也是一致的,所以定义类的静态域additoryFee
(2)成员变量修饰符——static举例
vTestStaticField.java(使用PhoneCard200类)
(3)成员变量修饰符——final
vfinal用来修饰常量
Ø一个类的域如果被声明为final,它的值一旦给定,那么它的取值在程序的整个执行过程中都不会改变,如
staticfinalStringconnectNumber=″200″;
v定义final域时,若不是static的域,则必须且只能赋值一次,不能缺省,这种域的赋值的方式有两种
Ø在定义变量时赋初始值
Ø在每一个构造函数中进行赋值
v在定义final局部变量(方法中的变量)时,也必须且只能赋值一次
Ø它的值可能不是常量,但它的取值在变量存在期间不会改变
(3)成员变量修饰符——final
v用final修饰符说明常量时,需要注意以下几点
Ø需要说明常量的数据类型
Ø需要同时指出常量的具体取值
Ø由于所有类对象的常量成员,其数值都固定一致,为节省空间,常量通常声明为static,如常量值:
✓Integer.MAX_VALUE(表示最大整数)
✓Math.PI(表示圆周率)
v在定义staticfinal域时,若不给定初始值,则按默认值进行初始化
Ø数值为0
Øboolean型为false
Ø引用型为null
(4)成员变量修饰符——volatile
v被volatile修饰符所修饰的域
Ø说明这个域可能同时被几个线程所控制和修改,即这个域不仅仅被当前程序所掌握
Ø在运行过程中可能存在其他未知的程序操作来影响和改变该域的取值
Ø在使用当中应该特别留意这些影响因素
vvolatile常用来修饰接受外部输入的域,如
Ø表示当前时间的变量
✓将由系统的后台线程随时修改,以保证程序中取到的总是最新的当前的系统时间
✓因此可以把它定义为易失域
二.Java的类
1.Java类概念
2.类的修饰符
3.域(成员变量)
❆4.方法
(1)方法概述
v类的动态属性,标志类所具有的功能和操作
v用于将类和对象的数据封装在一起
v定义方法的目的
Ø定义具有相对独立和常用功能的模块
Ø使程序结构清晰,也利于模块在不同场合的重复利用环境的数据
v类的方法用来定义对类的成员变量进行的操作,是实现类内部功能的机制,同时也是类与外界进行交互的重要窗口。
(1)成员方法
v方法由方法头和方法体组成
v方法可以是有返回值也可以无返回值(void,主体中不用return语句)
v方法可带参数也可以不带参数。
(2)方法修饰符——abstract(抽象方法)
v抽象方法仅有方法头、没有具体方法体的实现,如
abstractvoidperformDial();
Øabstract方法只有方法头的声明,而用一个分号来代替方法体的定义
Ø方法体的具体实现,留到各子类在各自的类定义中完成
vabstract方法隐藏具体的细节信息,使调用该方法的程序不必过分关注类及其子类内部的具体状况
v注意
Ø所有抽象方法都必须存在于抽象类之中
Ø但抽象类不一定只能拥有抽象方法,可以包含非抽象的方法
(2)方法修饰符——abstract(抽象方法)
(3)方法修饰符——static(静态方法)
v用static修饰的方法,是属于整个类的类方法
v不用static限定的方法,是属于某个具体类对象或实例的方法
v声明一个方法为static至少以下重含义
Ø调用这个方法时,应使用类名做前缀,而不是某一个具体的对象名
Ø非static的方法是属于某个对象的方法,在这个对象创建时,对象的方法在内存中拥有自己专用的代码段
Østatic的方法是属于整个类的,它在内存中的代码段将随着类的定义而分配和装载,不被任何一个对象专有
Ø由于static方法是属于整个类的,所以它不能操纵和处理属于某个对象的成员变量,而只能处理属于整个类的成员变量,即,static方法只能处理static域
(3)方法修饰符——static(静态方法)
v举例:
v在PhoneCard200中如果需要修改附加费,可以定义一个静态方法setAdditory()
(3)方法修饰符——static(静态方法)
v举例:
不正确的用法
Ø错误信息:
can’tmakeastaticreferencetononstaticvariable.
Ø原因:
只有对象的方法可以访问对象的变量
v修改方法:
将变量改为类变量
(1)成员方法概述——举例
vPerfectNum.java
String.valueOf
String.valueOf():
由基本数据型态转换成String
vString.valueOf(booleanb):
将boolean变量b转换成字符串
vString.valueOf(charc):
将char变量c转换成字符串
vString.valueOf(char[]data):
将char数组data转成字符串
vString.valueOf(floatf):
将float变量f转换成字符串
vString.valueOf(inti):
将int变量i转换成字符串
vString.valueOf(Objectobj):
将obj对象转换成字符串,等于obj.toString()
v……
v用法如:
inti=10;
Stringstr=String.valueOf(i);这时候str就会是"10"
(4)方法修饰符——final(最终方法)
v最终方法:
功能和内部语句不能被更改的,即不能被当前类的子类重新定义的方法
v在面向对象程序设计中,子类可以把从父类那里继承来的某个方法改写并重新定义,形成与父类方法同名,但具体实现和功能却不同的新的类方法,该过程称为重载
Ø若类的某个方法被final修饰符限定,则该类的子类不能重新定义与此方法同名的方法,而仅能使用从父类继承来的方法
Ø好处:
可固定该方法所对应的具体操作,防止子类误对父类关键方法的重定义,保证程序安全性和正确性
(5)方法修饰符——native(本地方法)
v用来声明用其他语言书写方法体并具体实现的方法
Ø其他语言包括C、C++、FORTRAN、汇编等
vnative方法的方法体使用其他语言在程序外部写成,所以native方法都没有方法体,而用一个分号代替
vJava里使用其他语言编写的模块作为类方法的目的
Ø充分利用已经存在的程序功能模块、提高效率和避免重复工作
v由于native方法对应其他语言书写的模块是以非Java字节码的二进制代码形式嵌入Java程序的
Ø这种二进制代码通常只能运行在编译生成它的平台之上,所以整个Java程序的跨平台性能将受到限制或破坏,除非保证native方法引入的代码也是跨不同平台的
(6)方法修饰符——synchronized(同步方法)
vsynchronized修饰符主要用于多线程共存的程序中的协调和同步
Ø如果synchronized修饰的方法是一个类的方法(即static的方法),那么在被调用执行前,将把系统类Class中对应当前类的对象加锁
Ø如果synchronized修饰的是一个对象的方法(未用static修饰的方法),则这个方法在被调用执行前,将把当前对象加锁
补充:
static与final小结
vfinal
Øfinal在方法之前,防止该方法被覆盖
Øfinal在类之前,表示该类不能被继承
Øfinal在变量之前,定义一个常量
vstatic
Østatic在变量或方法之前,表明它们是属于类的
主要内容
一、抽象与封装
二、Java的类
☞三、对象的创建与使用
四、参数传递
五、匿名对象
1、对象的创建
v类名新建对象名=new构造函数();
v创建对象的步骤
(1)声明指向“由类所创建的对象”的变量;
(2)利用new创建新的对象,并指派给前面所声明的变量
v举例:
创建圆柱体类Cylinder的对象
Cylindervolu;//声明指向对象的变量volu
volu=newCylinder();//利用new创建新的对象,并让变量
volu指向它
1、对象的创建
v创建对象,并让变量volu指向该对象
1、对象的创建
vCylindervolu=newCylinder();
Øvolu变量是指向由Cylinder类所创建的对象,所以可将它视为“对象的名称”,简称对象。
Ø事实上,volu只是对象的名称,它是指向对象实体的引用变量,而非对象本身。
Ø在一个方法内部的变量必须进行初始化。
当一个对象被创建时,会对其中各种类型的成员变量自动进行初始化。
除基本类型之外的变量都是引用类型。
Ø一个对象的生命周期:
创建->使用->销毁,对象完成工作后,将被销毁,所占用的资源将被系统回收。
2、对象的使用
v通过对象来引用对象成员的格式如下:
对象名.对象成员
Ø如,volu.radius=2.8;volu.height=5;
v如果引用的是成员方法,只要在成员方法名的圆括号内提供所需参数即可,如果方法不需要参数,则用空括号。
Ø如:
volu.area()
v一个类多个对象,它们的成员变量分配在不同的内存,因此修改某一对象的成员变量时其他不受影响。
2、对象的使用
vApp6_1.java
2、对象的使用
vApp6_1.java
3、在类定义内调用方法
v方法调用
Ø场景一:
方法在类定义的外部被调用,在类声明之外用到成员名称时需指明对象;;
Ø场景二:
在类定义内部,方法之间可以相互调用,若在类内部使用类自己的成员时不必指明对象名
Ø举例:
3、在类定义内调用方法
v在同一个类的定义里面,某一方法可以直接调用本类的其他方法而不需加对象名。
v若要强调是“对象本身的成员”的话,则可以在成员名前加this关键字,即“this.成员名”。
此时this即代表调用此成员的对象。
例如:
主要内容
一、抽象与封装
二、Java的类
三、对象的创建与使用
☞四、参数传递
五、匿名对象
四.参数传递
❆1、以变量为参数调用方法
2、以数组作为参数或返回值的方法调用
1、以变量为参数调用方法
v调用方法并传递参数时,参数其实就是方法的自变量,所以参数要放在方法的括号内来进行传递。
Ø括号内的参数可以是数值型、字符串型,甚至是对象。
Ø方法的参数属于局部变量。
1、以变量为参数调用方法——举例1
vApp6_4.java
1、以变量为参数调用方法
v若在通过方法调用,将外部传入的参数赋值给类的成员变量,方法的形式参数与类的成员变量同名时,如何处理?
1、以变量为参数调用方法——举例2
四.参数传递
1、以变量为参数调用方法
❆2、以数组作为参数或返回值的方法调用
方法的参数传递与返回
v调用对象方法时,要传递参数
Ø在传递参数时,Java是值传递,即,在调用一个方法时,将表达式的值复制给形式参数
Ø对于引用型变量,传递的值是引用值(可以理解为内存地址),因此方法中对数据的操作可以改变对象的属性
v方法的返回
Ø返回基本类型
Ø返回引用类型,就可以存取对象实体
(1)以数组为参数调用方法
v当参数是基本数据类型时,采用传值方式调用;当参数是引用型的变量时,则是传址方式调用。
v传递数组
Ø指明参数是一个数组,实参只给出数组名
v返回值为数组类型的方法。
若返回一个一维整型数组,则方法前加int[]。
(1)以数组为参数调用方法
vApp6_5.java:
以一维数组为参数的方法调用,求若干数的最小值。
(2)返回值为数组类型的方法
v将一个矩阵转置后输出。
主要内容
一、抽象与封装
二、Java的类
三、对象的创建与使用
四、参数传递
☞五、匿名对象
五、匿名对象
v以当一个对象被创建之后,在调用该对象的方法时,也可以不定义对象的引用变量,而直接调用这个对象的方法,这样的对象叫做匿名对象。
v例如:
Cylindervolu=newCylinder();
volu.SetCylinder(2.5,5,3.14);
若改写为:
newCylinder().SetCylinder(2.5,5,3.14);
则Cylinder()就是匿名对象。
五、匿名对象
v使用匿名对象的两种情况:
Ø如果一个对象只需要进行一次方法调用;
Ø将匿名对象做为实参传递给一个方法调用。
v例:
一个程序中有一个getSomeOne方法要接收一个MyClass类对象作为参数,方法的定义如下:
PublicstaticvoidgetSomeOne(MyClassc)
{
……
}
v可以用下面的语句调用这个方法。
ØgetSomeOne(newMyClass());
主要内容
一、抽象与封装
二、Java的类
三、对象的创建与使用
四、参数传递
五、匿名对象
编程题
v找出4*5矩阵中值最小和最大的元素,并分别输出其值及所在的行号和列号。
编程题
v产生0~100之间8个随机整数,并利用冒泡排序法将其升序排序后输出。
v思想:
每次比较相邻的数,若次序不对,交换次序。
冒泡排序实例
编程题
v产生0~100之间8个随机整数,并利用冒泡排序法将其升序排序后输出。
v思想:
每次比较相邻的数,若次序不对,交换次序。
编程题
v从键盘输入一个字符串和一个字符,从该字符串中删除给定的字符。
编程题
v编程统计用户从键盘输入的字符串中所包含的字母、数字和其他字符的个数。
编程题
v将用户从键盘输入的每行数据都显示输出,直到输入“exit”字符串,程序运行结束
拓展:
成员变量与局部变量
v成员变量:
在类中定义的变量
v局部变量:
在方法中定义的变量
v区别:
Ø从语法形式看
✓成员变量属于类,局部变量是指方法中定义的变量或者参数;
✓成员变量可以被访问修饰符、static等修饰,而局部变量则不能被他们所修饰;
✓共同点:
都可以被final修饰
拓展:
成员变量与局部变量
v成员变量:
在类中定义的变量
v局部变量:
在方法中定义的变量
v区别:
Ø从在内存中的存储