面向对象基础
1. 面向对象概述
1.1 概述
- 面向对象(Object
Oriented)是软件开发方法。面向对象的概念和应用已超越了程序设计和软件开发,是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。 - 面向对象是相对于面向过程来讲的,指的是把相关的数据和方法组织为一个整体来看待,从更高的层次来进行系 统建模,更贴近事物的自然运行模式。
面向过程到面向对象思想层面的转变:面向过程关注的是执行的过程,面向对象关注的是具备功能的对象。 - 面向过程到面向对象,是程序员思想上从执行者到指挥者的转变。
1.2 三大思想
面向对象思想从概念上讲分为以下三种:OOA、OOD、OOP
- OOA:面向对象分析(Object Oriented Analysis)
- OOD:面向对象设计(Object Oriented Design)
- OOP:面向对象程序(Object Oriented Programming)
1.3 三大特征
- 封装性:所有的内容对外部不可见
- 继承性:将其他的功能继承下来继续发展
- 多态性:方法的重载本身就是一个多态性的体现
2. 类与对象的关系
- 类表示一个共性的产物,是一个综合的特征,而对象,是一个个性的产物,是一个个体的特征。(类似生活中的图纸与实物的概念。)
- 类必须通过对象才可以使用,对象的所有操作都在类中定义。
- 类由属性和方法组成:
- 属性:就相当于人的一个个的特征,例如:身高、体重、性别、年龄
- 方法:就相当于人的一个个的行为,例如:说话、吃饭、唱歌、睡觉
3. 类与对象的创建
3.1 类的定义格式
class 类名{
成员属性;
成员方法;
}
eg:
class Person{
private int age; //成员属性
public void say(){} //成员方法
}
注意:类型必须编写在.java文件中。一个.java文件中,可以存在N个类,但是只能存在一个public修饰的类(即一个文件只能存在一个主类)。.java文件的文件名称必须与public修饰的类名完全一致。同个包中不能出现相同名称的类!
3.2 属性与方法
属性定义格式:
数据类型 属性名;
eg: int age;
属性定义并赋值的格式:
数据类型 属性名 = 初始值;
eg: int age = 18;
方法的定义格式:
[权限修饰符] 返回值类型 方法名(形式参数列表){
方法体
return 返回值;
}
eg: public boolean say(){
return true;
}
例如(权限修饰符可省略):
int say(){
return 0;
}
(注意:学习完面向对象进阶后,涉及到类的封装时,权限修饰符一般都不省略)
3.4 创建对象格式
创建对象格式:
类名 对象名 = new 类名();
eg: Person p = new Person();
例如:给创建一个对象1并为其起别名对象名2
类名 对象名1 = new 类名();
类名 对象名2 =对象名1;
eg:
Person p1 = new Person();
Person p2 = p1;
对象属性赋值:
对象名.属性名=值;
eg: p.age = 20;
调用类中方法:
对象名.方法名称(实际参数列表);
eg: p.say();
4. 对象创建内存
4.1 栈
Java中栈的存储区域很小,大概2m左右,特点是存取的速度特别快。
- 栈存储的特点是:先进后出
- 存储速度快的原因: 栈内存,通过’栈指针’来创建空间与释放空间!指针向下移动,会创建新的内存, 向上移动, 会释放这些内存!
这种方式速度特别快 , 仅次于PC寄存器! - 栈存储的缺点: 但是这种移动的方式,必须要明确移动的大小与范围,明确大小与范围是为了方便指针的移动,这是一个对于数据存储的限制,存储的数据大小是固定的,影响了程序的灵活性 。
所以我们把更大部分的数据 存储到了堆内存中 - 栈存储的数据是: 基本数据类型的数据以及引用数据类型的引用!
例如:
int a =10;
Person p = new Person();
数据“10”存储在栈内存中,第二句代码创建的对象的引用“p”存在栈内存中
4.2 堆
- 存储的是: 类的对象
Java是一个纯面向对象语言, 限制了对象的创建方式: 所有类的对象都是通过new关键字创建 - new关键字的作用: 告诉JVM ,需要明确的去创建一个新的对象 , 去开辟一块新的堆内存空间。
堆内存与栈内存不同, 优点在于我们创建对象时,不必关注堆内存中需要开辟多少存储空间,也不需要关注内存占用时长!堆内存中内存的释放是由GC(垃圾回收器)完成的。 - 垃圾回收器(GC)回收堆内存的规则:
当栈内存中不存在此对象的引用时,则视其为垃圾 , 等待垃圾回收器回收 ! - 例如:(其中p0将会被回收)
Person p0 = new Person();
Person p1 = p0;
Person p2 = new Person();
5. 构造方法(构造器)
5.1 概述
- 作用: 用于对象初始化。
- 执行时机: 在创建对象时,自动调用
- 特点: 所有的Java类中都会至少存在一个构造方法。如果一个类中没有明确的编写构造方法,则编译器会自动生成一个无参的构造方法,构造方法中没有任何的代码!如果自行编写了任意一个构造器,则编译器不会再自动生成无参的构造方法。
5.2 定义格式
public class Demo{
public static void main(String[] args){
Personp=new Person(可传参数);
}
}
class Person{
public Person(可传参数){可直接调用以下定义的变量}
}
6. 方法的重载(同名方法)
一个类中定义的方法,是允许重载(相同方法名称)。
什么是方法重载:
- 方法名称相同
- 参数列表长度或参数列表类型或(参数类型顺序不同)
注意:与方法的返回值类型无关!
例如:
class Sum{
int sum(int x,int y){
int z = x + y;
return z;
}
double sum(double x,double y){
double z = x + y;
return z;
}
}
注意:类中的构造方法也可以重载!一般设置无参构造方法和有参构造方法。
7. 匿名对象
概念: 没有对象名称的对象就是匿名对象。匿名对象只能使用一次,因为没有任何的对象引用,所以将称为垃圾,等待被GC回收。只使用一次的对象可以通过匿名对象的方式完成,这一点在开发中将经常使用到。
例如:
//一般对象创建
Math m=new Math();
int num=m.sum(100, 200);
//匿名对象创建
int num=new Math().sum(100, 200)