一、面向过程与面向对象
何谓“面向对象”的编程思想?
首先解释一下“思想”。
先问你个问题:你想做个怎样的人?
可能你会回答:我想做个好人,孝敬父母,尊重长辈,关爱亲朋……
你看,这就是思想。这是你做人的思想,或者说,是你做人的原则。
做人有做人的原则,编程也有编程的原则。这些编程的原则呢,就是编程思想。
1.1 面向过程与面向对象
- 面向过程(POP) 与 与 象 面向对象(OOP)
(1)二者都是一种思想,面向对象是相对于面向过程而言的。面向过程,强调的是功能行为,以函数为最小单位,考虑怎么做。面向对象,将功能封装进对象,强调具备了功能的对象,以类/对象为最小单位,考虑谁来做。
(2) 面向对象更加强调运用人类在日常的思维逻辑中采用的思想方法与原则,如:抽象、分类、继承、聚合、多态等。 - 面向对象的三大特征
(1)封装 (Encapsulation)
(2)继承 (Inheritance)
(3)多态 (Polymorphism)
面向对象:Object Oriented Programming
面向过程:Procedure Oriented Programming
简单举个例子来说明一下什么是面向过程?什么是面向对象?
面向过程:
1. 打开冰箱
2. 把大象装进冰箱
3. 把冰箱门关住
面向对象:
人{
打开(冰箱){
冰箱. 开门();
}
操作( 大象){
大象. 进入( 冰箱);
}
关闭( 冰箱){
箱 冰箱. 关门();
}
}
冰箱{
开门(){ }
关门(){ }
}
大象{
进入( 冰箱){ }
}
面向对象的思想概述
- 程序员从面向过程的执行者转化成了面向对象的指挥者
面向对象分析方法分析问题的思路和步骤:
(1)根据问题需要,选择问题所针对的现实世界中的实体。
(2)从实体中寻找解决问题相关的属性和功能,这些属性和功能就形成了概念世界中的类。
(3)把抽象的实体用计算机语言进行描述,形成计算机* 世界中类的定义。即借助某种程序语言,把类构造成计算机能够识别和处理的数据结构。
(4)将类实例化成计算机世界中的对象。对象是计算机世界中解决问题的最终工具。
1.2类和对象
概述
类(Class)和对象(Object)是面向对象的核心概念。
概念
类是对一类事物的描述,是抽象的、概念上的定义
对象是实际存在的该类事物的每个个体,因而也称为实例(instance)。
“万事万物皆对象”
对象
现实世界中,随处可见的一种事物就是对象。对象是事物存在的实体,如人类、书桌、计算机、高楼大厦等等。一般将对象分为两个部分,即静态部分(属性)和动态部分(行为)。
对象的创建与使用
- 创建对象语法: 类名 对象名 = new 类名();
- 使用“名对象名. 对象成员 ”的方式访问对象成员(包括属性和方法
public class Animal {
public int legs;
public void eat(){
System.out.println(“Eating.”);
}
public viod move(){
System.out.println(“Move.”);
}
}
举例:
public class Animal {
public int legs;
public void eat(){
System.out.println(“Eating.”);
}
public viod move(){
System.out.println(“Move.”);
}
}
类
概念:类就是同一类事物的统称,如果将现实世界中的一个事物抽象成对象,类就是这类对象的统称。类是封装对象的属性和行为的载体。在Java语言中,类中对象的行为是以方法的形式定义的,对象的属性是以成员变量的形式定义的,而类包括对象的属性和方法。
类的语法格式
public class Animal {
public int legs;
public void eat(){
System.out.println(“Eating.”);
}
public viod move(){
System.out.println(“Move.”);
}
}
创建Java 自定义类
步骤:
1.定义类(考虑修饰符、类名)
2.编写类的属性(考虑修饰符、属性类型、属性名、初始化值)
3.编写类的方法(考虑修饰符、返回值类型、方法名、形参等)
类的访问机制:
- 在一个类中的访问机制: 类中的方法可以直接访问类中的成员变量 。(: 例外:static 方法访问非 static,编译不通过 。 )
- 在不同类中的访问机制: 先创建要访问类的对象 , 再用对象访问类中定义的成员 。
类的成员之一:属性(field)
语法格式:
修饰符 数据型 类型 属性名 名 = 初始化值 值 ;
说明1: 修饰符
(1) 常用的权限修饰符有:private、缺省、protected、public
(2)其他修饰符:static、final (暂不考虑)
说明2 :数据类型
任何基本数据类型(如int、Boolean) 或 任何引用数据类型。
说明3 :属性名
属于标识符,符合命名规则和规范即可。
举例说明:
public class Animal {
public int legs;
public void eat(){
System.out.println(“Eating.”);
}
public viod move(){
System.out.println(“Move.”);
}
}
变量 的分类:成员变量与局部变量
(1)在方法体外,类体内声明的变量称为成员变量。(2)在方法体内部声明的变量称为局部变量。
注意:二者在初始化值方面的异同:
同:都有生命周期
异:局部变量除形参外,均需显式初始化。
成员变量:
实例变量(不以static修饰);类变量(以static修饰)
局部变量:
形参(方法、构造器中定义的变量)
方法局部变量(在方法内定义)
代码块局部变量(在代码块内定义)
成员变量(属性)和局部变量的区别?
类的成员之二:方法(method)
什么是方法(method 、函数):
(1) 方法是类或对象行为特征的抽象,用来完成某个功能操作。在某些语言中也称为函数或过程。
(2)将功能封装为方法的目的是,可以实现代码重用,简化代码
(3) Java里的方法不能独立存在,所有的方法必须定义在类里。
举例:
public class Animal {
public int legs;
public void eat(){
System.out.println(“Eating.”);
}
public viod move(){
System.out.println(“Move.”);
}
}
方法的声明格式 :
public class Animal {
public int legs;
public void eat(){
System.out.println(“Eating.”);
}
public viod move(){
System.out.println(“Move.”);
}
}
方法的分类:按照是否有形参及返回值
方法通过方法名被调用,且只有被调用才会执行。
注 意:
方法被调用一次,就会执行一次
没有具体返回值的情况,返回值类型用关键字void表示,那么方法体中可
以不必使用return语句。如果使用,仅用来结束方法。
定义方法时,方法的结果应该返回给调用者,交由调用者处理。
方法中只能调用方法或属性,不可以在方法内部定义方法。
构造器(构造方法)
构造器的特征
它具有与类相同的名称
它不声明返回值类型。(与声明为void不同)
不能被static、final、synchronized、abstract、native修饰,不能有return语句返回值
构造器 的作用:创建对象;给对象进行初始化
如:Order o = new Order(); Person p = new Person(“Peter”,15);
如同我们规定每个“人”一出生就必须先洗澡,我们就可以在“人”的构造器中加入完成“洗澡”的程序代码,于是每个“人”一出生就会自动完成“洗澡”,程序就不必再在每个人刚出生时一个一个地告诉他们要“洗澡”了。
语法格式 :
修饰符 类名 ( 参数列表) {
初始化 语句;
}
举 例:
public class Animal {
private int legs;
// 构造器
public Animal() {
legs = 4;
}
public void setLegs(int i) {
legs = i;
}
public int getLegs() {
return legs;
}
}
创建Animal 类的实例:Animal a = new Animal();
调用 构造器 ,将 将legs 初始化为4。
- 根据参数不同,构造器可以分为如下两类:
a.隐式无参构造器(系统 默认 提供)
b.显 式 定义一个或多个 构造器(无参、有参) - 注 意:
a.Java 语言中,每个类都至少有一个 构造器
b.默认构造器的修饰符与所属类的修饰符一致
c.一旦 显式定义了 构造器则系统不再提供默认构造器
d.一个类可以创建多个重载的构造器
e.父类的构造器不可被子类继承
构造器重载
- 构造器一般用来创建对象的同时初始化对象。如
class Person{
String name;
int age;
public Person(String n , int a){ name=n; age=a;}
}
- 构造器重载使得对象的创建更加灵活,方便创建各种不同的对象。
构造器重载举例:
public class Person{
public Person(String name, int age, Date d) {this(name,age);…}
public Person(String name, int age) {…}
public Person(String name, Date d) {…}
public Person(){…}
}
- 构造器重载,参数列表 必须不同
- 构造器重载举例
public class Person {
private String name;
private int age;
private Date birthDate;
public Person(String n, int a, Date d) {
name = n;
age = a;
birthDate = d;
}
public Person(String n, int a) {
name = n;
age = a;
}
public Person(String n, Date d) {
name = n;
birthDate = d;
}
public Person(String n) {
name = n;
age = 30;
}
}
总结:属性赋值过程
截止到目前,我们讲到了很多位置都可以对类的属性赋值。现总结这几个位置,并指明赋值的先后顺序。
- 赋值的位置:
① 默认初始化
② 显式初始化
③ 构造器中初始化
④ 通过“对象.属性“或“对象.方法”的方式赋值 - 赋值的先后顺序:① - ② - ③ - ④
关键字:this的使用
this是什么?
- 在Java中,this关键字比较难理解,它的作用和其词义很接近。
- 它在方法内部使用,即这个方法所属对象的引用;
- 它在构造器内部使用,表示该构造器正在初始化的对象。
-
this 可以调用类的属性、方法和构造器
-
什么时候使用this关键字呢?
当在方法内需要用到调用该方法的对象时,就用this。
具体的:我们可以用this来区分属性和局部变量。
比如:this.name = name; -
使用this ,调用属性、方法
class Person{ // 定义Person类
private String name ;
private int age ;
public Person(String name,int age){
this.name = name ;
this.age = age ; }
public void getInfo(){
System.out.println("姓名:" + name) ;
this.speak();
}
public void speak(){
System.out.println(“年龄:” + this.age);
}
}
1. 在任意方法或构造器内,如果使用当前类的成员变量或成
员方法可以在其前面添加this,增强程序的阅读性。不过,通常我们都习惯省略this。
2. 当形参与成员变量同名时,如果在方法内或构造器内需要使用成员变量,必须添加this来表明该变量是类的成员变量
3.使用this访问属性和方法时,如果在本类中未找到,会从父类中查找
- 使用this 调用本类的构造器
class Person{ // 定义Person类
private String name ;
private int age ;
public Person(){ // 无参构造器
System.out.println("新对象实例化") ;
}
public Person(String name){
this(); // 调用本类中的无参构造器
this.name = name ;
}
public Person(String name,int age){
this(name) ; // 调用有一个参数的构造器
this.age = age;
}
public String getInfo(){
return "姓名:" + name + ",年龄:" + age ;
}
}
4.this可以作为一个类中构造器相互调用的特殊格式
注意:
- 可以在类的构造器中使用"this(形参列表)"的方式,调用本类中重载的其他的构造器!
- 明确:构造器中不能通过"this(形参列表)"的方式调用自身构造器
- 如果一个类中声明了n个构造器,则最多有 n - 1个构造器中使用了"this(形参列表)"
- "this(形参列表)"必须声明在类的构造器的首行!
- 在类的一个构造器中,最多只能声明一个"this(形参列表)"