1、基本概念
(1)过程与对象都是一种解决问题的思想。
面向过程:强调的是功能行为,一种过程,先干啥,再干啥;
面向对象:将功能封装到对象里,强调的是具备某功能的对象;
(2)面向对象的三个特征:封装(Encapsulation)、继承(Inheritance)、多态(Polymorphism)。
2、类与对象
(1)关系:类是对象的抽象,而对象是类的具体实例
类:表示一个客观世界某类群体的一些基本特征的抽象
对象:是表示一个个具体的东西
(2)类的定义
[修饰符] class 类名
{
1~n个构造方法;
0~n个字段(field);
0~n个方法;
}
1)修饰符:可省略,或是public、final、abstract中的一个
2)构造方法:用来构造类的实例(默认有一个无参的构造方法,得使用new调用)
格式:[修饰符] 构造方法名(形参列表){ 。。。}
修饰符:可省略,或是public、protected、private中的一个
构造方法名:必须与类名相同
【注】:A、其声明处不能有任何返回值类型的声明
B、不能使用return返回一个值;(return;可以)
3)field(成员变量|字段|域):类或对象所包含的数据,对类状态的一种描述
格式:[修饰符] field类型 field名[=默认值];
修饰符:可省略,或是public、protected、private中的一个,static,final
4)方法:类或对象的特征和行为
格式:[修饰符] 方法返回值类型 方法名(形参列表){。。。}
修饰符:可省略,或是public、protected、private中的一个,static,final|abstract
(3)对象的定义、创建和使用
A、格式:类名 对象名称 = new 类名(); //其实是两步操作
类名 对象名称 ; //声明对象
对象名称 = new 类名(); //实例化对象
B、对象名保存在栈内存(访问地址)中,对象的具体内容保存在堆内存中
C、“对象名.对象成员”的方式来操作对象中的内容
访问属性:对象名.属性名;
访问方法:对象名.方法名
(3)匿名对象
定义:不定义变量引用对象,使用new关键字创建对象后直接使用,这样的对象没有名字,所以叫匿名对象。
特点::A、匿名对象只进行一次调用,而且它只在堆内存中开辟空间,而没有在栈内存的引用。当对象对成员进行多次调用时,不能使用匿名对象,必须给对象起名字。B、可作为实际参数进行传递。new Car().show(new Car());
(4)成员变量和局部变量的区别:
1:成员变量直接定义在类中,整个类中都可以访问;局部变量定义在方法中,参数上,语句中,只在所属的区域上有效。
2:成员变量存在于堆内存中,随着对象的产生而存在,消失而消失。局部变量存在于栈内存中,随着所属区域的运行而存在,结束而释放。
3、成员变量都有默认初始值,而局部变量则没有
补充:成员变量初始化
当一个对象被创建时,会对其中各种类型的成员变量自动进行初始化赋值。基本数据类型初始化值为0,引用数据类型初始化值为null。
(5)构造函数 (构造器 == 构造方法)
1)特点:A、方法名与类名相同 B、不用定义返回值类型 C、不需要写return语句
2)作用:给类中的字段进行初始化,可以用来创建对象
3)记住:所有对象创建时,都需要初始化才可以使用。(new都会调用构造函数)
注意事项:一个类在定义时,如果没有定义过构造函数,那么该类中会自动生成一个空参数的构造函数,为了方便该类创建对象,完成初始化。如果在类中自定义了构造函数,那么默认的构造函数就没有了。
一个类中,可以有多个构造函数,因为它们的函数名称都相同,所以只能通过参数列表来区分。所以,一个类中如果出现多个构造函数。它们的存在是以重载体现的。
4)构造函数和一般函数有什么区别呢?
1:两个函数定义格式不同。
2:构造函数是在对象创建时,就被调用,用于初始化,而且初始化动作只执行一次。一般函数,是对象创建后,需要调用才执行,可以被调用多次。
5)什么时候使用构造函数呢?
分析事物时,发现具体事物一出现,就具备了一些特征,那就将这些特征定义到构造函数内。
6)构造代码块和构造函数有什么区别?
构造代码块:是给所有的对象进行初始化,也就是说,所有的对象都会调用一个代码块。只要对象一建立。就会调用这个代码块。构造函数:是给与之对应的对象进行初始化。它具有针对性。
7)Person p = new Person();
创建一个对象都在内存中做了什么事情?
1:先将硬盘上指定位置的Person.class文件加载进内存。
2:执行main方法时,在栈内存中开辟了main方法的空间(压栈-进栈),然后在main方法的栈区分配了一个变量p。
3:在堆内存中开辟一个实体空间,分配了一个内存首地址值。new
4:在该实体空间中进行属性的空间分配,并进行了默认初始化。
5:对空间中的属性进行显示初始化。
6:进行实体的构造代码块初始化。
7:调用该实体对应的构造函数,进行构造函数初始化。()
8:将首地址赋值给p ,p变量就引用了该实体。(指向了该对象)
8)setter方法和构造方法都可以用来初始化字段的值,那么什么时候用构造方法什么时候用setter?
A、当字段的值是和类的对象紧密相关不可分割的时候,用构造方法,就是说我要有这个实例,就必须有这个字段值,就用构造方法。
B、需要初始化的字段值不太多的时候可以用构造方法,如果字段值太多,构造方法的参数列表太。。。了。
C、其他时候都可以用setter方法。