《第6章 面向对象编程.doc》由会员分享,可在线阅读,更多相关《第6章 面向对象编程.doc(51页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第六章 面向对象编程(OOP)本章要点面向过程的设计思想抽象封装属性、局部变量/成员属性、变量的作用域Java程序执行过程分析方法方法调用方法参数及其传递问题this关键字简单的JavaBean类包面向对象的编程思想是目前应用最广泛的编程思想。程序设计者考虑的是:对象的描述、对象间的关系、类的管理、何时何地调用对象的哪一种方法等。使用面向对象的编程思想适用于规模较大的应用程序。Java面向对象的编程思想引入了许多概念和机制,归纳总结为四大点:抽象、封装、继承和多态。6.1 面向过程的设计思想面向过程的设计思想在考虑问题时,是以一个具体的流程为单位,考虑它的实现办法,关心的是功能的实现。在程序设
2、计过程中一般由各个相关联的函数实现,耦合性比较强。在程序设计过程中,程序有一个明显的开始、明显的中间过程、明显的结束,程序的编制以这个预定好的过程为中心,设计好了开始子程序、中间子程序、结尾子程序,然后按顺序把这些子程序连接起来,一旦程序编制好这个过程就确定了,程序按顺序执行。如果在执行过程中,用户需要输入什么参数或用户做出选择,程序将等待用户的输入。只有用户提供了足够的数据,程序才能继续执行下去。下面来看一个简单的面向过程的例子。在洗衣机的工作过程中,一般要经过以下几个过程。(1) 接通电源,按下洗衣机的“启动”按钮后开始供水。(2) 当水满到“水满传感器”时就停止供水。(3) 水满之后,洗
3、衣机开始执行漂洗过程,正转5秒,然后倒转5秒,执行此循环动作10分钟。(4) 漂洗结束之后,出水阀开始放水。(5) 放水30 秒后结束放水。(6) 开始脱水操作,脱水持续5分钟。(7) 脱水结束后,“声光报警器”报警,叫工作人员来取衣服。(8) 按下“停止”按钮(或10 秒报警超时到),声光报警器停止,并结束整个工作过程。按照该洗衣机的工作流程可以画出它的状态图来描述其状态转化过程,了解了该洗衣机的状态转化过程后,根据其状态图就可以很容易地为其进行软件设计,并写出相应的程序实现代码。但是这样的设计,每一个环节只关注行为动作和功能实现,没有考虑数据的状态,而且各个行为之间的耦合性比较强,不利于程
4、序的扩展和模块化。6.2 面向对象的设计思想面向对象的设计思想在考虑问题时,以具体的事物(对象)为单位,考虑它的属性(特征)及动作(行为),关注整体,就好比观察一个人一样,不仅要关注他怎么说话,怎么走路,还要关注他的身高、体重、长相等属性特征。又比如,用程序来模拟对窗口的操作。使用面向过程的设计思想时,主要就是定义针对窗口的各种操作:隐藏窗口、移动窗口、关闭窗口等功能。而使用面向对象的设计思想时,却是把窗口当作主体来看待,定义它的大小、位置、颜色等属性,同时定义好对应的动作,如隐藏、移动、关闭等。面向对象的编程思想更加接近于现实的事物,它有以下几点好处。(1) 使编程更加容易。因为面向对象更接
5、近于现实,所以可以从现实的东西出发,进行适当的抽象。 (2) 在软件工程上,面向对象可以使工程更加模块化,实现更低的耦合和更高的内聚。(3) 在设计模式上(似乎只有面向对象才涉及设计模式),面向对象可以更好地实现开-闭原则,也使代码更易阅读。相对而言,面向过程的程序设计是面向对象程序设计的基础。面向对象的程序里面一定会有面向过程的程序片段的。在程序中,面向过程的程序设计,通过函数来实现。面向对象的程序设计,通过对象来封装函数和数据等。总的来说,面向对象编程(Object Oriented Programming,OOP)是一种计算机编程架构。OOP具有的优点是:使人们的编程与实际的世界更加接近
6、,所有的对象被赋予属性和方法,这样编程就更加富有人性化;它的宗旨在于模拟现实世界中的概念;在现实生活中所有事物全被视为对象;能够在计算机程序中用类似的实体模拟现实世界的实体(实体即实实在在的物体);它是一种设计和实现软件系统的方法。OOP主要有抽象(Abstract)、封装(Encapsulation)、继承(Inheritance)和多态(Polymorphism) 四大特征。6.3 抽 象首先来了解面向对象编程思想的第一个特征:抽象。抽象主要用来把客观世界中真实存在的事物用编程语言描述出来。这也是理解面向对象编程思想的第一步。在了解抽象这个概念之前,需要先来了解一下对象和类的概念。6.3.
7、1 了解对象在了解对象之前,先要了解世界是由什么组成的。客观世界是由事物组成的,现实生活中各个实实在在的事物也叫实体,如图6.1所示。图6.1 现实生活中的实体如果以面向对象的编程思想来看客观世界的话,万事万物皆对象。对象就是某一个具体的事物,比如一个苹果、一台计算机都是一个对象。每个对象都是唯一的,两个苹果,无论它们的外观有多么相像,内部成分有多么相似,两个苹果毕竟是两个苹果,它们是两个不同的对象。对象可以是一个实物,也可以是一个概念,比如某个苹果对象是实物,而一项政策可能就是一个概念性的对象了。在现实生活中,万事万物皆对象,OOP是模拟现实生活中的一个个对象来编程的。下面来看一个例子,如图
8、6.2所示。图6.2 生活中的对象日常生活中,大家谈论别人的媳妇(也就是对象)时,不仅会谈论她的姓名、年龄、体重等,还会关注她的行为,如:她能摔跤、会柔道等。通过上面的介绍可以看出:万事万物皆对象,每一个对象都是唯一的,对象具有属性和行为。6.3.2 Java抽象思想的实现现实生活中的这么多对象需要进行分类。比如分为:人类、老虎类、猫类、汽车类等。分类的作用主要是为了便于管理和维护。由于面向对象的设计思想主要是通过模拟现实世界的各个对象来编程的。那么这些现实生活中的对象是怎样模拟或映射到计算机中的呢?这要归功于面向对象的一大思想抽象。其实抽象不是Java语言中面向对象的设计思想所特有的,在其他
9、面向对象的语言中,如C+等,在构建对象时也需要抽象建模。但抽象思想之所以归纳进来,是因为它的确对于理解面向对象的编程起到了非常重要的作用。在人类长期的进化过程中,人们之所以叫人类,是因为通过抽象的思想,将具有各个人的共同特征(如人有手、脚,会说话,会直立行走等)和行为的高级动物分为一类叫人类。人类主要是为了区别于其他的动物而抽取出来的。从上面的理解可以看出,所谓的抽象,即抽取,也叫提炼或归纳总结等。每一个人可以把他当成一个个具体的实体对象,通过抽象,可以很容易地归纳总结出人的共同特征和行为,以便于和其他对象区别开来。这样抽取出来的属性和行为在面向对象的编程中叫属性和方法。属性是指对象具有的各种
10、特征;行为用来描述对象的各种操作,一般用动词来描述。每个对象的每个属性都拥有特定值,如根据图6.2可知布兰尼和朱丽叶的姓名、体重、年龄都不一样,如图6.3所示。她们执行的各种操作也不一样,如图6.4所示。通过抽象将下列对象中的属性和方法抽取出来,如图6.5所示。图6.3 布兰尼和朱丽叶的属性图6.4 对象的操作与方法图6.5 对象的抽象6.4 封 装在面向对象的编程过程中为什么需要封装(Encapsulation)呢?因为对象也有隐私,对象的隐私就是对象内部的实现细节。要想对象保持良好的形象就要保护好对象隐私,所谓的封装其实就是保护对象隐私。当然,没有人能完全隐藏自己的隐私,比如现实生活中去转
11、户口时,不得不透露自己的家庭信息和健康状况。另外,在不同的场合所透露隐私的数量也不一样,朋友和家人可能会知道你更多的隐私,同事次之,其他人则知道得更少。面向对象的编程也考虑了这些实际的情况,所以像Java之类的编程语言有public、private、protected、friend等关键字,以适应于不同的情况。封装可以隔离变化。对象内部是非常容易变化的,比如:电脑在不断升级,机箱还是方的,但里面装的CPU和内存已是今非昔比了。变化是不可避免的,但变化所影响的范围是可以控制的,不管CPU怎么变,它不应该影响用户使用的方式。封装是隔离变化的好办法,用机箱把CPU和内存等封装起来,对外只提供一些标准
12、的接口,如USB接口、网线接口和显示器接口等,只要这些接口不变,不管内部怎么变化,也不会影响用户的使用方式。封装还可以提高易用性。封装后只暴露最少的信息给用户,对外接口清晰,使用更方便,更具用户友好性。试想,如果普通用户都要知道机箱内部各种芯片和跳线是如何布局的,那是多么恐怖的事情,到现在为止编者甚至还搞不清楚硬盘的跳线设置,幸好也没有必要知道。封装有两层含义,其一是隐藏内部行为,即隐藏内部函数,调用者只能看到对外提供的公共函数。其二是隐藏内部信息,即隐藏内部数据成员。为了实现数据的封装,提高数据的安全性,一般建议把类的属性声明为私有的,把类的方法声明为公共的。这样,对象能够直接调用类中定义的
13、所有方法,当对象想要修改或得到自己的属性的时候就必须要调用以定义好的专用的方法才能够实现。在考虑封装的时候,建议读者遵守“对象调方法,方法改属性”的要求即可。对于面向对象编程而言,读者需要掌握如下几点。(1) 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的重要的一部分。(2) 封装就是将属性和方法一起包装到一个程序单元中,并隐藏方法的实现过程。这个程序单元以类的形式实现。(3) 只关注类的属性和方法就称为数据抽象。封装一个类,就是根据具体的应用从同一类型对象中抽象出相关的属性(成员变量)和方法(函数)。如:封装人
14、这个类,将张三、李四、王五、布兰尼、朱丽叶等具体对象的重要信息抽出来,如:姓名、体重、身高、说话、行走等,只要有这些特征的高级动物归为一类就称为人类。6.4.1 对象封装的概念对象同时具有属性和方法两项特性,对象的属性和方法通常被封装在一起,共同体现事物的特性,二者相辅相成,不能分割。图6.6很形象地说明了,狗除了有颜色它还能跑动,这就是说对象除了有属性外还要有方法。图6.6 跑动中的小狗6.4.2 理解类现实生活中任何实实在在的具体物体都叫对象,通过面向对象的抽象思想,根据很多实体的行为特征可以抽取出很多很多的对象,如张三、李四、法拉利汽车、投影仪等,然后再通过归纳总结,将这些对象分门别类,
15、如图6.7所示。 图6.7 法拉利汽车法拉利汽车是一个实体,可以抽象出它们共同的特征:有四个轮子、有颜色、能开、能坐等,具有这些特征的对象可以归为一类叫做汽车类。此外还有很多很多的归类对象,如:人类、狗类、老虎类等。总的来说,类可以理解为对事物的分类。6.4.3 Java类模板创建人民币分类就有100元、50元、20元、10元等,这些钱都是通过印钞机的模板印刷出来的。那么相应的就会有100元的模板、50元的模板、20元的模板等,这些模板都是根据现实生活中的一张张钱的共同特征制作出来的,它们都有尺寸、颜色、大小、功能等,如图6.8所示。类可以理解为对数据的分类类型,是各种数据的模板。在面向对象的
16、编程过程中,类是对象的类型,不同于原始数据类型int等,它有具体的方法。类决定对象将会拥有的特征(属性)和行为(方法)。比如:人类是一个共性的概念,对象是一个个性的概念。人类肯定包含每一个人也就是对象的共同特征:姓名、身高、会说话、能行走等,这些特征都是由人类共同决定的。再比如:人民币的模板决定着印出来的人民币的颜色、大小和功能等。一个类可以决定多个对象,就好比100元人民币的模板决定印出来的人民币的样式是一样的。编程人员可以定义自己想要的类。类就是现在提到的对对象的分类,如上面提到的对人民币的分类,印刷人民币时要先造印钞的模板,模板决定造出来的钱的样式。在Java中模板即类,100元的人民币
17、在Java中叫做对象。所以,要创建出对象,首先要创建出它的数据类型,即类。图6.8 印钞机和钞票的关系在Java中是通过类来封装现实生活中对象的各个信息的,如图6.9所示。图6.9 类封装图通过多个具体的人(即对象)的共性特征归纳出(也即抽象出)他们共同的特征和行为:姓名name、性别sex、年龄age、说话speak()、行走tread()等。再将这些对象归为一类叫做Person类。在Java中如何创建类呢?类是将现实世界中的概念模拟到计算机程序中,这需要由Java程序确定。在Java语言中,所有Java程序都以类为组织单元,构成Java面向对象编程的最小封装单元。在Java中通过关键字cl
18、ass定义自定义的数据类型。Java类的模板创建语法如下:public class 类名 /定义属性部分 属性1的类型 属性1; 属性2的类型 属性2; 属性n的类型 属性n; /定义方法部分 方法1; 方法2; 方法m;Java类的主体是通过一对大括号“ ”括起来的。类的主体中,除了属性就是方法。举例如下面的程序Person.java。public class Person/属性的创建private String name;private String sex;private int age;/类中方法的创建public void speak() System.out.println(会说话
19、);public String tread() System.out.println(会行走); return 会行走; public static void main(String args) System.out.println(Java面向对象的程序设计,类的创建);在Java中创建自定义类型的步骤为:第1步 定义类名。第2步 编写类的属性。第3步 编写类的方法。【示例1】ClassRoom.java如果有一个用类的思想输出学校教室信息的问题,在问题中可以提取出教室类,并可以提取出它的属性,如:教室名称、教室数目、机器数目等,方法为显示教室的信息。代码如下:public class Cl
20、assRoom /定义教室属性 String name; /教室名称 int classNum; /教室的数目 int labNum; /机器数目 /定义教室的方法 /定义教室的方法 public String toString() return 教室名称: +name+ n + 教室数目:+ classNum + n + 电脑台数: + labNum + n ;在前面的练习中class中都包含有一个main方法,但在此类的定义中却未含有该方法,这是为什么呢?在这里要强调的是,Java类并不需要一定含有main方法,除非把此类定义为执行类。6.4.4 Java中对象的创建和使用对象是Java程
21、序的核心,在Java程序中“万事万物皆对象”。类描述了对象的属性和对象的行为。类是对象的模板和图纸。对象是类的一个实例,是一个实实在在的个体。类和对象的关系如图6.10所示。图6.10 类和对象的关系类是对象的模板,决定着对象的属性和方法。由对象可以抽象出类,类可以实例化成对象,就像印钞机的模板决定印刷出来的钱的大小、颜色。创建和使用对象的步骤如下。第1步 使用new关键字创建类的一个对象,格式为:类名 对象名 = new 类名();创建一个ClassRoom类的对象,套用以上格式,代码为:ClassRoom center = new ClassRoom(); 此语句类似于基本数据类型的变量的
22、声明并赋初值,如:语句“int center=88;”。第2步 通过对象名.属性或对象名.方法来使用。访问对象中封装好的属性和方法是通过“.”点操作符来访问的。访问对象的属性用“对象名.属性名”;调用对象的方法用“对象名.方法名()”。center.name = CSDN软件学院; /给属性赋值center.toString(); /调用类的方法,该方法中的操作将被执行【示例2】ClassRoomTest.java根据示例1创建一个学校中心教室类的对象,并给属性赋值后显示在控制台上。代码如下:public class ClassRoomTest public static void main(
23、String args) ClassRoom center = new ClassRoom(); /直接输出对象时,会默认调用对象的toString()方法 /以下语句相当于System.out.println(center.toString(); System.out.println(center.toString(); center.name = CSDN软件学院; center.classNum = 10; center.labNum = 10; System.out.println(center.toString(); 输出结果为:教室名称: null教室数目:0电脑台数: 0教室名称
24、: CSDN软件学院教室数目:10电脑台数: 10当一个对象被创建时,会对其中各种类型的成员变量自动进行初始化赋值。所以在未给center赋值的时候toString()方法显示的是null、0和0,赋值后显示的是“CSDN软件学院”、“10”和“10”。请思考一下:如果ClassRoom类中的属性设置为私有的,此处的ClassRoomTest类编译能通过吗? 【示例3】编写学生类、教师类及测试类编写学生类,输出学生相关信息;编写教师类,输出教师相关信息;编写测试类,测试代码的正确性。学生类和教师类的具体属性及方法如图6.11所示。图 6.11 学生类和教师类的属性及方法学生类代码Student
25、.java如下:public class Student /工具自动帮用户创建了一个数据类型叫Student类 /属性 String name;/姓名 int age;/年龄 String course;/课程 String interest;/兴趣需要注意它们的数据类型 /方法-显示学员的个人信息 public void display() System.out.println(姓名:+name+年龄:+age+课程:+course+兴趣: +interest); 教师类代码Teacher.java如下:public class Teacher /属性 String name;/姓名 Str
26、ing speciality;/专业 int age;/年龄 String course;/教授的课程 /方法显示教师的个人信息 public void display() System.out.println(教师的信息为:姓名:+name+专业: + speciality +年龄:+age+课程:+course); 测试类代码Testing.java如下:public class Testing public static void main(String args) /声明并赋初值 Student zhangSan=new Student (); Teacher laoWang=new
27、Teacher(); /使用 zhangSan.name=张三; zhangSan.age=22; zhangSan.course=JavaEE高级冲刺班; zhangSan.interest=对Java老师讲的课比较感兴趣; /使用属性为属性赋值 zhangSan.display();/显示张三的个人信息的方法 laoWang.name=老王; laoWang.age=28;/使用老王的属性 laoWang.course=主攻Java; laoWang.speciality = JavaEE方向; laoWang.display();/显示老王的个人信息。 在前面已经了解main方法的用法,
28、它的存在为Java应用程序启动器java提供了程序执行的入口点。因此,任何类都可以包含main方法。但一般是基于如下原因才在类中添加main方法。(1)、为了执行测试程序以测试类的其它方法中包含的程序。(2)、为了启动应用程序。本例中是基于第一种情况才在Testing类中添加main方法的。读者朋友可能对于类和对象的理解已经有初步的印象。面向对象的设计重点是类的设计,而不是对象的设计,下面将详细介绍与类的组成部分:属性和方法。6.5 属 性在定义类时,经常需要抽象出它的属性并定义在类的主体中。下面就来介绍和属性相关的内容。6.6.1 属性的定义在类中定义的属性有常量属性和成员属性之分。常量属性
29、就是用final修饰的属性,它的值只能赋值一次,以后不能再更改了。并且在类中定义的常量属性一般用大写字母命名,如:【代码(AttributeDemo1.java)】public class AttributeDemo1 final String ABS=-8; final double PI=3.14; /常量属性,圆周率 非常量属性就是成员属性,它直接定义在类的主体中,如:【代码(AttributeDemo2.java)】public class AttributeDemo2 private String name; private int age; /成员属性 对于成员属性在Java中提供
30、了三种初始化方式:(1)、使用缺省值初始化所有的字段虽然在声明的时候都未包含初始值,在默认的情况下,每个字段都会被赋予缺省值。Java中为不同的类型提供的缺省值如表6.1所示。表6.1 Java中各类型缺省值表数据类型缺省值 booleanfalse byte0 charu0000 short0 int0 long0L float0.0fdouble0.0d引用类型null(2)、使用显示值初始化:亦即声明的同时并赋值,如定义AttributeDemo1类中的属性即采用此种方式。(3)、使用构造器初始化:通过构造器来初始化属性,请读者参看6.6小节内容。6.6.2 变量在理解类的属性的同时,还
31、需要理解一个更为常用的概念:变量。变量用来代表内存中的某块区域,这块内存区域中的值可以在程序的执行过程中发生变化。变量根据它定义的位置分为成员变量和局部变量。直接定义在类的主体中的变量叫成员变量,定义在方法的主体中的变量叫局部变量。上面介绍的类的属性其实就叫成员变量,它们只是两种不同的称谓而已。Java变量在使用前必须先声明和初始化(赋初值),特别是局部变量,如果它没有被显式初始化并赋值,那么它的值是不可预见的,程序中使用这个变量时就可能会出现异常情况。定义局部变量的语法格式为:数据类型 变量名=值;。如:【代码Amethod.java】import java.ulil.Date;public
32、 class Amethod public void Amethod()/定义一个方法 int i; int j = i+5 ; / 编译出错,变量i还未被初始化就使用了 double d = 3.14; System.out.println(“test the local variable”); 变量是有作用域的。所谓变量作用域是指定变量使用的范围,也就是活动范围。变量作用域和现实生活实例类比:鱼要在水中游、鸟要在天空中飞,每一个事物都有它的作用范围。在Java 编程中一般通过(大括号)来表示变量的作用范围。【示例4】Company.java变量作用域演示示例的代码如下:public cla
33、ss Company / 公司总经理命令 String managerSay = 我命令全体员工休假两天; / 执行总经理命令 public void say() System.out.println(总经理发言: + managerSay); /执行湖北地区经理命令 public void huBeiManagersay() String managersay1 = 我命令湖北地区全体员工休假两天; System.out.println(湖北地方区经理发言: + managersay1); System.out.println(总经理发言: + managerSay); /执行湖南地区经理命
34、令 public void huNanManagersay() String managersay2 = 我命令湖南地区全体员工休假两天; System.out.println(总经理发言: + managerSay); / 编译出错 System.out.println(湖北地方区经理发言: + managersay1);System.out.println(湖南地方区经理发言: + managersay2); 在这个例子中,成员变量“managerSay”可以在方法huBeiManagersay范围内使用,也可以在huNanManagersay范围内使用。但湖北某个分公司经理的权利只能在湖
35、北地区得到实施,在其他地区的公司得不到执行。运行上例结果,如下所示。Company.java:20: 找不到符号符号: 变量 managersay位置: 类 Company System.out.println(湖北地方区经理发言: + managersay1); 1 错误变量声明的位置决定变量作用域,变量作用域确定了可以在程序中用变量名来访问该变量的值的区域。在Company.java类的示例中如图6.12所示。图6.12 变量的作用域在图6.12中,变量1可以在方法1、方法2中使用,也可以在方法1和方法2的外面使用,只要在类的主体(也就是类的)中都可以使用。但变量2只能在方法1中使用,变量
36、3只能在方法2中使用,超出这个范围就不能使用了。6.6 方 法在封装一个类时,不仅要定义出该类的属性,更为重要的是封装该类的方法。本节就来详细介绍在类中如何封装方法。6.6.1 方法的定义操作的实际实现;方法指定操作对象数据的方式;如何执行所请求的操作规范;在得到操作请求时指定如何做的算法等都要一种办法来完成。对对象的执行操作叫方法。方法的作用有:使程序变得更简短更清晰;有利于程序维护;可以提高程序开发的效率;提高了代码的重用性。 【示例5】AutoLion.java下面编写一个电动狮子跑和叫的方法示例。电动狮子的属性和方法如图6.13所示。图6.13 对象的属性和方法public class
37、 AutoLion String color = 黄色; /定义一个方法:public是修饰符,void表示没有返回值public void run() System.out.println(正在以0.1米/秒的速度向前奔跑); public String bark() /叫的方法 String sound = 吼 ; return sound; 从以上代码可以看出,方法定义至少需要四要素:方法返回值类型,方法名称、形参列表以及方法体。至于方法体有没有要看情况,一般定义方法的时候都要指定方法体,但在后面学习接口的特性时可以不用指定。方法四要素如图6.14所示。图6.14 方法四要素语法:pub
38、lic 返回值类型 方法名(形式参数列表) /这里编写方法的主体方法的命名与属性类似,主要归纳为如下四点:l 以字母、数字、下划线_或$符号组成。l 由字母、下划线_或$符号开头。l 区分大小写。l 不能是Java中的关键字。方法规范与标识符的也类似,只不过要遵循方法的命名规范:通常方法名是一个动词,如果由两个以上单词组成,第一个单词的首字母小写,其后单词首字母大写,如addStudent等。方法的返回值有以下两种情况:(1) 如果方法具有返回值,方法中必须使用关键字return返回该值,返回类型为该返回值的类型,如:return 表达式; /注意表达式的值必须是确定的值(2) 如果方法没有返
39、回值,返回类型为void。下面来了解一下定义方法时常出现的错误。常见错误1:返回类型不匹配【代码(Student.java)】public class Student String name = 张三; public void getName() return name; /本方法定义了没有返回值,这里却用return返回了一个值 /return; 常见错误2:main方法不能有返回值public class School public static void main(String args) return 我爱java; /编译出错,main方法没有返回值 常见错误3:方法最多只能有一个返
40、回值public class Student public double getInfo() double weight = 96.5; double height = 1.69; return weight, height; /编译出错,返回了多个值 类中的方法可以分成好多类别。根据方法的作用可以分为构造方法和自定义方法;根据方法的参数类型可以分为无参方法和有参方法。 无参方法的定义语法为:public 返回值类型 方法名() 例如:public int add() int i=8; int j=9; return i+j;/返回值类型必须要与定义方法的返回值类型一致有参方法的定义语法为:p
41、ublic返回值类型 方法名(形式参数列表)例如:public int add1(int i,int j) return i+j;/i和j的值由调用此方法的实际参数赋给方法在定义的过程中只是为此功能定义了一个框架,以及所需要参与运算的变量数据叫形式参数。此形式参数定义在方法的()(小括号)内,只是声明的形式参数的变量并没有给它赋值,如果需要调用此方法,主要通过:对象名.方法(实际参数)的形式来调用。如:stu.add1(8,9); /stu为对象名,8、9为实际参数,此参数也可以是已经赋了值的变量实际参数就是已经定义并赋予了初值的变量或对象,是实实在在存在的数据,也叫实际参与运算的数。6.6.
42、2 构造方法一个新对象初始化的最终步骤是通过new关键字去调用对象的构造方法,构造方法必须满足以下几个条件:(1) 方法名必须与类名称完全相匹配。(2) 不要声明返回类型。(3) 不能被static、final、synchronized、abstract、native修饰,且不能有return语句返回值。创建某类的对象要遵循:类名 对象名 = new 类名(); 使用new关键字创建对象要注意以下三个方面:(1)为对象实例分配内存空间(2)调用构造方法(3)返回对象实例的引用当一个对象被创建时,会对其中各种类型的成员变量自动进行初始化赋值。除了基本数据类型之外,其余的变量类型都是引用类型。创建对象在内存的示意图如图6.15所示。图6.15 对象内存位置示意图构造方法和方法的类似之处在于它们都包含可执行代码。然而,它们的区别在于只有当JVM实现在创建类的实例时才执行构造器。构造器通常包含字段初始化代码。严格上讲构造方法并不是方法,因为它不会返回任何值。根据参数不同,构造方法又可以分为以下三类。1. 隐式无参构造方法(默认构造方法)在定义类的时候如果没有给类定义一个