面向对象【思想、概念、构造方法、构造代码块】
1、面向对象思想
1.1、概述
面向对象是相对于面向过程
而言的,面向过程强调的是其功能
,而面向对象则强调的是将功能封装成对象
。
1.2、思想
-
(1)符合人们思考的思维方式;
-
(2)复杂的事情简单化;
-
(3)将程序员从执行变成设计指挥;
比如我要达到某种结果,我就寻找能帮我达到该结果的功能的对象,如我要洗衣服我就买洗衣机,至于怎么洗我不管。
再比如我要吃饭,面向过程就是我自己买菜自己做,面向对象就是去面馆吃,至于怎么做就是面馆的事,我不用管。
1.3、特征
封装:
隐藏了对象的属性,实现方法等,只对外提供公共访问的方式。
继承:
多个类中存在相同属性或行为
时,将这些内容抽取到一个单独的类中,那么多个类无需再定义,这些属性或行为只需继承那个类
就可以了。
多态:
父类或者接口引用
指向子类对象。
2、类和对象
2.1、类
对现实世界中某类事物的描述是抽象的,概念上的定义。
2.2、对象
指事物具体存在的某一个个体。
2.3、类和对象的区别
一个对象就可以理解为某一类中的一个个体。
3、成员变量和局部变量
变量类型 | 作用域 | 存储位置 | 初始值 |
---|---|---|---|
成员变量 | 针对整个类都有效(定义在类中) | 与对象保持一致,随着对象创建而存在,随着对象的消失而消失,存在于堆中 | 有默认的初始值 |
局部变量 | 只针对某一部分或某一个范围有效(即定义方法或语句体中) | 在方法被调用或者语句被执行的时候存在,存在于栈中。当方法或者语句执行完后,就会随着方法弾栈而自动释放 | 没有默认的初始值,在试用之前要赋值 |
4、匿名对象
概念:
匿名对象就是没有名字的对象,是对象的一种简写形式。匿名对象可以简化代码。
应用场景:
(1)只调用一次类中的方法;如: Car c = new Car();c.run();
—> new Car().run();
(2)可以作为实际参数在方法传递中使用。
5、构造函数(构造方法)
5.1、概念
从字面上理解即为构建创造时用的函数,即就是对象创建时要执行的函数
。既然是对象创建时要执行的函数,那么只要在new对象时
,知道其执行的构造函数是什么,就可以在执行这个函数的时候给对象进行属性赋值。
构造函数的格式:
修饰符 构造函数名(参数列表)
{
}
5.2、特点
(1)构造方法名与类名相同;
(2)没有返回值;
(3)没有返回类型。
5.3、作用
构造方法是用于创建对象,并对其进行初始化赋值,对象已建立就自动调用相应的构造方法(函数)。
5.4、构造函数调用和内存图解
在描述一个事物的时候,同时也描述了构造函数,这个构造函数是如何执行的呢?构造函数是专门用来创建对象的,也就是在new对象时要调用构造函数。现在来看看如何调用构造函数。
class Person
{
//Person的成员属性age和name
private int age;
private String name;
//Person的构造函数,拥有参数列表
Person(int a , String nm)
{
//接受到创建对象时传递进来的值,将值赋给成员属性
age = a;
name = nm;
}
public void speak()
{
System.out.println("name="+name+",age="+age);
}
}
class PersonDemo
{
public static void main(String[] args)
{
//创建Person对象
//Person p = new Person();
// 定义了其他的构造方法 空构造就没有了Person()
//上述代码编译报错,原因是在Person类中没有Person()这样的构造函数
//创建Person对象,并明确对象的年龄和姓名
Person p2 = new Person(23,"张三");
p2.speak();
}
}
上述代码演示了创建对象时构造函数的调用。即在创建对象时,会调用与参数列表对应的构造函数。
图解说明:
- 首先会将
main
函数压入栈中,执行main函数中的new Person(23,"张三")
; - 在
堆内存
中分配一片区域,用来存放创建的Person对象,这片内存区域会有属于自己的内存地址(0x88
)。然后给成员变量进行默认初始化(name = null,age = 0)。 - 执行
构造函数
(这里省略部分知识,后面讲解)中的代码(age = a ; name = nm;),这段代码执行结束后,成员变量age和name的值已经改变。此步骤也称为构造函数初始化。执行结束之后构造函数弹栈,Person对象创建完成。将Person对象的内存地址0x88赋值给p2。
5.5、注意事项
(1)如果一个自定义类没有构造方法
,系统会默认给出无参构造方法
;
(2)如果一个自定义类提供了有参构造方法
,系统便不在给出无参构造方法
;
(3)一般情况下,我们自定义类时,也给出无参构造方法
。
5.6、构造函数(构造方法)与普通函数(成员函数)的区别
格式区别 | 作用区别 | 调用区别 | |
---|---|---|---|
构造函数(构造方法) | 与类名相同 ,但没有返回类型 和返回值 | 主要用于创建对象 ,并进行初始化值 | 是在创建对象时被调用,一个对象建立只调用一次 相应的构造方法 |
普通函数(成员方法) | 可以任意方式起名,必有返回值类型 ,可以没有返回值(void) | 主要用于完成某项特定的功能 | 是由创建好的对象调用,并且可以多次调用 |
问题:
有了构造函数之后可以对对象的属性进行初始化,那么还需要对应的set和get方法吗?
需要相应的set和get方法,因为对象在创建之后需要修改
和访问
相应的属性值时在,这时只能通过set或者get方法来操作。
6、构造代码块
概念:
直接写在类中的代码块:优先于构造方法执行,构造代码块用于给所有对象初始化用,每创建一次对象就会执行一次构造代码块。
作用:
给对象进行初始化,对象一建立就执行,而且优先于构造方法执行
。
构造代码块和构造方法的区别:
构造代码块:
给所有不同对象的共性进行统一初始化。
构造方法:
给对应的对象进行初始化。
问题:“==”和“equals”的区别
:
- 如果比较两个
基本数据类型
的数值是否相等,则用“==”来比较; - 如果比较两个
引用变量对象
的值是否相等,则用“equals()”方法来比较; - 如果比较两个
引用变量是否指向同一对象
,则使用“==”来比较; - 对于自定义的类,应该根据
重写
其父类或Object类中的equals()方法
,否则默认的equals()方法功能其实是与“==”相同的
。