第一章、 面向对象和面向过程的区别java
1、面向过程和面向过程的区别程序员
(1)首先编程思想(举一个贴近生活的例子)算法
面向过程:是遇到一件事时,思考“我该怎么作”,而后一步步实现的过程。他是一我的作所有事情;编程
面向对象:是遇到一件事时,思考“如何把这件事划分红多个小事情,而后每一个小事情让某个对象来作,最后一群对象协力能把事。”安全
(2)代码质量来讲工具
A:面向过程的代码缺少对数据的封装,而且不安全;this
B:面向过程的变量是多个彻底独立的变量, 并非一个总体;操做过程让代码变得复杂,很差维护;操作系统
例如方法中须要多个参数的时候等,面向过程须要定义多个参数,面向对象只须要定义一个对象就会;线程
案例:对象
10. printEmpInfo(emp1Name, emp1Age, emp1Gender, emp1Salary);
14. printEmpInfo(emp1Name, emp1Age,emp1Gender, emp1Salary);
15. }
2、面向对象在工做中对于一个需求的开发思路
(1) 分析须要的对象:
先按照名词提炼问题领域中的对象
(2) 分析对象的属性和方法
(3) 分析问题流程,经过new对象来,调用对于的属性和方法;
3、相关概念
1抽象数据类型
能够理解为:将不一样类型的数
据的集合组成个总体用来描述一种新的事物。
像如上程序中,能够将姓名、年龄、性别、工资这4个不一样类型的数据组成一个总体来描述雇员这个新事物。
4、类和对象的区别
4.1概念
类是对某一类事物的抽象描述;描述多个对象的共同特征,它是对象的模板
对象用于表示现实中该类的具体事物;
例如:动物是类,毛、狗等是对象;
4.2开发使用
类中能够定义事物的属性和行为;
对象是使用new关键字建立出来,经过对象引用就能够调用该对象具体的属性和功能了。
A:基本类型:
做为参数传递时,其实就是将基本类型变量x空间中的值复制了一份传递给调用的方法的变量;
在方法中对于变量的操做,不会影响原来变量的值;
B:引用类型:
当引用变量做为参数传递时,这时实际上是将引用变量空间中的内存地址(引用)复制了一份传递给了方法的引用变量。
这时会有两个引用同时指向堆中的同一个对象。不论是哪个引用改变了引用的所指向的对象的中的值,其余引用再次使用都是改变后的值。
第三章、面向对象三大特征:
1、封装
l 封装概念
n 封装,把对象的属性和方法的实现细节隐藏,仅对外提供一些公共的访问方式
l 封装表现:
n 一、方法:封装的是具体的业务逻辑实现
n 二、类:封装的是对象的属性和行为变量
n 三、变量:使用 private 修饰,这就是变量的封装
n 四、访问控制修饰符:封装的是访问的权限
l 封装的好处:
n 一、提升了代码的复用性。
例如须要某些功能,值须要经过对象调用对于方法就好,而不须要直接写方法的具体算法;
n 二、提升了代码的安全性。
n 隐藏了实现细节,还要对外提供能够访问的方式,便于调用者的使用。这是核心之一,也能够理解为就是封装的概念。
2、继承:
2.1)做用:代码的复用
2.2)父类/基类:共有的属性和行为
子类/派生类:特有的属性和行为
2.3)子继承父以后,子具备:父+子
2.4)传递性、单一继承,多接口实现
3、多态:
1)意义:行为的多态、对象的多态
2)转换向上造型、强制类型转换、instanceof判断
3)多态的表现形式:
重写:根据对象来多态
重载:根据参数来多态
第四章、特殊的操做工具代码
1、This
一、概述
做用:为了解决方法的局部变量和成员变量的混淆;
工做原理:指代当前对象,哪一个对象调用方法指的就是哪一个对象
二、使用位置
2.1使用在方法体中:
this关键字用在方法体中,用于指代调用该方法的当前对象;为了方即可以省略;
简单的说:哪一个对象调用方法,this指的就是哪一个对象。严格来说,在方法中须要经过this关键字指明当前对象
2.2使用在构造方法中
在构造方法中,用来初始化成员变量的参数通常和成员变量取相同的名字,这样会有利于代码的可读性,但此处就必须经过this关键字来区分红员变量和参数了
2.3对于成员变量、方法、构造方法的调用
3使用方式
1)this.成员变量名------------访问成员变量
2)this.方法名()--------------调用方法
3)this()---------------------调用构造方法
四、注意事项
调用其余构造方法的语句必须定义在构造方法的第一行,缘由是初始化动做要最早执行
2、supper
一、super:指代当前对象的父类对象
二、super的用法: 1)super.成员变量名----------访问父类的成员变量 2)super.方法名()------------调用父类的方法 3)super()-------------------调用父类的构造方法
3、package:
1)做用:避免类的命名冲突
2)类的全称: 包名.类名
3)包名能够有层次结构,同包中的类不能同名 4)建议:包名全部字母都小写
4、import:
1)同包中的类能够直接访问 不一样包中的类不能直接访问,若想访问有以下两种方式:
1.1)先import声明类再使用----建议
1.2)类的全称----------------太繁琐,不建议
第五章、对象内存管理
1、背景
1代码的编译运行
在JAVA中,有java程序、虚拟机、操做系统三个层次,其中java程序与虚拟机交互,而虚拟机与操做系统交互。编译好的java字节码文件运行在JVM中。
2存储位置
程序中不管代码仍是数据,都须要存储在内存中
3内存分配原理
java程序所需内存均由JVM进行管理分配,开发者只需关心JVM是如何管理内存的,而无需关注某种操做系统是如何管理内存的,这就保证了java程序的平台无关性。
4内存划分
JVM会将申请的内存从逻辑上划分为三个区域:堆、栈、方法区。这三个区域分别用于存储不一样的数据。
2、内存分类介绍
一、堆内存
1.1概述
3.1.1概念:JVM在其内存空间开辟了一个称为“堆”的存储空间
1.1.2存储内容
(一)存储使用new关键字所建立的对象
(二)成员变量亦在此分配,并赋初始值(根据类型赋值);
注:是基本数据类型的成员变量
1.1.3生命周期
(一)对象:当一个对象没有任何引用时,该对象被视为废弃的对象,属于被回收的范围;开发中就是将该引用赋值为null;
(二)成员变量:从对象在堆中建立开始到对象从堆中被回收结束
1.2内存问题
1.2.1垃圾回收机制
(一)概念:垃圾回收器(Garbage Collection,GC)是JVM自带的一个线程(自动运行着的程序),用于回收没有任何引用所指向的对象
(二)运行原理:GC线程会从栈中的引用变量开始跟踪,从而断定哪些内存是正在使用的,若GC没法跟踪到某一块堆内存,那么GC就认为这块内存再也不使用了,即为可回收的。
(三)应用:java程序员不用担忧内存管理,由于垃圾收集器会自动进行管理
1.2.2 Java程序的内存泄露问题
(一)概念:内存泄露是指,再也不被使用的内存没有被及时的回收,严重的内存泄露会因过多的内存占用而致使程序的崩溃。在程序中应该尽可能避免没必要要的内存浪费。
(二)内存泄漏减小:GC线程判断对象是否能够被回收的依据是该对象是否有引用来指向,所以,当肯定该对象再也不使用时,应该及时的将其引用设置为null,这样,该对象即再也不被引用,属于可回收的范围。
1.2.3System.gc()方法
GC的回收对程序员来讲是透明的,并不必定一发现有无引用的对象就当即回收。通常状况下,当咱们须要GC线程即刻回收无用对象时,能够调用System.gc()方法。此方法用于建议JVM立刻调度GC线程回收资源,但具体的实现策略取决于不一样的JVM系统。
二、栈内存
1.1概述
1.1概念:JVM在其内存空间开辟一个称为”栈”的存储空间
2. 2存放内容
(一)用于存储程序运行时在方法中声明的全部的局部变量、参数等;
注:
局部变量:方法中声明的变量即为局部变量
变量的值:若变量为基本类型,则在栈中存储的就是该变量的值。若变量为引用类型,则在栈中存储的是堆中对象的地址
2.1.3生命周期
JVM会为每个方法的调用在栈中分配一个对应的空间,这个空间称为该方法的栈帧。一个栈帧对应一个正在调用中的方法,栈帧中存储了该方法的参数、局部变量等数据。
当某一个方法调用完成后,其对应的栈帧将被清除,局部变量即失效。
一、 方法区
5.1概述
5.1.1概念:JVM在其内存空间开辟一个称为”栈”的存储空间
5.1.2原理:先会经过类装载器载入类文件的字节码信息,通过解析后将其装入方法区。
5.1.3存放内容
(一)类的各类信息(包括类的类型信息、方法、字节码文件等)都在方法区存储
(二)static变量
(三)常量
5.1.4特征
(一)方法只有一份:多个对象会拥有各自在堆中的空间,但全部实例对象是共用在方法区中的一份方法定义的。意味着,方法只有一份
(二)方法区中包含的都是在整个程序中永远惟一的元素,如class,static变量。
5、程序执行流程
class Person {
private int age;
public int getAge() {
return this.age;
}
public void setAge(int age) {
this.age = age;
}
}
public class PersonDemo {
public static void main(String[] args) {
Person p = new Person();
p.setAge(30);
System.out.println("你们好,今年我" + p.getAge() + "岁");
}
}
下图为程序中内存对象的建立使用过程。
图1-1 内存对象建立使用过程
程序执行流程说明:
一、 先执行main方法(压栈),执行其中的 Person p = new Person();
二、 在堆内存中开辟空间,并为其分配内存地址0x1234,紧接着成员变量默认初始化(age = 0);将内存地址0x1234赋值给栈内中的Person p 变量
三、 继续执行p.setAge(30)语句,这时会调用setAge(int age)方法,在栈中给该方法开辟一个内存空间;将30赋值为setAge方法中的“age”变量;执行this.age = age语句,将age变量值30 赋值给成员变量this.age为30;
四、 setAge()方法执行完毕后(弹栈),将该方法的内存空间释放;回到main()方法,执行输出语句System.out.println(),控制台打印p对象中的age年龄值。