文章目录
1.类和对象2.方法详解
3.可变形参方法
4.构造方法
学习目标

1.类与对象

概述

Java语言是一种面向对象的程序设计语言,而面向对象的思想是一种程序设计思想,我们在面向对象思想的指导下,使用Java语言去设计,开发计算机程序。 这里的对象泛指现实中一切事物,每种事物都具备自己的属性和行为。 面向对象思想就是在计算机程序设计过程中,参照现实中事物,将事物的属性特征、行为特征抽象出来,描述成计算 机事件的设计思想。 它区别于面向过程思想,强调的是通过调用对象的行为来实现功能,而不是自己一步一步的去 操作实现。

特点

面向对象思想是一种更符合我们思考习惯的思想,它可以将复杂的事情简单化,并将我们从执行者变成了指挥者。 面向对象的语言中,包含了三大基本特征,即封装、继承和多态。

什么是类

类:是一组相关属性和行为的集合。 可以看成是一类事物的模板,使用事物的属性特征和行为特征来描述该 类事物。

属性:就是该事物的状态信息。
行为:就是该事物能够做什么。

什么是对象

对象:是一类事物的具体体现。 对象是类的一个实例(对象并不是找个女朋友),必然具备该类事物的属性 和行为。

类与对象的关系

类是对一类事物的描述,是抽象的

对象是一类事物的实例,是具体的

类是对象的模板,对象是类的实体。

事物与类的对比

属性:事物的状态信息。 行为:事物能够做什么。

成员变量:对应事物的属性 成员方法:对应事物的行为

java 面向对象设计 java面向对象程序设计_成员变量


定义类: 就是定义类的成员,包括成员变量和成员方法。

成员变量: 和以前定义变量几乎是一样的。只不过位置发生了改变。在类中,方法外。

成员方法: 和以前定义方法几乎是一样的。只不过把static去掉。

对象的使用格式

创建对象

java 面向对象设计 java面向对象程序设计_java 面向对象设计_02


使用对象访问类中的成员

java 面向对象设计 java面向对象程序设计_java 面向对象设计_03


成员变量默认值

java 面向对象设计 java面向对象程序设计_成员变量_04


扩展(JVM的内存划分):

java 面向对象设计 java面向对象程序设计_java 面向对象设计_05


对象内存图

一个对象,调用一个方法内存图

java 面向对象设计 java面向对象程序设计_构造方法_06


通过上图,我们可以理解,在栈内存中运行的方法,遵循"先进后出,后进先出"的原则。变量p指向堆内存中 的空间,寻找方法信息,去执行该方法。两个对象,调用同一方法内存图

java 面向对象设计 java面向对象程序设计_构造方法_07


对象调用方法时,根据对象中方法标记(地址值),去类中寻找方法信息。这样哪怕是多个对象,方法信息 只保存一份,节约内存空间。

一个引用,作为参数传递到方法中内存

java 面向对象设计 java面向对象程序设计_java 面向对象设计_08


引用类型作为参数,传递的是地址值。

成员变量和局部变量区别

变量根据定义位置的不同,我们给变量起了不同的名字。

java 面向对象设计 java面向对象程序设计_java 面向对象设计_09


在类中的位置不同 重点

成员变量:类中,方法外
局部变量:方法中或者方法声明上(形式参数)

作用范围不一样 重点

成员变量:类中
局部变量:方法中

初始化值的不同 重点

成员变量:有默认值
局部变量:没有默认值。 必须先定义,赋值,最后使用

在内存中的位置不同 了解

成员变量:堆内存
局部变量:栈内存

生命周期不同 了解

成员变量:随着对象的创建而存在,随着对象的消失而消失
局部变量:随着方法的调用而存在,随着方法的调用完毕而消失


2.方法详解

方法声明

[<修饰符>]<返回类型><方法名>([参数列表]){方法体}

