一、面向对象
1
、面向对象:
OO
(
Object Oriented
)
2
、面向对象编程:
OOP
3
、
面向对象具备如下
3
大特征:
封装、 继承、 多态
Java
中的面向对象:
Java
中是
先有类,然后再根据类创建对应的对象。
1、类是具体事物的抽象,相当于模板、图纸,一个对象的描述
2、创建类:
class
类名
{
类的成员;
——成员变量 ——
>>
属性
——成员方法 ——
>>
行为
}
二、对象
1
、对象即是该类事物实实在在存在的个体。
2
、创建对象:
new
关键字
.
可以给对象起名字
Person p = new Person( );
其中
p
就是对象名
p
其实就是一个变量,该变量是
Person
类型的
.
3
、创建对象的目的:
i. 使用对象
如何使用?
——
>>
可以通过对象名
.
的形式操作对象
对象名
.
属性名
=
值
;
设置对象特有的属性(成员变量)
对象名
.
属性名
获取对象特有的属性
对象名
.
成员方法
让对象执行特有的行为(成员方法)
三、
成员变量和局部变量
1
、
局部变量
i.
方法中,参数列表中,语句中
ii.
必须给初始化值,没有初始值,不能使用
iii.
在
栈
内存中
2
、成员变量
i. 属于类的成员,定义在类中
ii. 有默认的初始化值
iii. 在堆内存中
四、匿名对象
1
、通过
new
操作符创建的对象,但是没有给对象起名字
例如:
new Person( );
2
、作用:
匿名对象可以作为方法的实参传递(常用),例如:
= new Car().run();
当对象的方法只想执行一次,使用匿名对象可以简化书写
五、封装
1
、在其他类中禁止使用 对象名
.
成员变量 的形式直接修改对象的属性
.
封装的好处:
提高对象数据的安全性,过滤非法数据
2
、关键字:
private
(私有)
private
修饰的成员变量,如果外界需要访问,就需要在本类中添加公共的
get
和
set
方法。(根据实际情况需要)
public void setXxx (
数据类型 变量名
) {
赋值过程;
}
public
数据类型
getXxx ( ) {
return
属性值;
}
3
、注意:使用
private
修饰成员变量,仅仅是封装一种体现形式而已
函数:一段独立功能的小程序,完成特定任务,函数也是一种封装
六、构造函数
1
、用来给对象初始化的
2
、构造函数也是一个函数(比较特别)
i. 构造函数的函数名和类名相同
ii. 构造函数没有返回值,
和
void
不同
3
、构造函数的细节:
i.
自定义类时,如果没有自定义构造函数,系统会默认提供一个无参的构造函数(是在
javac
编译的时候由编译器完成的)
ii. 自定义类时,如果程序员在类中自定义了构造函数,系统默认的就不再提供
iii. 一个类中可以有多个构造函数,构造函数也是函数的一种,所以构造函数也具备函数重载的特性
iv. 如果一个类中的构造函数
全部是
private
那么
是不能通过
new
来创建对象
的
v. 构造函数用于给对象初始化
在
new
对象时,根据具体的实参,来确定具体的构造函数的执行
4
、构造函数和普通函数的区别:
i. 相同:都是函数,都需要调用才会执行
ii. 不同:
1. 作用:
构造函数是用来给对象初始化的
普通函数是用来完成特定任务的
2. 执行机制:
构造函数创建对象时,
JVM
根据实参来调用,
只执行一次
普通函数需要通过对象来调用才会执行,可以调用多次
七、构造代码块
1
、构造代码块:
在一个类中,以花括号存在:
{ }
2
、作用:
i. 用于给所有对象初始化
ii. 只要创建对象,构造代码块都会执行
3
、构造函数和构造代码块的区别:
i. 构造代码块:
构造代码块优先级
高于
构造函数
只要创建对象,构造代码块就会执行
ii. 构造函数:
构造函数用于给指定的对象初始化,
JVM
会根据具体的实参,确定调用的具体的构造函数
八、
this
关键字
1、作用:
i. 可以用于区分成员变量和局部变量
ii. 调用构造函数
2、局部变量:
i. 在方法中的
ii. 在方法上的
for
循环语句中的变量都是局部变量
iii. 在栈内存中
iv. 随着方法的执行初始化,方法消失,局部变量消失
v. 局部变量必须要有初始化值
3、成员变量:
对象的属性在堆内存中
4、由于局部变量和成员变量重名,导致对象的属性无法初始化:
5、注意:使用this
必须
放在构造函数的第一行
6
、
this
只能
在非静态中(没有
static
修饰的)函数使用
九、
static
关键字
1
、
static
修饰成员变量:
i. 静态成员变量
在方法区中,被所有对象所共享
1. 由于被所有对象共享,只要有一个对象改变静态成员变量的值,所有的对象使用的静态变量值也就都改变了
由于在方法区中,所以可以直接通过
类名
.
静态成员变量
的形式来调用
ii. 原理(理解):
1. 静态成员变量和非静态成员变量的位置:
内存空间不一样:
a) 静态成员变量:依赖于类,在方法区
b) 非静态成员变量:依赖于对象,在堆内存中
2. 静态成员变量和非静态成员变量的生命周期:
生命周期不一样:
a) 静态成员变量,随着类的加载而存在于方法区,类只加载一次
b) 非静态成员变量,随着对象的创建而存在于堆内存中,随着对象的创建而创建,随着对象的消失而消失
只要
new
对象,每个对象都有自己特有的变量(属性)
2
、
static
修饰方法:
成员
方法被
static
修饰,叫做静态方法
2. 特点:
可以不用创建对象,直接通过
类名
.
方法
的形式来调用
3. 静态方法:
a) 静态方法不可以访问非静态成员变量
b) 静态方法可以访问静态成员变量
4. 非静态方法:
非静态成员方法,既可以访问非静态成员变量,也可以访问静态成员变量
5. 总结:
a) 静态方法只可以访问静态成员变量
b) 非静态成员方法,既可以访问非静态成员变量,也可以访问静态成员变量
c) 可以通过私有化静态类的构造方法,达到不允许创建静态类的对象
6. static
方法要注意:
不能出现
this
与
super
关键字
原因:调用静态方法可以使用类名直接调用,这时候有可能在内存中还没有存在着对象
3
、静态代码块
i. 格式:
ii. 作用:
iii. 静态代码块注意细节:
1. 随着类的加载而执行,只执行一次
构造代码块初始化对象,静态代码块就是初始化类的
2. 静态代码块:程序运行加载类,类只加载一次,所以静态代码块也只执行一次
构造代码块,只要创建对象就会执行
十、继承
1
、类与类之间的关系:
i. 部分与组合: has a
关系
人与地址
球队
——
>>
球员
ii. 继承: is a
该种事物是属于某一种事物的其中一种类型 比如:猫——
>>
动物
**
2、
**
没有继承的时候出现了什么问题:
i. 类与类之间的关系无法描述
ii. 出现重复代码
3
、使用:
一个类通过使用extends
关键字来继承另一个类
4
、继承解决的问题:
i. 可以描述了类与类之间的关系
5
、继承要注意的细节:
ii. 父类的私有成员(成员属性、成员方法)不能被子类继承
iii. 父类的构造方法不能被子类继承
iv. 创建子类对象时,会先调用父类的构造函数,子类没有指定的情况下,默认是调用父类无参的构造函数
创建子类对象的时候调用父类的构造方法意义是初始化父类的成员属性
只有真正的存在着关系才会去继承,不要为了减少重复代码而去继承