面向对象编程包括:
- 面向对象的分析(OOA)
- 面向对象的设计(OOD)
- 面向对象的编程实现(OOP)
面向对象思想:
OOA:把事务分解成对象,并赋予相应的属性与行为,通过多个对象的相互协调解决问题
OOD:对象间无先后顺序,共同作用才构成整个系统。只要设计出几个对象,让他们交互,就可以完成系统功能
面向对象编程思想实际就是一种运用对象,类,继承,封装,聚合,关联,消息,多态性等概念来构造系统的软件开发方法。
面向对象概念
抽象(abstract):根据具体问题概括共同的方面,属性与关系等,舍弃非本质特征。
对象:是系统中用来描述客观事物的一个实体。
类:是一组具有相同属性和行为的对象的抽象,类的作用是用来创建对象,对象是类的一个实例。
类和对象的关系:
抽象和具体的关系
类是创建对象的模板,对象是类的实例。
类是一个静态的概念,类本身不携带任何数据。当没有为类创建任何对象时,类本身不存在于内存空间中。
对象是一个动态的概念。每一个对象都存在着有别于其它对象的属于自己的独特的属性和行为。对象的属性可以随着它自己的行为而发生改变。
类的定义
语法格式:
[类修饰符] class 类名{
类的成员
}
类的成员:
- 成员变量(属性)
- 成员方法(方法)
- 嵌套类
- 代码块
编写规范:
- 类名首字母大写
- 属性和方法第一个单词小写,其他单词首字母大写
属性和方法
属性有默认值,因此可以不用赋值就可以使用。
方法中可以直接使用属性名,对属性进行操作。
属性和局部变量对比
局部变量
- 方法体中声明的变量,方法中的参数或代码块中声明的变量,都是局部变量
- 属性可以和局部变量同名,使用this关键字进行区分
- 属性在整个类中生效,无论在什么地方声明
- 局部变量必须先声明,然后才能使用
对象的创建
什么是对象
- 类 :对某一类事物的描述
- 对象:是实际存在的某类事务的个体
创建语法:
类名 对象名=new 类名();
对象的使用
点运算符
- 引用类的属性:对象名.属性
- 引用类的方法:对象名.方法名(实参)
在类内的方法中,访问本类的属性和方法可以直接访问
创建对象原理
实例化对象的同时操作了栈内存和堆内存
- 在栈内保存对象的首地址,即引用
- 在堆内存保存了对象的
属性 - 对对象的所有操作只能通过引用完成,一旦引用出栈释放没有任何引用指向该对象,对象就变成垃圾
栈stack:栈的存取速度比堆快,效率高。在栈内保存基本数据类型的局部变量和对象的引用值。
堆heap:堆可以保存那些对空间要求较大的变量。如对象的属性和数组的元素。在堆内存中开辟空间,只能通过内存分配操作符号new,凡是出现new的地方必定分配了一个堆内存。
创建匿名对象
- 创建完对象,直接调用这个对象的方法或属性,不定义句柄,这个对象叫匿名对象。
- 如果只使用该对象进行一次方法或属性调用,可以创建匿名对象。
垃圾回收机制
垃圾回收(Garbage Collection,GC),JDK7以后使用GI(Garbage First)机制:
- 当没有对象引用指向原先分配给某个对象的内存时,该内存便成为垃圾。JVM的一个系统级线程会自动释放该内存块。
- 垃圾回收机制作用于堆内存,与栈内存无关。
- 垃圾回收机制是JVM内部运行的一个优先级比较低的后台线程,自动进行垃圾回收。它是保证程序健壮性的主要手段,不用程序员参与,避免了由于程序员忘记回收内存而引起的内存泄露,同时也避免了回收内存带来的代码繁琐。
对象会被回收的情况:
1.对象的引用赋值为null:Person p=new Person(); p=null;
2.使用的匿名对象:new Person().sayhello();
3.超出生命周期,如
for(int i=1;i<100;i++){
Person p=new Person();
}
每结束一次循环,变量p超出生命周期,对象变为垃圾。
构造方法
构造方法(构造器,Constructor)
- 构造方法也是方法,但是它是特殊的方法而已
- 所有的对象都是通过构造器来创建
创建对象
类名 对象名=new 构造方法();
构造器(构造方法/构造器,Constructor)特点:
- 构造方法名必须与类有相同的名称
- 不含返回值类型,也没有void
- 不能在方法中使用return语句返回一个值
构造方法作用:
用来完成对象的创建,即完成对象的实例化
- 在Java中,每个类都至少有一个构造器
- 一个类可以不写出构造方法,编译器会自动的给这个类增加一个构造器,该构造器没有任何参数,称为“空构造器”。
- 如果编译者为该类定义了构造器,系统就不再提供默认的构造器。(如果不写空参构造器,还用空参方式创建对象,会出错)
构造方法的重载
可以跟普通方法一样重载。
构造器可以有多个,用户根据需要选择不同参数的构造器创建对象。
带参数的构造器,常用来对成员变量进行初始化。
构造方法的调用
- 只能在本类的构造方法中,调用其他重载的构造方法
- 使用this关键字,并且代码只能在构造方法的第一行
- 根据实参确定调用的构造方法
封装
隐藏对象的属性和方法的实现细节,只公开对外接口
好处:
- 隐藏实现的细节
- 方便修改的实现
- 只能通过规定方法访问
封装关键字
静态:static关键字
可以修饰的元素:
- 属性:只能修饰属性,不能修饰局部变量
所有对象共享,称为静态变量或类变量 - 方法:不需要实例化,可以直接访问,称为静态方法或类方法
- 代码块:类中有static修饰的,不包含在任何方体中的代码块,称为静态代码块
静态属性
类被载入时创建,只要类存在,static变量就存在
静态变量与非静态变量的关系
静态变量被所有的对象共享,在内存中只有一个副本,它当且仅当类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响
访问方式:
- 直接访问:类名.属性;
实例化后访问:对象名.属性
静态方法
不需实例化,可以直接访问,访问方式
- 直接访问:类名.方法名()
- 实例化后访问:对象名.方法名()
注:静态方法不能修饰构造器,不能使用this关键字,只能访问静态属性和方法,而不能访问非静态属性和方法
静态语句块
一个类中由static关键字修饰的,不包含在任何方法体中的代码块
- 当类被载入时,静态代码块被执行,且只被执行一次
- 静态块常用来类属性的初始化