1.面向过程和面向对象
1.1共同概念:
面向过程和面向对象都是对软件分析、设计和开发的一种思想,它指导着人们以不同的方式去分析、设计和开发软件。
1.2 应用领域:
C语言是一种典型的面向过程的语言。java是一种典型的面向对象语言。
1.3 总结:
联系:
面向对象和面向过程思想都是解决问题的思维方式,都是代码组织的方式。
面向过程
面向过程是一种”执行者思维“,解决简单问题可以使用面向过程;
面向过程中数据和对数据的处理方法是分开的;
面向过程是对每一个过程的编写。
面向对象
面向对象是一种”设计者思维“,解决复杂、需要协作的问题可以使用面向对象;
面向对象把数据和对数据的处理方法封装在一起;
面向对象就是把每个对象独立出来,然后表示他们之间的关系。
面向对象的分类
面向对象分析(OOA)
面向对象设计(OOD)
面向对象编程(OOP)
2.构造器
2.1 构造器的4个要点
构造器通过new关键字调用;
构造器虽然有返回值,但是不能定义返回值类型(返回值的类型肯定是本类),不能在构造器里面使用return返回某个值;
如果我们没有定义构造器,则编译器会自动定义一个无参的构造方法。如果已经定义则编译器不会自动添加;
构造器的方法名必须和类名一致。
2.2 方法的重载的条件
形参类型不同、形参个数不同、形参顺序不同;
只有返回值不同不构成方法的重载。如 int a(String str){ } 与 void a(String str){ };
只有形参的名称不同,不构成方法的重载。如 int a (String str){ } 与 int a (String s){ }。
2.3 构造器的重载
形参类型不同、形参个数不同、形参顺序不同;
只有形参的名称不同,不构成构造方法的重载。
3.JVM虚拟机内存模型概念
3.1线程
程序计数器:
在JVM规范中,每个线程都有属于自己的程序计数器。这一块比较小的内存空间,存储当前线程正在执行的java方法的JVM指令地址,以及字节码的行号。
Java虚拟机栈:
属于线程私有区域,每个线程在创建的时候都会创建一个虚拟机栈,生命周期与线程一致,线程退出时,线程的虚拟机栈也回收。
本地方法栈:
与虚拟机类似,本地方法栈是在调用本地方法时使用的栈,每个线程都有一个本地方法栈。
特点:
栈描述的是方法执行的内存模型。每个方法被调用都会创建一个栈桢(存储局部变量、操作数、方法出口);
JVM为每一个线程创建一个栈,用于存储该线程执行方法的信息(实际参数,局部变量);
栈属于线程私有,不能实现线程间的共享;
栈的存储特性是"先进后出,后进先出";
栈是由系统自动分配,速度快,栈是一个连续的内存空间。
3.2堆
创建的所有java对象实例,都会被直接分配到堆上的。堆被所有的线程所共享。在堆上的区域,会被垃圾回收器做进一步划分。
特点:
用于存储创建好的对象和数组(数组也是对象);
JVM只有一个堆,被所有线程所共享;
堆是一个不连续的内存空间,分配灵活,速度慢。
3.3方法区
方法区和堆一样,也是被所有线程所共享,储存着被虚拟加载的元数据(常量,静态变量即时编译器编译后的代码等数据)。
特点:
方法区是Java虚拟机的规范,jdk7之前存在”永久代“ 、 jdk7时,部分去除”永久代“, 静态变量、字符串常量池都挪到了堆内存中、jdk8是”元数据空间“和堆结合起来;
JVM只有一个方法区,被所有线程共享;
方法区实际也是堆,只是用于存储类和常量的相关信息;
用来存放程序中永远不变或者唯一的内容。(class对象) 静态变量、 字符串常量。
3.4运行时常量池
存放两大类常量:
字面量(文本字符串 final常量值) ;
符号引用,存放了一些与编译器相关的常量。
3.5直接内存
直接内存并不属于java规范规定的属于java虚拟机运行时数据区的一部分。
4.this关键字
4.1对象创建的过程
分配对象空间,并将对象成员变量初始化为0或空;
执行属性值的显示初始化;
执行构造方法;
返回对象的地址给相关的变量。
4.2this的本质
引用创建好对象地址
4.3this关键字的常见用法
在程序中产生二义性之处,应使用this来指明当前对象;
普通方法中,this总是指向调用该方法的对象;
构造方法中,this总是指向正要初始化的对象;
使用this关键字调用重载的构造方法,避免相同的初始化代码。但只能在构造方法中用,并且必须位于构造方法的第一句;
this不能用于static方法中。
5.static关键字
5.1使用static修饰
成员变量(静态成员变量)
静态成员变量存在方法区中,被当前类所有的对象所共享,在内存中只有一份;
静态成员变量可以使用(对象名.变量名)的方式进行访问,但是不推荐;
推荐使用(类名.变量名)的方式进行访问。
成员方法(静态成员方法)
静态成员方法可以使用(对象名.方法名)调用,但是不推荐;
推荐使用(类名.方法名)的方式进行调用;
静态方法只能直接调用其他的静态方法。
5.2不使用static修饰
成员变量(实例成员变量)
实例成员变量存储在对内存中,每个对象都有自己独立的实例变量,在内存中可以有多份;
实例成员变量只能使用(对象名.变量名)的方式进行调用。
成员方法(实例成员方法)
实例方法可以直接使用静态和非静态的成员变量;
实例方法只能使用(对象名.方法名)的方式调用;
实例方法可以直接调用其他静态方法和非静态方法。
6.面向对象的三大特征
6.1封装
含义
封装是对类中的属性进行封装。将对象的属性和操作结合为一个独立的整体,并且尽可能隐藏对象的内部实现细节。
优点
提高代码的安全性;
提高代码的复用行;
“高内聚”:封装细节,便于修改内部代码,提高代码可维护性;
“低耦合”:简化代码的调用,方便使用,便于扩展和协作。
修饰符
private:访问权限只能在本类;
default:访问权限在本类或者在本包;
protected:访问权限在本类、本包或者子类中;
public:访问权限在本类、本包、子类、以及全部类。
封装细节
属性:使用private修饰 ;
方法:供子类调用的方法,使用public关键字修饰
提供相应的get/set方法供调用者使用(boolean类型的get()方法,以is开头)
6.2继承
要点及使用
如果定义一个类时,没有使用extends关键字,则它的父类就是:Java.long.Object;
Java中类只有单继承,接口有多继承;
子类继承父类,父类的全部属性和方法都归子类(构造方法除外);
注意:父类中的私有属性和方法是不允许子类访问的;
继承和组合:在子类中创建父类对象,然后通过父类对象调用父类属性和方法。
作用
提高代码复用性,更加容易实现类的扩展;
方便对事务的建模。
方法重写
“>=” : 访问权限,子类大于等于父类
“<=” : 返回值类型和声明异常类型,子类小于等于父类
“==”:方法名、形参列表相同
final关键字
变量:被final修饰的变量,不能被重新赋值.
方法:被final修饰的方法,不能被子类重写,但可以重载
类:被final修饰的类,不能被子类继承
instanceof
规则 : 左边是对象名 中间是instanceof 右边类名
使用 : arr instanceof ArrayList
6.3多态
概念
调用同一方法,由于对象的不同,可能会有不同的行为。
要点
多态是指方法的多态,不是属性的多态;
需要满足的三个条件:继承、重写、父类类型的变量引用子类类型的对象;
父类引用指向子类对象后,用父类类型的变量调用子类重写父类的方法,多态就产生了。
类型的转化
子类转向父类(自动转型)
父类转向父类(强制转型)
7.抽象和接口
7.1抽象
抽象方法
使用abstract修饰的方法,没有方法体,只有声明.
抽象类
包含抽象方法的类一定是抽象类,抽象类中不一定有抽象方法.
要点
有抽象方法的类只能定义成抽象类 ;
抽象类不能被实例化,即不能用new来实例化抽象类;
抽象类可以包含属性、方法、构造方法。但是构造方法不能用来new实例,只能用来被子类调用;
抽象类只能用来被子类继承;
抽象方法必须被子类所实现。
7.2接口
接口和抽象类的区别
抽象类还提供了某些具体的实现,接口不提供任何实现,接口中的所有方法都是抽象方法。接口是完全面向规范的,规定了一批类具有的公共规范。
接口的定义
[访问修饰符] interface 接口名 [extends 父接口1,父接口2…] {
[public static fianl] 类型 常量名 ;
[pubulic abstract ] 返回值 方法名();
}
要点
子类通过implements来实现,并且实现父接口中的所有方法;
接口不能创建实例,可以声明引用变量的类型;
JDK1.8(之前)接口中只能包含静态常量抽象方法,不能有属性、方法和构造方法;
JDK1.8之后,接口中可以包含普通的静态方法和默认方法。在默认方法中可以调用静态方法,静态只能用接口来调用。