1、模块4 Java面向对象初步Fr标了解J a va面向对象程序设计的思想原则。掌握类的结构、定义及对象的创建和使用。掌握成员变量(实例变量、静态变量)和成员常量(实例常量、静态 常量)的定义和使用。掌握成员方法(实例方法、静态方法)的定义和使用,以及成员方法 重载的概念。理解访问控制、数据安全性、包及封装的概念。掌握构造方法(隐式、显式)的定义和使用,以及构造方法重载的概 念。掌握this关键字的使用。了解基本数据类型变量和引用数据类型变量在数值传递上的区别。08技能目标0G1.能够在MyEclipse IDE中定义类,以及创建和使用对象。2.能够在MyEclipse IDE中定义和使用成员变
2、量和成员常量。3.能够在MyEclipse IDE中定义和使用成员方法,以及编写setter方法和getter 方法。4.能够在MyEclipse IDE中定义和使用构造方法。5.能够在类的定义中使用this关键字。6.能够在MyEclipse IDE中创建包及在源文件中引用包。U04回顾与思考在前面几个模块的学习过程中,我们发现Java程序中至少要有一个类,在类所圈定的范围内编写代码。可以认为类是Java程序的核心。把众多的 事物归纳、划分为类是人类认识世界、改造世界时经常采用的思维方式。类是具有相同属性和行为的一组对象的集合。类为属于该类的所有对象提 供了统一的、综合的、抽象的定义,该类的
3、每个对象则是符合这种定义的 一个实体。类和对象的关系就是抽象和具体的关系。类是对象的模板,类 的实例化结果便是生成了对象。类的对象也被称为类的实例。4.2类和对象4.2.1类的结构类的属性在类中上升为成员变量及成员常量,或称它为全局变量及全局常量。与局部变量 及局部常量不同,成员变量及成员常量在整个类中都是可见的。同时,类的行为则上升为成 员方法。除了成员变量、成员常量和成员方法外,类至少还要有一个或多个构造方法以便创 建有所差异的同型对象。定义类的基本语法格式如下。修饰符class类名成员变量(成员常量);构造方法成员方法4.2类和对象4.2.1类的结构【例4】编写程序定义类Circle,代
4、表圆 文件名为Circle.java,其代码如下。public class Circle/*例4-1圆*authorJava程序设计案例教程*version 1.0*/,能够计算圆的周长和面积。return 2*PI*radius;public double calArea()成员方法,计算面积return PI*radius*radius;public double radius;成员变量.圆的半径public final double PI=3.14;成员常量,圆周率public double calPerimeter()成员方法,计算周长4.2类和对象4.2.2创建对象创建对象就是对类进
5、行实例化。创建对象的基本语法格式如下。类名对象名;声明对象对象名二new构造方法名(实际参数列表);初始化对象也可以把声明对象和初始化对象合并起来,即类名对象名二new构造方法名(实际参数列表);其中方括号中的实际参数列表是可选项,参数间用7分隔。4.2类和对象4.2.2创建对象【例42】创建Circle类的对象。文件名为Example4_2.java,其代码如下。public class Example4_2/*例4-2创建对象*authorJava程序设计案例教程*vers ion 1.0*/代码中Circle 0是Java编译系统提供的默认 构造方法。因为在Circle 类中没有定义任何
6、构造方 法,所以此时Java编译系 统就自动提供默认构造方 法供用户创建对象使用。public static void main(String口 args)Circle c=new Circle();)4.2类和对象4.2.3使用对象对象创建完成后,就可以利用该对象访问类中的各个成员了。使用对象访问或调用类中各 类型成员的基本语法格式如下。对象名.成员变量名;访问成员变量对象名.成员常量名;访问成员常量对象名成员方法名(实际参数列表);调用成员方法4.2类和对象4.2.3使用对象【例43】在Example4_Ljava文件中添加代码,使用Circle类的对象访问其成员变量和成 员方法。文件名为
7、Example4_3.java,其代码如下。public class Example4_3/*例4-3创建对象,使用对象*authorJava程序设计案例教程*vers ion 1.0*/Circle c=new Circle();c.radius=5;double perimeter=c.calPerimeter();double area=c.calArea();System.out.printf(%s%.1 fn,该圆的周长为:,perimeter);System.out.printf(%s%.1 fn,该圆的面积为:,area);public static void main(Stri
8、ng口 args)4.2类和对象4.2.3使用对象【例43】运行结果如下。该圆的周长为:31.4该圆的面积为:78.54.3成员变量和成员常量类的成员变量定义了类的对象所拥有的属性。类中的所有构造方法和成员方法都可以访问 类的成员变量。类的成员变量的作用域是整个类,所以也称它为全局变量。定义成员变量的 基本语法格式如下。访问控制修饰符static数据类型变量名=初值;访问控制修饰符有public、private,protected和默认等常用的几种。static是可选项,表示成员变量是静态变量(后面详细解释)。初值是可选项。如果没有赋初值,Java编译系 统会自动给成员变量赋一个默认值,这一点
9、与局部变量不同。例如,int型的默认值为0,double型的默认值为0.0,实例型的默认值为null,等等。Circle类的成员变量radius的初值 即为0Q您4.3成员变量和成员常量4.3.1 实例变量及实例常量成员变量(常量)中有一类成员变量(常量),其取值跟随各自的对象而改变,对象之间 所拥有的成员变量(常量)数据相互独立。这种类型的成员变量(常量)被称为实例变量(常量)。Circle类中的成员变量radius属于实例变量。不同的Circle对象,其radius的数值是 不同的。即便是radius数值相同的Circle对象,因为其分属于不同的对象,这些成员变量的数 据在存储空间上也是相
10、互独立的,所以称其为实例变量。给对象的实例变量赋值的语法格式 如下。对象名.实例变量名=数值;您4.3成员变量和成员常量4.3.2 封装【例4-3】中的代码c.radius=5;的作用是给成员变量radius赋值。这样直接访问及修改成员变量的数值有一个潜在的危险。例如,c.radius 二-5/,半径变成了负数,一般情况下这是不允许的。Java是一门安全性 很高的语言,如何避免这类情况的出现呢?最彻底的办法是提升成员变量 的访问控制级别,将这类非法访问拒之门外。Java通过public、private,protected和默认等修饰符实现访问控制。对于类的成员变量,可以选择 private修饰
11、符,使成员变量只能在本类中可见,在类的外部无法被访问。您4.3成员变量和成员常量4.3.2封装【例44】修改【例4-1】的Circle类,使成员变量radius无法在类的外部被访问。文件名为Cirdejevisedl.java,其代码如下。public class Circle_revisedl/*例4-4 Circle类第一次修改*authorJava程序设计案例教程*version 1.0*/public double calPerimeter()成员方法,计算周长return 2*PI*radius;return PI*radius*radius;private double radiu
12、s;成员变量.圆的半径private final double PI=3.14;成员常量,圆周率44成员方法_类的成员方法定义了类的对象所拥有的行为,是具有某种相对独立功能的程序 模块,可在不同的程序段中被多次调用。Java抛弃了函数的概念,用方法的概念取 而代之。通常有返回值的程序计算模块被称为函数,没有返回值的程序计算模块被 称为过程。在Java中,把上述两种调用类型合称为方法。定义成员方法的基本语法格式如下。访问控制修饰符abstract static final synchronized返回值类型 成员方法名(形式参数 列表)方法体语句序列;return表达式;44成员方法_4.4.1
13、 set ter方法和 getter方法针对成员变量radius,可通过定义getxxx()方法来获取成员变量的值,通过定义 setx x x()方法来设置成员变量的值。【例45】修改【例4-4的Circle类,使之能够 通过sette r和g ette r成员方 法访问成员变量及修改其 数据。文件名为Circle_revised2.java,其代码如下。public class Circle_revised2/*例4-5 Circle类第二次修改*authorJava程序设计案例教程*version 1.0*/private double radius;成员变量.圆的半径private fi
14、nal double PI=3.14;成员常量,圆周率4.4成员方法4.4.1 setter 方法和 getter 方法【例45】public double getRadius()获取圆的半径 return radius;public void setRadiusf double r)设置圆的半径 if(r 0)radius=r;elseSystem.out.printin(圆的半径必须大于。!”);)public double getPI()获取圆周率return PI;public double calPerimeter()成员方法,计算周长return 2*PI*radius;publi
15、c double calArea()成员方法,计算面积return PI*radius*radius;代码中粗体部分为增加的setter和getter成员 方法。因为PI是成员常量,在初始化后,其值在程 序中不可再改动,所以没有针对PI的setter方法。4.4成员方法4.4.1 set ter方法和 getter方法也可通过MyEclipse IDE自动生成getter方法和setter方法。操作步骤如下:右击my Pro项目下的/Circle_revised2.java,/文件,在弹出的快捷菜单中 选择Source选项。然后在弹出的子菜单中选择“Generate Getters and S
16、etters命令,或者直接 在Source菜单项中选择Generate Getters and Setters”命令,打开图4-1所示的Generate Getters and Setters”窗口。图4-1 Generate Getters and Setters”窗口4.4成员方法4.4.1 setter 方法和 getter 方法【例46】修改【例4-3】的Example4_3.java文件,使得能够通过Circle类的setter和getter成员方法访问成员变量及修改其数据。文件名为Example4_6.java,其代码如下public class Example4_6/*例4-6通
17、过setter和getter成员方法访问成员变量及修改其值authorJava程序设计案例教程version 1.0*/public static void main(String args)Circle_revised2 c=new Circle_revised2();c.setRadius(5);System,out.println(该圆的半径为:+c.getRadius();double perimeter=c.calPerimeter();double area=c.calArea();System.out.printf(n%s%.lfn,该圆的周长为:,perimeter)Syste
18、m.out.printf(%s%.1 fn,该圆的面积为:,area);c.setRadius(-5);)44成员方法_4.4.1 setter 方法和 getter 方法 004-61运行结果如下。运行结果该圆的半径为:5.0该圆的周长为:31.4 该圆的面积为:78.5 圆的半径必须大于0!44成员方法_4.4.2 实例方法成员方法中有一类方法必须由已生成的实例或已创建的对象调用执行。此类方法执行后产生 的结果依赖于调用它的对象。这种类型的成员方法被称为实例方法。调用实例方法的语法格式如 下。对象名.实例方法名(实际参数列表1);44成员方法4.4.3 成员方法重载在Java同一个类中,允
19、许两个或两个以上的方法有 相同的方法名,只要它们的参数数量、类型和次序不同 即可。这种情况称为方法重载。有时在同一个类中,多 个方法的功能相似,如果用不同的方法名来区分,管理 和应用都不方便。采用方法重载的方式定义方法就显得 非常简洁、方便。44成员方法_4.4.3成员方法重载-【例47】成员方法重载。见书本P68-69。文件名为Example4_7.java,其代码如下。-运行结果如下:两个整数相加,和为:7三个整数相加,和为:12一个浮点数和一个整数相加,和为:7.5一个整数和一个浮点数相加,和为:7.4两个浮点数相加,和为:7.9一个整数和一个字符串连接,结果为:3445构造方法_4.5
20、.1 隐式构造方法和显式构造方法Java语言是这样规定的:如果没有定义类的任何构造方法,Java编译系统就自动产生一个构 造方法。该构造方法不带参数,方法体为空。那么,在Circle类中,Java编译系统提供的构造方法形如:public Circle()这种由Java编译系统提供的构造方法被称为默认构 造方法,也被称为隐式构造方法。类的设计者定义的不 带参数的构造方法也可被称为隐式构造方法。与之对应,类的设计者定义的带参数的构造方法则被称为显式构造 方法。45构造方法_4.5.1 隐式构造方法和显式构造方法【例4-8】、【例49讲解详见书本P7072e45构造方法4.5.2 构造方法重载 D构
21、造方法必须与它所在的类同名和一个类可以有多个构造方法这两条规则 决定了构造方法必然是重载的。也就是说,java类中可以有多个参数数量、类型和次序 u不同的构造方法存在。a_j4.5构造方法_4.5.2构造方法重载-见书本P72-74。【例40】构造方法重载。-文件名为Circle_revised4.java,其代码如下。-可通过调用同一个类中重载的构造方 法来初始化或创建类型上有所差异的对象。45构造方法4.5.2构造方法重载004-11调用重载的构造方法来创建有类型差异的对象。文件名为Example4_ll.java,其代码如下。运行结果如下。圆cl的半径为:1.0 圆cl的周长为:6.3
22、圆cl的面积为:3.1 圆c2的半径为:5.0 圆c2的周长为:31.4 圆c2的面积为:78.5 圆心坐标是(O.O2O)圆c3的半径为:5.0 圆c3的周长为:31.4 圆c3的面积为:78.5见书本P74-75。45构造方法4.5.3 this关键字0114-12在构造方法和成员方法中参数变量与成员变量同名。修改【例4-8】中的Circle_revised3类,另存为文件名Circlejev sed5.java,其代码如下见书本P75-76。在构造方法C i rcl e_revi sed5(doubleradius)和成员方 法setRadius(double radius)中,粗体代码
23、radius=radius,处会出现给变量radius的赋值无效的语法错 误提示。在构造方法Circle_revised5(double radius)和成 员方法setRadius(double radius)中的参数变量radius是一 个局部变量,其作用范围是其所在方法的内部,在方法外 部是不可见的。45构造方法4.5.3 this关键字现总结this关键字的用法如下。(1)访问当前对象的成员变 量,基本语法格式如下。this.成员变量;(2)访问当前对象的成员方 法,基本语法格式如下。this.成员方法;O、,,(3)在类的构造方法中调用同一个类中重 载的构造方法,基本语法格式如下。t
24、his(实际参数列表);45构造方法4.5.3 this关键字【例413this关键字的使用。修改【例4-10中的Circle_revised4类,另存为文件名Circle_revised6.java,其代码如下。运行结果如下。圆心坐标是(2Q3.0)该圆的半径为:5.0该圆的周长为:31.4 该圆的面积为:78.5见书本P78-80。46静态成员_0114-14在Circleevised5,java文件的基础上修改代码,增加一个成员变量num用来 统计所创建的圆的数量,再增加一个成员方法getNum()获取所创建的圆的数量。码中粗体部分为增加的代码,运行果如下。总共创建了 1个圆。总共创建了
25、 1个圆。、总共创建了 1个圆。_见书本P81-82。46静态成员4.6.1静态变量和静态常量类的成员变量分为两种:实例变量类的成员期1 6静态变类变量46静态成员4.6.1静态变量和静态常量【例415】修改Circle_revised7类,把num由实例变量改为静态变量。修改后的文件名为Circle_revised8.java,其代码如下。/运行结果如下。总共创建了 1个圆。总共创建了 2个圆。总共创建了 3个圆。见书本P83-85。(静态常量也属于整个类。静态常量在初 始化后,它的值就不能再改变了。不同位置 和不同大小的圆,其圆周率是一个恒定的值,因此Circle类中的成员常量PI应该定义
26、为静 产常量类型。46静态成员4.6.1 静态变量和静态常量【例416】修改Circleevised8类,把成员常量PI定义为静态常量类型。文件名为Circle_revised9.java,其代码如下。见书本P85-87。4.6静态成员4.6.2 静态方法和成员变量一样,类的成员方法也分为两种:实例方法Qi静态方法/类方法46静态成员_4.6.2静态方法【例417】修改Cirdeevised9类,重新定义get Num()方法为静态方法。文件名为CirclejevisedlO.java,其代码如下。见书本P87-89。4.6静态成员4.6.3 main。方法,main。方法前面的修饰依次为pu
27、blic、static和void。因分main。方法是Java程序运行的起点,所以它必须为public,这 样在任何地方都可见;在main。方法诞生之前还没有任何对象 或实例被创建,main。方法就不可能为任何对象或实例所调用,所以必须为static;main。方法执行后直接产生结果,而不需 要把结果送到某个地方去使用,所以main。方法没有返回值,妆须为void。4.7基本数据类型和引用数据类型的比较【例418】修改CircleevisedlO类的main()方法,增加基本数据类型和引用数据类型的 赋值运算及数据修改操作。文件名为Circlejevisedll.java,其代码如下。_见书本
28、P90-92。运行结果如下。把rl的值赋给己后,cl的radius值为1.0修改r2的值后,修的radius值为1.0把cl的引用赋给c2后,cl的radius值为1.0直接修改c2的radius值后,cl的radius值为2.0通过setter方法修改c2的radius值后,cl的radius值为3.0Java中的包也是面向对象封装原则的体现。在有一定规模的项目设计 过程中,程序往往被分割成独立设计的功能块交给不同的程序员去完成。不同的程序员命名了同名的类在所难免,因而会产生类名冲突。所以需要 创建若干个包,只有功能和结构上相关联的类才能放在同一个包中,就像 把有关联的文件放在同一个文件夹中
29、那样,便于类的管理和使用。包起到 了在更广的范围保护数据安全的作用。根据访问规则,拥有包访问权限的 类才能访问某个包中的类。4.8包4.8.1包的创建在Java源文件中,定义包的基本语法格式如下。package 包名;T上述语句为包的声明语句,package是关键字。它必须是 Java源文件中的第一条非注释语句。一个Java源文件只能有一 条包声明语句。包声明语句生效后,同一文件内的所有类和接 口都被纳入这个包里。Java编译系统把包对应于文件系统的目 录进行管理。4.8.1包的创建004-19在MyEclipse IDE的Java项目中创建不同层级的包。0步骤如下:右击my Pro项目下的s
30、rc 目录,在弹出的快捷菜单中执行New 一 Package”命令,在弹出 的nNew Java Package窗口中输入包 名ch5.example,如图4-2所示。单击 Finish按钮,完成包ch5.example的创建。图4-2创建包4.8.1包的创建004-19在MyEclipse IDE的Java项目中创建不同层级的包。打开D:MyEclipse8.5myPro src目录,可以发现其下一级目录ch5,以及目录ch5的下一级目录example。接下来,如果通过MyEclipse ID E在包c h 5.exa m p I e中创建J a va源 文件,在所创建的Java源文件的第
31、一行会自动出现代码package ch5.example;,z z它表明所创建的 Java源文件属于包ch5.exampleo4.8.2包的引用如果要使用Java包中的类(包括Java API中的包和自定义的包),必须向源文件导入所需的类,基本语法格式如下。import 包名 1.包名 2.类名|;其中,import是关键字。包名L 包名2.类名|*表示包的 层次关系,与package语句一样对应着文件夹。各级包名及类名之间用.分隔符隔开。类名是指所要导入的类。*表示导入包下所有的 类和接口。4.8.3访问保护对于类的成员而言,可以在任何地方访问任何被声明为public的成员。在 类的外部无法
32、访问任何被声明为private的成员。在同一个包中可以访问任何被 声明为protected或default的成员。在子类中还可以访问处于不同包中被声明 为p rotected的父类成员。对于类而言,只有两个访问级别:public或default。如果一个类被声明为 public z那么它可以被其他任何类访问;如果一个类被声明为default,那么它 只能被同一个包中的其他类访问。类是具有相同属性和行为的一组对象的集合。类包括了实例成员(实例变量、实例常量、实例方法)、静态成员(静态变量、静态常 量、静态方法)和构造方法。通过构造方法创建类的对象。通过对象 调用类的实例成员。通过类名直接调用类的
33、静态成员。通过访问控制 及setter方法和getter方法保证数据的安全性。成员方法可以重载,构造方法也可以重载。this关键字用来指代将来被创建的当前对 象,以区分成员变量和局部变量。对类的成员访问控制有public、protected,default和private 4个级别。对类的访问控制有public和 default两个级别。40习题1.给出Exercise4.java文件,运行后结果如何?为什么?如果要做到每次初始 化后常量i的值都不发生改变,该怎么办?public class Exercise4_l private final double i=Math,randan();pu
34、blic static void main(String args)Exercise4_l el=new Exercise4_l();System,out.println(el.i);System.out.println(el.i);Exercise4_l e2=new Exercise4_l();System,out.println(e2.i);40习题2.System.out.println();这条语句经常被使用 o查阅Java API得知System.out运行后产生一个 Printstream类的对象,再由该对象调用println()方法,而Printstream类属于java.io
35、包。我们知道,除了 java.lang包是自动导入的,其余包必须用import语句 显性导入。可是,为什么使用/System.out.println();,/语句时不需要导入java.io包 呢?40习题3.下列代码编译能通过吗?如果不能,说明原因。public class Exercise4_3 public static void add(int x.double y)System,out.println(一个整数和一个浮点数相加,和为:”+(x+y);public static void add(double x,int y)System.cut.printin(一个浮点数和一个整数相加
36、,和为:”+(x+y);public static void main(String口 args)add(3,4.0);add(3.0,4);add(3,4);4.定义类Triangle,代表三角形,提供计算三角形周长和面积的方法。1.定义类Rectangle,代表矩形,提供计 算矩形周长和面积的方法。2.定义类UQEquation,代表一元二次方 程,求解一元二次方程的实数解。3.定义类Fraction,代表分数,能进行两 个分数相加。4工上机实践4.编写程序,根据三角形的3条边长,判断其为直角三角形、钝角三角形、锐角三角形还是等边三角形。程序运行结果示例如下。请输入第一条边:i 请输入第二条边:2 请输入第三条边:3 这不能构成三角形 这是一个等边三角形 继续吗?(y/n):v 请输入第一条边:2 请输入第二条边:7继续吗?(y/n):v请输入第一条边:3 请输入第二条边:4请输入第三条边:5 这是一个直角三角形 继续吗?(y/n):v请输入第一条边:6 请输入第二条边:6请输入第三条边:6 请输入第三条边:8 这是一个钝角三角形 继续吗?(y/n):y 请输入第一条边:4 请输入第二条边:4 请输入第三条边:5 这是一个锐角三角形 继续吗?(y/n):n 谢谢使用!谢谢观看!