面向对象
面向过程(POP)和面向对象(OOP)
二者都是一种思想,面向对象是相对于面向过程而言的。面向过程,强调的是功能行为,以函数为最小单位,考虑怎么做。面向对象,将功能封装进对象,强调具备了功能的对象,以类/对象为最小单位,考虑谁来做。面向对象更加强调运用人类在日常的思维逻辑中采用的思想方法与原则。
类
对一类事物的描述,是抽象的、概念上的,是现实世界在计算机中的反映,将数据(属性/成员变量)和对这些数据的操作(行为/方法)封装在一起,但是并没有开空间。
对象
是实际存在的该类事物的每个个体,称为实例instance,占有实际空间。
类和对象的使用
- 创建类,设计类的成员
- 创建类的对象
- 通过“对象.方法”或者“对象.属性”调用对象的结构。
- 本质就是***以类的方式组织代码,以对象的组织封装数据***
面向对象的三大特性
- 封装:将数据和方法封装成类,将数据隐藏,只留接口进行访问。属性私有,get/set
- 继承:本质是对某一批类的抽象,extends,子类继承父类的属性和方法,Java中只有单继承,没有多继承。它是类和类之间的关系,除此之外还有依赖、组合、聚合等。显示调用父类的构造器必须在子类构造器的第一行。final修饰的类不能被继承。
- 多态:同一个方法,不同的对象调用会有不同的结果,一个对象的实际类型是确定的,但是可以指向对象的引用的类型有很多。
- 多态存在的条件:有继承关系、子类重写父类方法、父类引用指向子类对象,通过父类new子类,多态是方法的多态,和属性无关。
面向对象分析方法
- 根据问题需要,选择问题所针对的现实世界中的实体。现有对象,再将对象的特征抽象成类。
- 从实体中寻找解决问题相关的属性和功能,这些属性和功能就形成了概念世界中的类。
- 把抽象的实体用计算机语言进行描述,借助某种程序语言,把类构造成计算机能够识别处理的数据结构。
- 将类实例化成计算机世界中的对象。
成员变量和局部变量
- 成员变量(属性)直接定义在类的{ }内的,而局部变量声明在方法内、方法形参、代码块内、构造器形参、构造器内部的变量
- 属性可以在声明时可以使用权限修饰符指明其权限,而局部变量是不可以使用权限修饰符的。
- 属性是有默认初始化值的,局部变量没有默认初始化值,使用前一定要显示赋值。
- 特别地,形参在调用时赋值即可。
- 非static属性加载到堆空间中,局部变量加载到栈空间中,static属性加载到方法区
return的作用
- 结束方法。
- 针对有返回值类型的方法,return 数据或者为空。
- return关键字后面不可以声明执行语句。
内存中,引用类型的变量,只可能存储两类值:null或者地址值(包含变量的类型)
值传递机制
Java方法的参数传递方式只有一种:值传递,即将实际参数值的副本(复制品)传入方法内,而参数本身不受影响。
- 形参是基本数据类型:将实参基本数据类型变量的“数据值”传递给形参。
- 形参是引用数据类型:将实参引用数据类型变量的“地址值”传递个形参。
方法调用
- 静态方法可以直接 类名.方法调用,static是和类一起加载的。
- 非静态方法需要进行实例化,用 对象.方法调用
new关键字
使用new关键字串讲对象的时候,除了分配内存空间以外,还会给出啊剑豪的对象进行默认的初始化,以及对类中构造器的调用。
类构造器
也称为构造方法,实在进行创建对象的时候必须调用的
- 必须和类名相同
- 必须没有返回值,也不能写void
- 默认有隐式无参构造器
- 一旦定义了有参构造器,无参构造器就必须显示定义
- 我们可以显示编写构造器初始化一些默认值,会在实例化对象的时候调用。
this VS super
super
- 调用父类的构造方法,必须在构造方法法的第一行
- 只能出现在子类的方法或者构造方法中。
- super和this不能同时调用构造方法
- this:本身调用者这个对象
- super:代表父类对象的应用
方法重写
只和非静态方法有关,子类重写父类的public方法
- 方法名相同
- 参数列表必须相同
- 修饰符可以扩大但不能缩小
- 抛出的异常可以被缩小但不能扩大
- 方法体不同
- 重写的原因:父类的功能子类不一定需要或满足
抽象类/抽象方法
使用abstract修饰,抽象方法没有方法体,抽象类的抽象方法需要在子类里实现,它不能实例化,只能通过子类去实现。抽象类只是约束。
接口
-
只有规范,定义的是一组规则无法写方法,约束和实现分离,需要一个实现类,implements。
-
接口中的所有定义都是抽象的public abstract,定义时可以直接些返回值类型、方法名、参数列表
-
接口中的定义的属性都是静态常量,public static final修饰的,通常不这么用。
-
实现了接口的类,必须重写接口的方法。
-
Java时单继承的,但是可以利用接口来实现多继承
内存分析
注:以上为学习记录,如有错误,烦请指出,谢谢!