方法声明说明:
(1)方法声明包括方法头和方法体两部分,其中方法头包括修饰符,返回类型,方法名和参数列表;方法体包括在花括号内的声明部分和语句部分,用于描述方法的功能。
(2)修饰符,表示方法的访问权限。修饰符有private,缺省访问修饰符,protected和public。
(3)返回类型,为该方法返回的类型,如该方法没有返回值,则方法的返回类型为void。
(4)参数列表,指定在调用时,应该传递的参数的个数和类型。参数列表如果包含对个参数,相邻的参数之间用逗号隔开,此处的参数的定义时并没有分配存储单元,只有在运行时间才分配,所以称为形式参数。方法也可以没有参数,称为无参方法,注意无参方法后面的一对圆括号不能省略。
(5)对于有返回值的方法,方法体中至少有一条return语句,形式为return(表达式)。当调用方法时,表达式的值就是方法的返回值,方法返回值应和表达式值的类型一致。
(6)方法不能嵌套定义,即不能在方法中再声明其他的方法。
在程序中,方法是不可或缺的。通过使用方法可以完成特定的功能,方法一旦定义,就可以在不同的程序中多次调用,这样可以增强程序的可读性和可重用性,提高编程的效率。

方法调用
由于main()方法是程序的入口,如果在类中调用指定方法,则按照如下步骤进行操作:
(1)在类的main()方法中创建可以调用方法的实例。
(2)将实例赋值给指定的引用变量,通过引用“变量.方法名”的形式调用方法。

方法参数传递

参数的传递是指实际参数向形参值的传递的过程。 如果声明方法时包含形参的声明,则调用方法时必须为这些形参指定参数值,调用方法时实际传给形参的参数值被称为实参。

实参是如何传递给方法的?这是由Java方法的参数传递机制所控制的,Java中方法参数传递方式只有一种,即值传递。所谓值传递就是将实参的副本(复制品)传递给形参,而实参本身不会受到任何影响。

java 面向对象设计 java面向对象程序设计_构造方法_10


3.可变形参方法

从JDK1.5之后,Java允许定义形参个数可变的参数,即允许为方法指定数量不确定的形参,如果在定义方法时,在最后一个形参的类型后增加“…”,则声明该形参可以接受多个参数值,多个参数值被当成数组传入。
可变方式的声明格式如下:

[<修饰符>]<返回类型><方法名>(变量类型...变量名){方法体}

变量类型为任意数据类型,在变量类型和变量名之间用“…”表示。其中“…”不是省略号,而是定义参数类型的方式。
可变参数的特点如下:
只能出现在参数列表的最后。
“…”位于变量类型和变量名之间,前后有无空格都可以。
调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数。
可变参数与数组参数的区别:
定义方法不一样
(1)采用可变个数形参来定义方法,代码如下:

public static void testVarargs(String...users);

(2)采用数组形参来定义方法,代码如下:

public static void testArray();

调用方法不一样
(1)采用可变个数形参的方法调用,代码如下:

testVarargs("张小文","王艺儒","李晨生");

(2)采用数组形参的方法调用,代码如下;

testArray(new String[]{"张小文","王艺儒","李晨生"});

参数位置不同
如果有多个形参,数组形式的参数可以处于形式列表的任意位置,但是个数可变的形参处于形参列表的最后,即一个方法中最多只能有一个个数可变的形参。
对比这两种方法,很显示第一种形式是更加简洁。实际上,即使是采用形参个数可变的形式定义方法,调用该方法时一样可以为个数可变的形参传递一个数组。


4.构造方法

结构方法的定义
在类定义中有一个类特殊的方法,此类方法的名称与类名完全一致,在创建对象时用于对成员变量进行初始化,此类方法被称为构造方法。

构造方法的特点
创建一个构造方法(Construction method)和创建一个其他方法的过程是相同的,但需要注意的是,类中的结构方法的名称必须与此类的名称完全相同;此外,结构方法不能有返回值,在结构方法的名称面前也不使用void关键字进行修饰。
那么,是不是在类中必须定义一个 构造方法呢?答案是否定的。因为,如果在类中没有创建用户自定义的构造方法,Java在对源文件进行编译时,会提供一个缺省默认的构造方法,缺省的构造方法没有参数,因此无法对成员变量进行初始化。但需注意的是,如果类中有了用户自定义的构造方法后,Java 就不会给出缺省的构造方法。所以,用户如果想在程序中继续使用无参的构造方法,就必须在类中再定义一个 无参数的构造方法。实际上,构造方法是可以重载的,即可以在一个类中创建多个同名但参数不一样的构造方法。