文章目录
- 面向对象OOP概述
- 一、对象内存相关
- 二、类的成员之一:成员变量(Field)
- 2.1 如何声明成员变量
- 2.2 成员变量 与 局部变量
- 三、类的成员之一:成员方法(Method)
- 3.1 方法调用内存分析
- 3.2 方法的重载
- 3.3 可变个数的形参
- 3.4 形参与实参:参数传递机制->值传递
- 四、 类的成员之一:构造(Constructor)
- 五、OOP三大特性之一:封装
- 如何实现封装
- 六、OOP三大特性之一:继承
- 七、OOP三大特性之一:多态
- 总结
面向对象OOP概述
OOP
由类
为组成单位,
类
的内部由成员
构成,
成员包括:成员变量(Field) 与 成员方法(Method)
类
:相当于一个模板/蓝图
- 相同特征事物的抽象描述(抽象上的人)
对象
:通过这个蓝图 创建(new)出来的 “实例
(instance)” 。
- 可以
new
很多实例,每个实例都是独立的。- 对象是类的一个实例,必然具备该类事物的属性和行为(即方法)。
- (具体的人)
- OOP设计 -> 类的设计 -> 类的成员设计
一、对象内存相关
-
堆 Heap:
new 出来 对象的数据 都放这, 存储对象的数据 -
栈 Stack:
存放 引用类型 地址(指向堆空间数据)
以及 值类型 的具体值 -
方法区 Method Area:
常量、静态变量、class字节码…
二、类的成员之一:成员变量(Field)
2.1 如何声明成员变量
- 位置要求:必须在类中,方法外
- 修饰符 : private、缺省、protected、public 还有 static final
- 初始化值:可以显式赋值,也可以不赋值,使用默认值
4.当一个对象被创建时,会对其中各种类型的成员变量自动进行初始化赋值。
2.2 成员变量 与 局部变量
与类 有关 成员变量
根据类的创建而创建 , 类or 对象 消失而消失
在类内,方法外
与方法 有关 局部变量
方法执行到存在 , 方法执行完毕跟随方法一起消失
在类内的方法内
static
可以将成员变量分为两大类,静态变量
和非静态变量
。
其中静态变量又称为类变量,非静态变量又称为实例变量或者属性。
相同点:
- 变量声明的格式相同: 数据类型 变量名 = 初始化值
- 变量必须先声明、后初始化、再使用。
- 变量都有其对应的作用域。只在其作用域内是有效的
不同点:
- 声明位置和方式
- 实例变量:在类中方法外
- 局部变量:在方法体{}中或方法的形参列表、代码块中
- 在内存中存储的位置不同
- 实例变量:堆
- 局部变量:栈
- 生命周期
- 实例变量:和对象的生命周期一样,随着对象的创建而存在,随着对象被GC回收而消亡, 而且每一个对象的实例变量是独立的。
- 局部变量:和方法调用的生命周期一样,每一次方法被调用而在存在,随着方法执行的结束而消亡, 而且每一次方法调用都是独立。
- 作用域
- 实例变量:通过对象就可以使用,本类中直接调用,其他类中“对象.实例变量”
- 局部变量:出了作用域就不能使用
- 修饰符
- 实例变量:public,protected,private,final等
- 局部变量:final
- 默认值
- 实例变量:有默认值
- 局部变量:没有,必须手动初始化。其中的形参比较特殊,靠实参给它初始化。
三、类的成员之一:成员方法(Method)
方法
是类或对象行为特征的抽象,用来完成某个功能操作。在某些语言中也称为函数或过程。- 将功能封装为方法的目的是,可以实现代码重用,减少冗余,简化代码
- Java里的方法不能独立存在,所有的方法必须定义在类里。
3.1 方法调用内存分析
- 方法没有被调用的时候,都在
方法区
中的字节码文件
(.class)中存储。 - 方法被调用的时候,需要进入到
栈
内存中运行。- 方法每调用一次就会在栈中有一个
入栈
动作,即 - 给当前方法开辟一块独立的内存区域,用于存储当前方法的局部变量的值。
- 当方法执行结束后,会释放该内存,称为
出栈
,如果方法有返回值,就会把结果返回调用处,如果没有返回值,就直接结束,回到调用处继续执行下一条指令。
- 方法每调用一次就会在栈中有一个
- 栈结构:先进后出,后进先出。
3.2 方法的重载
方法名相同,参数列表不同(个数、类型),与修饰符、返回值类型无关
重载方法调用:
JVM通过方法的参数列表,调用匹配的方法。
先找个数、类型最匹配的
再找个数和类型可以兼容的,如果同时多个方法可以兼容将会报错
3.3 可变个数的形参
在JDK 5.0 中提供了Varargs(variable number of arguments)机制。
即当定义一个方法时,形参的类型可以确定,但是形参的个数不确定,那么可以考虑使用可变个数的形参
。
格式:
//JDK5.0:采用可变个数形参来定义方法,传入多个同一类型变量
public static void test(int a ,String...books);
举例:
需求:n个字符串进行拼接,每一个字符串之间使用某字符进行分割,如果没有传入字符串,那么返回空字符串""
public class StringTools {String concat(char seperator, String... args){String str = "";for (int i = 0; i < args.length; i++) {if(i == 0){str += args[i];}else{str += seperator + args[i];}}return str;}
}//测试:StringTools tools = new StringTools();System.out.println(tools.concat('-'));System.out.println(tools.concat('-',"hello"));System.out.println(tools.concat('-',"hello","world"));System.out.println(tools.concat('-',"hello","world","java"));
3.4 形参与实参:参数传递机制->值传递
Java里方法的参数传递方式只有一种:值传递
。
即将实际参数值的副本(复制品)传入方法内,而参数本身不受影响。
- 形参是基本数据类型:将实参基本数据类型变量的“
数据值
”传递给形参 - 形参是引用数据类型:将实参引用数据类型变量的“
地址值
”传递给形参
四、 类的成员之一:构造(Constructor)
new
完对象时,所有成员变量
都是默认值,用构造器
可以为当前对象的某个或所有成员变量直接赋值。
没写构造,java 会提供一个默认的无参构造
构造器的修饰符只能是权限修饰符,不能被其他任何修饰。
比如,不能被static、final、synchronized、abstract、native修饰,不能有return语句返回值。
五、OOP三大特性之一:封装
如何实现封装
实现封装性 即 控制类或成员的可见性
具体修饰的结构:
外部类:public、缺省
成员变量、成员方法、构造器、成员内部类:public、protected、缺省、private
一般成员实例变量都习惯使用
private
修饰,再提供相应的public权限的get/set
方法访问。
对于final
的实例变量,不提供set()方法。
对于static final
的成员变量,习惯上使用public
修饰。
六、OOP三大特性之一:继承
is-a 的关系 , 父类与子类 , JAVA是单继承,多实现
七、OOP三大特性之一:多态
多态(Polymorphism) 在继承的前提条件下,实现多态。 即 “ 父类引用指向子类对象 ”
编译时,看左边;运行时,看右边。
总结
1、在类的属性中,可以有哪些位置给属性赋值?
① 默认初始化
② 显式初始化
③ 构造器中初始化
④ 通过"对象.属性"或"对象.方法"的方式,给属性赋值
-
JavaBean
- 类是公共的
- 有一个无参的公共的构造器
- 有属性,且有对应的get、set方法
-
UML类图
UML
(Unified Modeling Language,统一建模语言),用来描述软件模型和架构的图形化语言。
UML类图
可以更加直观地描述类内部结构(类的属性和操作)以及类之间的关系(如关联、依赖、聚合等)。
- +表示 public 类型, - 表示 private 类型,#表示protected类型
- 方法的写法: 方法的类型(+、-) 方法名(参数名: 参数类型):返回值类型
- 斜体表示抽象方法或类。