8 面向对象基础
8.1 面向对象
8.1.1 面向对象的思想
面向对象程序设计(Object Oriented Programming)
- 一切客观存在的事物都是对象,万物皆对象。
- 任何对象,一定具有自己的特征和行为。
- 面向过程 C
- 着重于“过程”
- 优点:性能高
- 缺点:耦合度高、不易于扩展、不易于维护
- 面向对象 Java
- 着重于“对象”
- 优点:耦合度低、易于扩展、易于维护
- 缺点:性能低
8.1.2 什么是程序
程序是为了解决现实问题,模拟现实世界
在java程序猿眼中,世界是由对象组成的
8.2 对象与类
8.2.1 对象
面向对象编程思想(Object Oriented Programming)
- 一切客观存在的事物都是对象,万物皆对象。
- 任何对象,一定具有自己的特征和行为。
8.2.1.1 对象概念
具有明确的行为(方法)和特征(属性|变量)的实体
8.2.1.2 对象包括特征和行为:
- 特征:称为属性,一般为名词,代表对象有什么。
- 行为:称为方法,一般为动词,代表对象能做什么。
8.2.1.3 程序中的对象
现实中的对象多数来自于“模板”,程序中的对象也应该具有“模板”。
8.2.2 类
在一组相同或类似的对象中,抽取出共性的特征和行为,保留所关注的部分。
类的定义
属性:通过变量表示,又称实例变量。
语法:数据类型 属性名;
位置:类的内部,方法的外部。
方法:又称实例方法。 语法: public 返回值类型 方法名(形参){ //方法的主体 } 注意:不再书写static,后续详解。
8.3 创建类与对象
8.3.1 创建类
类的由来:类是由多个具有相同特征和行为的对象抽取出来的
如果定义一个类:
1、确定类名
2、编写成员变量
3、编写成员方法
属性:通过变量表示,又称实例变量。
public class Student { //类:学生对象模板 //编写属性(变量) 成员属性(变量) String name; int age; String gender; double score; //.... //方法 成员方法 //从面向对象阶段起,方法都不要加static public void study() { System.out.println("学习"); } public void sleep() { System.out.println("睡觉"); public void study(){ System.out.println("学生学习..."); } //... }
8.3.2 创建对象
语法:类名 对象名 = new 类名();
Student stu = new Student();
public class TestStudent { public static void main(String[] args) { //创建Student对象 Student stu = new Student(); //使用对象(1、给对象属性赋值和取值 2、调用对象的方法) //给对象属性赋值 stu.name = "张三"; stu.age = 20; stu.gender = "男"; stu.score = 100; //对象属性取值 System.out.println(stu.name); System.out.println(stu.age); System.out.println(stu.sex); System.out.println(stu.score); //调用对象的方法 stu.study(); stu.sleep(); //===================================================== Student stu1 = new Student(); //重复上面的事情 } }
8.4 类和对象的关系
类:定义了对象应具有的特征和行为,类是对象的模板
对象:拥有多个相同特征和行为的实体,对象是类的实例
面向对象就是从具体到抽象,再从抽象到具体的过程
类:模板(一个)-----------创建--------->>>对象:实例(多个)
8.5 实例变量
实例变量
变量:局部变量和成员变量
- 成员变量包含:实例【非静态】变量和类【静态】变量。
8.5.1 实例变量和局部变量的区别
区别 | 局部变量 | 实例(成员)变量 |
位置 | 定义在方法内 | 定义在方法外,类的里面 |
默认值 | 没有默认值 | 系统提供默认值,与之前讲的数组一致 |
作用域 | 所在的{} | 在整个类中 |
重名 | 在不同的作用域可以重名 | 不能重名 |
生命周期 | 方法执行完被销毁 | 当对象被销毁的时候销毁 |
特殊情况:局部变量可以与实例变量重名
/** * 定义在类的里面,方法的外面的属性称之为 实例属性(变量) * 在方法的里面定义的变量称之为局部变量 * 实例变量和局部的区别 * 1、定义的位置不同 * 局部变量:定义在方法中 * 实例变量:定义在类里面,方法的外面 * 2、作用域不同 * 局部变量:只能定义的作用域中使用(就是所在{}内) * 实例变量:在整个类中都可以使用 * 3、默认值不同 * 注意:变量必须要赋值才能使用!!! * 局部变量:没有默认值 * 成员变量:有默认值(整数型:0, 浮点型:0.0, 字符型: 空格,boolean型:false, 引用类型:null) * 4、生命周期不同 * 局部变量:退出作用域就会被销毁 * 成员变量:对象被创建出现,对象被销毁的时候销毁 * * 5、重名问题: * 局部变量:在不同的作用域中可以重名 * 成员变量:不能重名 * 当成员变量和局部变量重名的时候,java遵循就近原则 */
**成员变量的默认值: 整数:0 小数:0.0 字符:\u0000(空字符) **
布尔:false 其他:null
8.6 实例方法
8.6.1 实例方法
实例方法当对象被创建的时候产生(不使用static修饰)
8.6.2方法的重载
有些情况下,对象的同一种行为可能存在多种实现过程。(到底采用哪种实现过程,需要取决于调用者给定的参数。)
重载(Overload):一个类中定义多个相同名称的方法,参数列表不同。要求:方法名称相同、参数列表不同(类型、个数、顺序)。与修饰符、返回值类型无关。调用带有重载的方法时,需要根据传入的实参去找到与之匹配的方法。好处:减少给多个功能相同的方法命名,方便开发人员使用。
方法重载:在一个类中的出现同名方法称之为方法的重载
方法重载的要求:
1、同名不同参(参数类型、个数、顺序)
2、与返回值,访问修饰符无关
调用重载的方法会根据传递的参数不同,去执行不同的方法
重载的好处:方便、灵活、屏蔽使用差异
public void sleep() { System.out.println("正常人睡觉,8小时"); } public void sleep(int hour) { System.out.println("其他人睡觉,"+hour+"小时"); }
方法:包含实例方法(非静态方法)和类方法(静态方法)
包含两部分:方法的声明和方法的实现。
方法的声明:
代表对象能做什么。
组成:修饰符 返回值类型 方法名(形参列表)
方法的实现:
代表对象怎么做:即如何实现对应的功能。
组成:{ 逻辑代码 }
8.7 构造方法
8.7.1 构造方法的概念
构造方法【构造器】:类中的特殊方法,用于创建类的对象
- 作用:创建类的对象(实例化)
- 语法:public 构造方法名(){}
- 构造方法名必须与类名完全一致
- 没有返回值类型
- 特点:
- 1、如果一个类没有编写构造方法, 那么jvm会默认提供一个无参构造方法,但是如果一个类提供了构造方法,那么jvm就不会再提供给这个无参构造方法
- 2、构造方法可以重载
- 3、一个类无论提供多少个构造方法,一定要保留一个无参构造方法
- 场景:
- 给对象的属性赋值
8.7.2 对象创建过程
对象的创建过程:
- 内存中开辟对象空间
- 为各个属性赋予初始值
- 执行构造方法中的代码
8.7.3 对象的内存分配
存储对象的变量p(引用)中保存对象的地址,通过变量中的地址访问对象的属性和方法。
8.7.4 构造方法的重载
构造方法也可重载,遵循重载规则。
8.7.5 构造方法为属性赋值
- 创建对象的同时,将值传入构造方法
- 由构造方法为各个属性赋值
8.8 this关键字
this关键字:
含义:表示当前类的对象,在对象被创建的时候自动产生
作用: 可以调用本类的属性、方法、构造方法
调用本类的属性
语法:this.属性名
在本类中调用本类的属性this关键可以省略
当前成员变量与局部变量重名的时候,this.属性名表示的是成员变量,不加this表示局部变量(就近原则)
调用本类的方法:
语法:this.方法名();
在本类中调用本类的方法this关键可以省略
调用本类的构造方法(只能在构造方法中使用)
语法:this(构造参数);
特点:
避免无穷递归(构造方法循环调用)
调用本类构造方法的时候,this(构造参数)必须写在构造方法的第一行
在构造方法中使用this,表示成员变量
public class Person { String name; int age; public Person() {} public Person(String name, int age) { this.name = name; this.age = age; } }
补充 文档注释常用标签
标签 | 含义 |
@author | 标识一个类的作者例如 @author wgy |
@version | 指定类的版本 |
@see | 指定参考的链接或内容 |
@param | 说明一个方法的参数 |
@since | 指定从哪个JDK版本开始提供支持 |
@return | 说明返回值类型 |
小结:
- 什么是对象:一切客观存在的事物都是对象,万物皆对象,每个对象都有特征和行为。
- 什么是类:定义了对象应具有的特征和行为,类是对象的模板。
- 什么是方法重载:方法名相同、参数列表不同。
- 构造方法:类中用于创建对象的特殊方法,名称与类名相同,没有返回值,不可通过句点调用。
- this关键字:代表当前实例,
通过this.访问实例属性,实例方法,this()/this(xxx)访问本类中的其他构造方法。 - 对象的创建过程:
- Student s=new Student();
- 在堆中开辟空间,属性赋值为默认值
- 执行构造方法,初始化属性
- 把对象的地址赋值给变量