第一章、 面向对象和面向过程的区别
一、面向过程和面向过程的区别
(1)首先编程思想(举一个贴近生活的例子)
面向过程:是遇到一件事时,思考“我该怎么做”,然后一步步实现的过程。他是一个人做全部事情;
面向对象:是遇到一件事时,思考“如何把这件事划分成多个小事情,然后每个小事情让某个对象来做,最后一群对象合力能把事。”
(2)代码质量来说
A:面向过程的代码缺乏对数据的封装,并且不安全;
B:面向过程的变量是多个完全独立的变量, 并不是一个整体;操作过程让代码变得复杂,不好维护;
例如方法中需要多个参数的时候等,面向过程需要定义多个参数,面向对象只需要定义一个对象就会;
案例:
- /** 打印员工信息的方法 */
- public static void printEmpInfo(String name,int age,
- char gender,double salary) {
- System.out.println("--------------------");
- System.out.println("姓名: " + name);
- System.out.println("年龄:" + age);
- System.out.println("性别:" + gender);
- System.out.println("薪水:" + salary);
- }
- ** 打印雇员信息 */
- public static void main (String[ ] args ){
- //雇员1
- String emp1Name = "黄河大虾";
- int emp1Age = 25;
- char emp1Gender = '男';
- double emp1Salary = 8000.00;
- //打印员工信息
10. printEmpInfo(emp1Name, emp1Age, emp1Gender, emp1Salary);
- 11.
- 12. //修改员工工资(增长20%)并打印
- 13. emp1Salary *= 120.0 / 100.0;
14. printEmpInfo(emp1Name, emp1Age,emp1Gender, emp1Salary);
15. }
二、面向对象在工作中对于一个需求的开发思路
(1) 分析需要的对象:
先按照名词提炼问题领域中的对象
(2) 分析对象的属性和方法
(3) 分析问题流程,通过new对象来,调用对于的属性和方法;
三、相关概念
1抽象数据类型
可以理解为:将不同类型的数
据的集合组成个整体用来描述一种新的事物。
像如上程序中,可以将姓名、年龄、性别、工资这4个不同类型的数据组成一个整体来描述雇员这个新事物。
四、类和对象的区别
4.1概念
类是对某一类事物的抽象描述;描述多个对象的共同特征,它是对象的模板
对象用于表示现实中该类的具体事物;
例如:动物是类,毛、狗等是对象;
4.2开发使用
类中可以定义事物的属性和行为;
对象是使用new关键字创建出来,通过对象引用就可以调用该对象具体的属性和功能了。
第二章、基本类型和引用类型作为参数传递
A:基本类型:
作为参数传递时,其实就是将基本类型变量x空间中的值复制了一份传递给调用的方法的变量;
在方法中对于变量的操作,不会影响原来变量的值;
B:引用类型:
当引用变量作为参数传递时,这时其实是将引用变量空间中的内存地址(引用)复制了一份传递给了方法的引用变量。
这时会有两个引用同时指向堆中的同一个对象。不管是哪一个引用改变了引用的所指向的对象的中的值,其他引用再次使用都是改变后的值。
第三章、面向对象三大特征:
一、封装
l 封装概念
n 封装,把对象的属性和方法的实现细节隐藏,仅对外提供一些公共的访问方式
l 封装表现:
n 1、方法:封装的是具体的业务逻辑实现
n 2、类:封装的是对象的属性和行为变量
n 3、变量:使用 private 修饰,这就是变量的封装
n 4、访问控制修饰符:封装的是访问的权限
l 封装的好处:
n 1、提高了代码的复用性。
例如需要某些功能,值需要通过对象调用对于方法就好,而不需要直接写方法的具体算法;
n 2、提高了代码的安全性。
n 隐藏了实现细节,还要对外提供可以访问的方式,便于调用者的使用。这是核心之一,也可以理解为就是封装的概念。
二、继承:
2.1)作用:代码的复用
2.2)父类/基类:共有的属性和行为
子类/派生类:特有的属性和行为
2.3)子继承父之后,子具有:父+子
2.4)传递性、单一继承,多接口实现
三、多态:
1)意义:行为的多态、对象的多态
2)转换向上造型、强制类型转换、instanceof判断
3)多态的表现形式:
重写:根据对象来多态
重载:根据参数来多态
第四章、特殊的操作工具代码
一、This
1、概述
作用:为了解决方法的局部变量和成员变量的混淆;
工作原理:指代当前对象,哪个对象调用方法指的就是哪个对象
2、使用位置
2.1使用在方法体中:
this关键字用在方法体中,用于指代调用该方法的当前对象;为了方便可以省略;
简单的说:哪个对象调用方法,this指的就是哪个对象。严格来讲,在方法中需要通过this关键字指明当前对象
2.2使用在构造方法中
在构造方法中,用来初始化成员变量的参数一般和成员变量取相同的名字,这样会有利于代码的可读性,但此处就必须通过this关键字来区分成员变量和参数了
2.3对于成员变量、方法、构造方法的调用
3使用方式
1)this.成员变量名------------访问成员变量
2)this.方法名()--------------调用方法
3)this()---------------------调用构造方法
4、注意事项
调用其他构造方法的语句必须定义在构造方法的第一行,原因是初始化动作要最先执行
二、supper
1、super:指代当前对象的父类对象
2、super的用法: 1)super.成员变量名----------访问父类的成员变量 2)super.方法名()------------调用父类的方法 3)super()-------------------调用父类的构造方法
三、package:
1)作用:避免类的命名冲突
2)类的全称: 包名.类名
3)包名可以有层次结构,同包中的类不能同名 4)建议:包名所有字母都小写
四、import:
1)同包中的类可以直接访问 不同包中的类不能直接访问,若想访问有如下两种方式:
1.1)先import声明类再使用----建议
1.2)类的全称----------------太繁琐,不建议
第五章、对象内存管理
一、背景
1代码的编译运行
在JAVA中,有java程序、虚拟机、操作系统三个层次,其中java程序与虚拟机交互,而虚拟机与操作系统交互。编译好的java字节码文件运行在JVM中。
2存储位置
程序中无论代码还是数据,都需要存储在内存中
3内存分配原理
java程序所需内存均由JVM进行管理分配,开发者只需关心JVM是如何管理内存的,而无需关注某种操作系统是如何管理内存的,这就保证了java程序的平台无关性。
4内存划分
JVM会将申请的内存从逻辑上划分为三个区域:堆、栈、方法区。这三个区域分别用于存储不同的数据。
二、内存分类介绍
1、堆内存
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系统。
2、栈内存
1.1概述
1.1概念:JVM在其内存空间开辟一个称为”栈”的存储空间
2. 2存放内容
(一)用于存储程序运行时在方法中声明的所有的局部变量、参数等;
注:
局部变量:方法中声明的变量即为局部变量
变量的值:若变量为基本类型,则在栈中存储的就是该变量的值。若变量为引用类型,则在栈中存储的是堆中对象的地址
2.1.3生命周期
JVM会为每一个方法的调用在栈中分配一个对应的空间,这个空间称为该方法的栈帧。一个栈帧对应一个正在调用中的方法,栈帧中存储了该方法的参数、局部变量等数据。
当某一个方法调用完成后,其对应的栈帧将被清除,局部变量即失效。
1、 方法区
5.1概述
5.1.1概念:JVM在其内存空间开辟一个称为”栈”的存储空间
5.1.2原理:先会通过类装载器载入类文件的字节码信息,经过解析后将其装入方法区。
5.1.3存放内容
(一)类的各种信息(包括类的类型信息、方法、字节码文件等)都在方法区存储
(二)static变量
(三)常量
5.1.4特征
(一)方法只有一份:多个对象会拥有各自在堆中的空间,但所有实例对象是共用在方法区中的一份方法定义的。意味着,方法只有一份
(二)方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。
五、程序执行流程
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 内存对象创建使用过程
程序执行流程说明:
1、 先执行main方法(压栈),执行其中的 Person p = new Person();
2、 在堆内存中开辟空间,并为其分配内存地址0x1234,紧接着成员变量默认初始化(age = 0);将内存地址0x1234赋值给栈内中的Person p 变量
3、 继续执行p.setAge(30)语句,这时会调用setAge(int age)方法,在栈中给该方法开辟一个内存空间;将30赋值为setAge方法中的“age”变量;执行this.age = age语句,将age变量值30 赋值给成员变量this.age为30;
4、 setAge()方法执行完毕后(弹栈),将该方法的内存空间释放;回到main()方法,执行输出语句System.out.println(),控制台打印p对象中的age年龄值。