面向对象&面向过程
面向对象思想:
- 是一种分类思维,将需要考虑具体的问题做哪些分类,然后在对这些分类进行单独研究,也就是说对某个分类下的细节步骤进行面向过程的研究。
- 面向对象处理需要多人协作处理的问题。
面向过程思想:
- 按部就班,按照步骤一步一步进行操作
总结:
- 从宏观上讲,整体的去分析,需要面向对象的思维方式,但是从微观上来讲,仍然是从面向过程去处理。
什么是面向对象:
-
面向对象编程(
OOP
) -
面向对象编程的本质是:以类的方式组织代码,以对象的组织(封装)数据
-
抽象
-
三大特性:
-
封装
-
继承
-
多态
-
-
从认知角度,先有对象后有类,对象,是具体的事物,类,是抽象的,是对对象的抽象
-
从代码运行角度考虑是先有类后有对象。类是对象的模板。
值传递与引用传递
类和对象的关系
类是一种抽象的数据类型,它是对某一类事物的整体描述及其定义,但是并不代表某一个具体的事物
-
动物、植物、电脑…
-
Person类、Pet类、Car类等,这些类都是用来描述、定义某一类具体的事物应该具备的特点和行为
对象是抽象概念的具体事例
-
张三就是人的一个具体实例,张三家里的旺财就是狗的一个具体实例。
-
能够体现出特点,展现出功能的是具体的实例,而不是一个抽象的概念。
创建与初始化对象
-
使用new关键字创建对象
-
使用new关键字创建的时候,除了分配内存空间之外,还会给创建好的对象进行默认的初始化以及对类中构造器的调用
-
类中的构造器也称为构造方法,是在进行创建对象的时候必须要调用的。并且构造器有一下两个特点:
-
1.须和类的名字相同
-
2. 必须没有返回类型,也不能写void
-
构造器
-
1.和类名相同
-
2.没有返回值
作用:
-
1.
new
本质在调用构造方法 -
2.初始化对象的值
注意点:
-
1.定义有参构造之后,如果想使用无参构造,显示的定义一个无参的构造
-
this.属性 -> 调用本身类对象的属性
堆:
- 堆里面有个特殊系列是方法区,一般存储创建出来的对象
栈
- 栈里面存储的一般是方法、和一些变量的引用
封装:
作用:
-
1.提高程序的安全性,保护数据
-
2.隐藏代码的实现细节
-
3.统一接口
-
4.系统可维护增加
-
5.属性私有化,get/set方法
继承:
-
继承的本质是对某一批类的抽象,从而实现对现实更好的建模
-
extends“扩展”。子类是父类的扩展。
-
Java中类只有单继承,没有多继承
-
继承是类和类之间的一种关系。除此之外,类和类之间的关系还有依赖、组合、聚合等。
-
继承关系的两个类,一个为子类(派生类),一个为父类(基类)。子类继承父类,使用关键字extends来表示。
-
子类和父类之间,具体的关系是“is a".
-
Object类
-
super:
- 1.
super
调用父类的构造方法,必须在构造方法的第一个 - 2.
super
必须只能出现在子类的方法或者构造方法中! - 3.
super
和this不能同时调用构造方法! - 4.在无参构造中,会默认继承super()父类的构造方法!
- 1.
-
this
-
代表的对象不同:
- this:本身调用者这个对象
- super:代表父类对象的应用
-
前提
-
this:没有继承也可以使用
-
super:只能在继承条件才可以使用
-
-
构造方法
- this():本类的构造
- super():父类的构造
-
-
方法重写:
-
需要有继承的关系,子类重写父类的方法!
-
1.方法名必须相同
-
2.参数列表必须相同
-
3.修饰符:范围可扩大:public>Protected>Default>private
-
4.抛出的异常:范围,可被缩小,但不能扩大
-
5.重写,子类的方法和父类必须一致:方法体不同。
-
为什么需要重写:
- 1.父类的功能,子类不一定需要,或者不一定满足!
-
静态方法与非静态方法区别
- 方法的调用只和左边,定义的数据类型有关
静态方法和非静态方法的区别:
-
1、静态方法属于类所有,类实例化前即可使用;
-
2、非静态方法可以访问类中的任何成员,静态方法只能访问类中的静态成员;
-
3、因为静态方法在类实例化前就可以使用,而类中的非静态变量必须在实例化之后才能分配内存;
-
4、static内部只能出现static变量和其他static方法!而且static方法中还不能使用this等关键字,因为它是属于整个类;
-
5、静态方法效率上要比实例化高,静态方法的缺点是不自动进行销毁,而实例化的则可以做销毁;
-
6、静态方法和静态变量创建后始终使用同一块内存,而使用实例的方式会创建多个内存。
主要区别:静态方法在创建对象前就可以使用了,非静态方法必须通过new出来的对象调用。
多态
-
即同一个方法可以根据发送对象的不同而采用多种不同的行为方式。
-
一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多(父类,有关系的类)
-
多态存在的条件
- 有继承关系
- 子类重写父类方法
- 父类引用指向子类对象
- 注意:多态是方法的多态,属性没有多态性
- 1.
static
方法:属于类,他不属于实例 - 2.
final
常量 - 3.
private
方法 - 4.类型转换异常:
ClassCastException
- 5.父类型,可以指向子类,但是不能调用子类独有的方法
- 6.对象能执行哪些方法,主要看对象左边的类型,和右边关系不大!
- 7.子类重写了父类的方法,执行子类的方法
- 1.
-
instanceof(类型转换)引用类型,判断一个对象 是什么类型
- 1.父类引用指向子类的对象
- 2.把子类转换为父类,向上转型;
- 3.把父类转换为子类,向下转型:强制转换
- 4…方便方法的调用,减少重复代码!
Static关键字详解
- 在一个类创建对象时,静态代码块最先加载,并只执行一次,接下来是匿名代码块可以赋一些初值,最后是构造方法
抽象类
- abstract :extends 单继承
- 抽象方法,只有方法名字,没有方法的实现!
- 1.不能new这个抽象类,只能靠子类去实现它:约束!
- 2.抽象类中可以写普通方法
- 3.抽象方法必须在抽象类中
- 抽象类可以有构造方法,只是不能直接创建抽象类的实例对象而已。在继承了抽象类的子类中通过super()或super(参数列表)调用抽象类中的构造方法
接口的定义与实现
-
接口就是规范,定义的是一组规,接口的本质是契约。
-
声明类的关键字是class,声明接口的关键字是interface
-
作用:
-
1.约束
-
2.定义一些方法,让不同的人实现
-
3.
public abstract
-
4.
public static final
-
5.接口不能被实例化,接口中没有构造方法
-
6.
implements
可以实现多个接口 -
7.必须重写接口中的方法
-
内部类
异常
-
什么是异常
- 异常指程序运行中出现的不期而至的各种状况:如文件找不到、网络连接失败、非法参数等。
- 异常发生在程序运行期间,他正常的影响了程序执行流程。
-
异常体系结构
-
Java把异常当做对象来处理,并定义一个基类
java.lang.Throwable
作为所有异常的超类。 -
在Java
API
中已经定义了许多异常类,这些异常类分为两大类,错误 Error和异常 Exception。
-
-
-
Error
-
Error类对象由Java虚拟机生成并抛出,大多数错误与代码编写者所执行的操作无关。
-
Java虚拟机运行错误,当
JVM
不再有继续执行操作所需要的内存资源时,将出现OutOfMemoryError
。这些异常发生时,Java虚拟机一般会选择线程终止; -
还有发生在虚拟机试图执行应用时,如类定义错误、连接错误。这些错误是不可查的,因为他们在应用程序的控制和处理能力之外,而且绝大多数是程序运行时不允许出现的状况。
- Exception
- 在Exception分支中有一个重要的子类
RuntimeException
(运行时异常)ArrayIndexOutBoundsRxception
(数组下标越界异常)NullPointerException
(空指针异常)ArithmeticException
(算术异常)MissingResourceExcption
(丢失资源)ClassNotFoundException
(找不到类)等异常,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理
- 在Exception分支中有一个重要的子类
- Exception
-
Java异常处理机制
-
抛出异常
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6BXSlAlC-1638233784439)(C:\Users\Admini
strator\AppData\Roaming\Typora\typora-user-images\1634692484699.png)]
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6BXSlAlC-1638233784439)(C:\Users\Admini
-
捕获异常
-
异常处理5个关键字
- try、catch、finally、throw、throws
-
-
处理异常
-
自定义异常
-
总结
什么是方法
- 何谓方法
- Java方法是语句的一个集合体,一起去执行一个功能。
- 方法解决一类问题
- 方法包含在类或对象中
- 方法在程序中被创建,在其他的地方被引用
- 方法的定义及调用
- 方法重载
- 方法名称必须相同
- 参数列表必须不同(个数不同、或类型不同、参数排列排序不同等)
- 方法的返回类型可以相同也可以不同
- 仅仅返回类型不同不足以成为方法的重载
- 命令行传参
- 可变参数
- 递归*
- 本质就是方法调用方法本身
- 递归结构包括两个部分:
- 递归头:什么时候不调用递归方法。如果没有头,将陷入死循环。
- 递归体:什么时候需要调用自身方法。
数组:
-
1.数组概述
- 数组是相同类型数据的有序集合
- 每个数据称作一个数组元素,每个元素可以通过一个下标来访问。
-
2.数组声明创建
-
首先必须声明数组变量,才能在程序中使用数组,下面是声明数组变量的方法:
-
Java语言使用new操作符来创建数组,语法如下
-
-
dataType[] arrayRefar = new dataType[arraySize]
-
数组的元素是通过索引访问的,驻足索引从0开始
-
获取数组的长度:
arrays.length
-
3.数组使用
-
4.多维数组
-
5.
Arrays
类 -
6.稀疏数组
内存分析:
- Java内存分析:
三种初始化
-
静态初始化
int[] a = {1,2,3}
Man[] mans = {new Man(1,1),new Man(2,2)};
-
动态初始化
int[] a = new int[2];
a[0] = 1;
a[1] =2;
-
数组的默认初始化
数组是引用类型,它的元素相当于类的实例变量,因此数组一经分配空间,其中的每个元素也被照样实例变量同样的方式被隐式初始化。
数组的4个基本特点:
- 长度是确定的,数组一旦被创建,它的大小就是不可以改变的
- 元素必须是相同类型,不允许出现混合类型
- 数组中的元素可以是任何数据类型,包括基本类型和引用类型
- 数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。
- 数组本身就是对象,Java找那个对象是在堆中的,因此数组无论保存原始类型还是其他类型,数组对象本身就是在堆中的。