面向对象简介
面向对象的概述
“面向对象”(英语:Object Oriented,简称OO)是一种以事物为中心的编程思想。
面向对象程序设计(英语:Object-oriented programming,缩写:OOP),是一种程序开发的方法。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。
面向对象时相对于面向过程而已的(c则是一个典型的面向过程的语言),站在面向对象的角度去看问题,你则是对象的动作的指挥者。如果站在面向过程的角度去看问题,你则是动作的执行者。
对象
对象(object)代表现实世界中可以明确标识的一个实体。例如:一个学生、一张桌子、一间教室,一台电脑都可以看做是一个对象。每个对象都有自己独特的状态标识和行为
对象的属性(attribute,或者状态(state)),学生有姓名和学号,该学生特有的姓名和学号就是该学生(对象)的属性。
对象的行为(behavior),是由方法定义,调用对象的一个方法,其实就是给对象发消息,要求对象完成一个动作。可以定义学生对象具备学习的行为。学生对象可以调用学习的方法,执行学习的动作
面向对象的特征
- 封装(encapsulation)
- 继承(inheritance)
多态(polymorphism)
开发的过程:其实就是不断的创建对象,使用对象,指挥对象做事情。
- 设计的过程:其实就是在管理和维护对象之间的关系.
对象的概念
下面举一个例子
现实世界 | 计算机模型 | Java代码 |
---|---|---|
人 | 类/class | class Person() |
小明 | 实例/ming | Person ming = new Person() |
小红 | 实例/hong | Person hong= new Person() |
小军 | 实例/jun | Person jun = new Person() |
class / instance
class 是对象模板
- class 定义了如何创建实例
- class 名字就是数据类型
instance 是对象实例
- instance 是根据class创建的实例
- 可以创建多个instance
- 各个instance类型相同,但各自属性可能不相同
创建实例
public class Person {
public String name;
public int age;
}
public class Main {
public static void main(String[] args) {
// 类型 变量 = new 类型();
Person ming = new Person();
ming.name = "小明";
ming.age = 12;
Person hong = new Person();
hong.name = "小红";
hong.age = 15;
System.out.println(ming.name);
System.out.println(ming.age);
System.out.println(hong.name);
System.out.println(hong.age);
}
}
小明
12
小红
15
- new操作符可以创建一个实例
- 定义一个引用类型变量来指向实例(记住这个严谨的说法)
- 通过变量来操作实例
- 通过变量,字段来访问实例字段
构造方法
- 构造方法可以在创建对象实例时初始化对象实例
- 构造方法名就是类名
- 构造方法的参数没有限制
- 构造方法没有返回值(也没有void)
- 必须用new操作符调用构造方法
默认构造方法
如果一个类没有定义构造方法,编译器会自动生成一个默认构造方法:
- 无参数
- 无执行语句
但是要注意:
如果我们定义了构造方法,编译器就不再自动为我们创建构造方法了
初始化顺序
- 先初始化字段
- 没有复制的字段初始化为默认值:
- 基本类型= 0 引用类型=null
- 再执行构造方法的代码
其它注意事项
- 我们可以定义多个构造方法,编译器通过构造方法的参数数量、位置和类型区分
- 调用其他构造方法的语法是 this
- 当类中没有定义构造函数时,系统会指定给该类加上一个空参数的构造函数。这个是类中默认的构造函数。当类中如果自定义了构造函数,这时默认的构造函数就没有了。
备注:可以通过javap命令验证。 - 在一个类中可以定义多个构造函数,以进行不同的初始化。多个构造函数存在于类中,是以重载的形式体现的。因为构造函数的名称都相同。
那么什么事重载呢 ,
方法重载
例如
public class Hello{
public void hello(String name){
}
public void hello(int age){
}
public void hello(String name, int age){
}
public void hello(int age, String name){
}
}
方法重载(Overload)是指
- 多个方法的方法名相同
- 但各自的参数不同
- 参数个数不同
- 参数类型不同
- 参数位置不同
- 方法返回值类型通常都是相同的
如果多个方法有相同的名字、不同的参数,便产生了重载。编译器必须挑选出具体执行哪个方法,它通过用各个方法给出的参数类型与特定方法调用所使用的值类型进行匹配来挑选出相应的方法。如果编译器找不到匹配的参数,就会产生变异时错误,因为根本不存在匹配,或者没有一个比其他的更好。(这个过程被称为重载解析(overloading resolution))
方法重载的目的:
- 相同功能的方法使用同一名字
- 便于调用