目录
一、类与对象
1. 面向对象
1.1 什么是面向对象?什么是面向过程?
面向对象——行为化
- 面向对象就是把整个需求按照特点、功能划分,将这些存在共性的部分封装成类(类实例化后是是对象),创建了对象不是为了完成某一个步骤,而是描述某个事物在解决问题的步骤中的行为。
面向过程——步骤化
- 面向过程就是分析出实际需求所需要的步骤,通过函数(方法)一步步实现这些步骤,然后依次调用。
1.2 面向对象和面向过程有何优缺点?
面向对象:
优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护。
缺点:一般来说,性能比面向过程低。
面向过程:
优点:性能上优于面向对象,因为类在调用的时候需要实例化,开销过大。
缺点:不易维护、复用、扩展。
用途:单片机、嵌入式开发、Linux/Unix等对性能要求较高的地方。
低耦合:模块与模块之间尽可能的独立,两者之间的关系尽可能简单,尽量使其独立地完成一些子功能,这避免了牵一发而动全身的问题。
2. 类与对象
2.1 理解
类:一组相关的属性和行为的集合,是一个抽象的概念。
对象:此类事物的具体表现形式,存在的具体实体,具有明确定义的状态和行为。
2.2 语法结构
类的语法如下:
class 类名{
成员变量类型 成员变量名;
}
例如:定义一个顾客类,其中有成员name,性别sex,年龄age
class Customer{
String name;
String sex;
int age;
}
对象的语法如下:
类名 对象名;
例:
Customer zhangsan
2.3 对象实例化
类名 对象名=new 类名();
例:
Customer zhangsan=new Customer();
或:
Customer zhangsan; ①
zhangsan=new Customer(); ②
说明:①句相当于定义了对象zhangsan,它是一个Customer类型,这称为对象引用,但是还没有给其分配内存,该引用指向空值(null),如图所示;
②句让zhangsan引用指向一个实际的对象,为其分配了相应内存,如图所示。
3. 成员变量
成员变量:在类体的变量部分中定义的变量,也称为字段。
语法格式为:
对象名.成员变量名
例:
zhangsan.name;//对象张三的姓名
zhangsan.sex;//对象张三的性别
zhangsan.age;//对象张三的年龄
注意:在没有赋值时,对象的成员变量中字符串型为空值(null)、int型为“0”。
3.1 成员变量和局部变量有什么区别?
A:在类中的位置不同
-
成员变量:类中方法外
-
局部变量:代码块,方法定义中或者方法声明上(方法参数)
B:在内存中的位置不同
-
成员变量:在堆中
-
局部变量:在栈中
C:生命周期不同
-
成员变量:随着对象的创建而存在,随着对象的消失而消失
-
局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
D:初始化值不同
-
成员变量:有默认值(构造方法对它的值进行初始化)
-
局部变量:没有默认值,必须定义,赋值,然后才能使用
二、成员函数
1. 成员函数的使用
为满足代码一次编写就可以多次使用,在java语言中通常将函数编写在类中,一般称作成员函数。
1.1 简单成员函数
格式如下:
void 函数名称(){
函数内容;
}
调用方法:
对象名.函数名( );
1.2 含参成员函数
格式如下:
void 函数名称(类型1 参数名1,类型2 参数名2,……,类型n 参数名n){
函数内容;
}
调用方法为:
对象名.函数名(参数值列表);
注意:若函数内部的变量和类中的成员变量重名,成员变量将被屏蔽,得不到那些正常效果。此时可以用“this”来标识该变量属于类中变量,而不是局部变量。
this关键字
如果局部变量和成员变量产生命名冲突,用this指明当前对象
构造函数重载,在一个构造函数中用this(形参)调用其他的构造函数。
● 构造函数不能用this()相互调用。
● this()调用构造函数不能在成员函数中调用
● 当前构造函数 不能通过this 调用多个构造函数。
● this()调用必须位于当前构造函数有效代码第一行。
1.3 带返回类型的成员函数
格式如下:
返回类型 函数名称(类型1 参数名1,类型2 参数名2,……,类型n,参数名n){
函数内容;
return 和函数返回类型一致的某个变量或对象;
}
2. 函数参数的传递
2.1 简单数据类型采用值传递
在main函数对成员函数的调用中,所使用的实际参数和成员函数中的形参处于两个不同内存单元中,调用将实参的值拷贝给形参,实参本身不受影响,函数结束返回后,形参被丢弃释放。
2.2 引用数据类型采用引用传递
在方法调用过程中,传递的参数是按引用进行传递,其实传递的引用的地址,也就是变量所对应的内存空间的地址。
3. 函数重载(OverLoad)
3.1 重载的引入
在写程序的过程中,我们经常遇到这种问题:两个数相加,需要一个函数名字getSum,三个数相加需要一个函数名字getSum2。那如果有100个数相加,不是就需要getSum100了?那是不是在调用函数的时候还需要去记住哪个函数名对应多少个参数?这很显然是不可能的了。这个时候就提出一个概念,重载。
3.2 重载的概念
函数重载也叫静态多态。在同一个类中,允许存在一个以上的同名函数,只要它们的参数个数或者参数类型不同即可,这时就形成了重载。重载和返回值类型无关。
3.3 重载函数命名规范
(1)在定义函数时,函数名不能使用关键字,第一个单词的首字母小写,采用驼峰式;
(2)参数的个数,类型,顺序至少有一项不相同;
(3)不能通过访问权限、返回类型、抛出的异常进行重载
4. 函数重写(OverRide)
4.1 函数重写概念
在子类中定义某个方法与其父类有相同的名称和参数;子类对象引用或者子类对象的父类引用使用这个方法时,将调用子类中的定义。
4.2 重写函数使用规范
(1) 方法名、参数、返回值必须相同。
(2) 子类方法不能缩小父类方法的访问权限。
(3) 子类方法不能抛出比父类更多的异常(子类可以不抛出异常)。
(4) 被定义为final的方法不能被重写。
三、构造函数
1. 构造函数的理解
构造函数 ,是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们,即构造函数的重载。
2. 定义规范
(1)函数名称和类的名称相同
(2)不含返回类型
(3)在实例化对象时,必须传入与之对应的参数列表
格式如下:
类名 对象名=new 类名(传给构造函数的参数列表);
注意:
①当一个类的对象被创建时,构造函数会被自动调用。
在对象的生命周期中,构造函数只被调用一次。
②构造函数可以被重载,即一个类中可以定义多个构造函数。
③若在一个类中没有定义构造函数,系统会自动产生一个默认的构造函数,其通过“类名 对象名=new 类名( );”实例化对象。