-----------android培训、java培训、java学习型技术博客、期待与您交流!------------
一、面向对象的概述
1.理解面向对象
面向对象是Java语言的核心。面向对象是相对面向过程而言的。
面向过程:强调的功能行为。
面向对象:将功能封装进对象,强调具备了功能的对象。
这是一种思想上的转变,以大象放进冰箱为例(大象放进冰箱需要3步:打开冰箱,将大象存储到冰箱,关闭冰箱)。
如果是面向过程的思想,那么可以理解为三个行为:打开,存储,关闭。
我们知道打开,存储和关闭都是属于冰箱本身的功能,那么用面向对象的思想就是:冰箱.打开,冰箱.存储,冰箱.关闭。
我们的思想从 强调功能 转变成 强调对象。
2.面向对象特点
2.1.将复杂的事情简单化。
2.2.面向对象将以前过程中的执行者,变成了指挥者。
2.3.面向对象符合现在人们的思考习惯。思考问题从自身和实际出发。
通过名称提炼法将一列功能或属性封装进对象。
名称提炼法:人开门
人{
开门(门){
门.打开();
}
}
门{
开(){操作门轴}
}
在开发中,先考虑对象,有对象直接用,没对象就造对象再用。找对象、建对象、使用对象、并维护对象之间的关系。
二、类和对象的关系
类:就是对现实生活中的事物的描述。
对象:就是这类事物实实在在的个体。
例如:现实生活中的对象: 张三,李四
对这两个对象进行描述:提取他们的共性内容,对具体实例的抽象,比如共性有:姓名、年龄
那么在Java中,描述是用类来体现的,用class来定义。具体的对象就是对于java 在堆内存中用new建立的实体。
其实,定义类就是在描述事物,就是在定义属性和行为。属性对应是类中的变量,行为对应类中的函数。
类就像一张图纸,对象就像是依据图纸造出来的个体。
三、匿名对象
1.什么时候使用匿名对象?
方式一:当对对象的方法之调用一次时,可以使用匿名对象完成。
方式二:可以将匿名对象作为实际参数来传递。
四、面向对象的特征
面向对象的三大特征:封装、继承、多态
1.封装: 是指隐藏对象的属性和实现细节,仅对外提供公共的访问方式。
封装的好处:将变化隔离,便于使用,提高重用性,提高安全性。
封装的原则:将不需要对外提供的内容都隐藏起来,把属性都隐藏,提供公共方法对其访问。
如何进行封装?
封装的方式之一:private 私有的访问权限最低,仅在本类中有效。私有仅仅是封装的一种表现形式而已。
将属性私有后,其他类即使建立了对象也不能直接访问,只能通过本类提供的公共访问方式对其进行访问。
这样的方法一般有两个规范写法: 例如变量 XXX ,那么设置变量 setXXX( ); 获取变量 getXXX( );
2.构造函数
构造函数的特点:
函数名与类名相同。
不需要定义返回值类型(主要:不同于void ,void代表的是一种返回值类型----无返回值)
不可以写return语句。
构造函数的作用:给对象进行初始化。
注意:所有对象创建时,都需要对其进行初始化。
对象一建立,就会调用与之对应的构造函数。当一个类中没有定义构造函数时,系统会默认给其加入一个无参构造函数。
当类中自己定义了构造函数,那么系统就不会给类加构造函数了。
构造函数可以定义多个(函数的重载特性),分别对应不同的初始化方式。
构造函数与一般函数的区别:
构造函数和一般函数写法上有不同。
在运行上也有不同。构造函数在对象一建立就调用,给对象进行初始化,只运行一次;一般函数需要对象调用时,才会执行。
什么时候定义构造函数?
当分析事物是,该事物存在具备一些特性或者行为,那么将这些内容定义在构造函数中。
3.构造代码块
什么是构造代码块?
例: {
不同对象共性的初始化内容;
}
特点:无函数名,只有一对{ }
构造代码块和构造函数的区别:
构造代码块用于给所有对象进行统一初始化,构造函数是给对应的对象进行初始化。而且构造代码块优先于构造函数运行。
构造代码块的作用:
构造代码块用于给对象中共性的属性进行初始化。
4. this关键字
this 就代表它所在函数所属对象的引用。 也就是说 哪个对象调用了this所在的函数,this就代表哪个对象,就是哪个对象的引用。
this关键字的应用:
当定义类中功能时,该函数内部要调用该函数的对象时,这是用this来代表这个对象,但凡本类功能内部使用到本类对象都用this表示。
this语句:
格式:this(实际参数);
this语句用于构造函数之间的相互调用,只能定义在构造函数的第一行。
5.static 关键字
static : 是一个修饰符,用于修饰成员。成员包括 成员变量和成员函数。
static 的特点:
1.随着类的加载而加载。
2.被所有对象共享。
3.优先于对象存在。
注意: 被static修饰的成员不存放在堆内存中,是被单独提取出来了,放在了方法区中。
当成员被static修饰后,就多了一个调用方式,除了能够被对象调用外,还能被类名调用。格式: 类名.静态成员;
什么是实例变量?什么是类变量?
例:String name = "zhangsan"; // 定义了成员变量, 实例变量
static String name = "lisi"; // 定义了静态成员变量,类变量
实例变量和类变量的区别:
1.存放的位置:类变量随着类的加载而加载而存放在方法区中。实例变量随着对象的建立而存放在堆内存中。
2.生命周期:类变量随着类的消失而消失,生命周期最长。实例变流量随着对象的消失而消失。
静态的使用注意:
1.静态方法只能访问静态成员。 非静态既可以访问非静态成员也可以访问非静态成员。
2.静态方法中不可以定义this、super关键字,因为静态优先与对象而存在,所有不能出现this
3.主函数是静态的。
那么什么是主函数呢?
主函数:是一个特殊的函数,它作为程序的入口,能被jvm识别。
主函数固定格式: public static void mian(String[ ] args){ } 不能改变(除了args这个数组名,但一般不去改变该名称)。
public :代表主函数具有最大的访问权限。
static :代表主函数是静态的,随着类的加载就已经存在了。
void :代表了主函数没有具体的返回值。
main :是一个特殊的单词,它不是关键字,但能被jvm 识别。
(String [ ] args) :主函数的参数是一个字符串数组。
静态使用的利与弊:
利:对象的共享数据进行单独空间存储,节省空间,并且可以直接被类名调用。
弊:生命周期过长,访问出现局限性。
静态代码块:
格式:static {
静态代码块中的执行语句;
}
静态代码块的作用:给类进行初始化。随着类的加载而加载,并优先于主函数执行。
那么创建一个对象时都在内存中做了什么事情?
例:Person p = new Person(); //这句话到底做了哪些事情?
1:先将硬盘上指定位置的Person.class文件加载进内存。
2:执行main方法时,在栈内存中开辟了main方法的空间(压栈-进栈),然后在main方法的栈区分配了一个变量p。
3:在堆内存中开辟一个实体空间,分配了一个内存首地址值。new
4:在该实体空间中进行属性的空间分配,并进行了默认初始化。
5:对空间中的属性进行显示初始化。
6:进行实体的构造代码块初始化。
7:调用该实体对应的构造函数,进行构造函数初始化。()
8:将首地址赋值给p ,p变量就引用了该实体。(指向了该对象)
五、单例设计模式
1.什么是设计模式?
设计模式就是解决某一类问题最行之有效的方法。设计模式是一种思想。
java中一共有23中设计模式。
2.单利设计模式
解决的问题:保证一个类在内存中的对象唯一性。
比如:多程序读取一个配置文件时,建议配置文件封装成对象。会方便操作其中数据,又要保证多个程序读到的是同一个配置文件对象,
就需要该配置文件对象在内存中是唯一的。
如何保证对象唯一性呢?
思想:
1,不让其他程序创建该类对象。
2,在本类中创建一个本类对象。
3,对外提供方法,让其他程序获取这个对象。
步骤:
1,因为创建对象都需要构造函数初始化,只要将本类中的构造函数私有化,其他程序就无法再创建该类对象;
2,就在类中创建一个本类的对象;
3,定义一个方法,返回该对象,让其他程序可以通过方法就得到本类对象。(作用:可控)
代码体现:
1,私有化构造函数;
2,创建私有并静态的本类对象;
3,定义公有并静态的方法,返回该对象。
设计模式的两种体现方式:
饿汉式 和 懒汉式
饿汉式代码体现
//饿汉式
class Single{
private Single(){} //私有化构造函数。
private static Single s = newSingle(); //创建私有并静态的本类对象。
public static SinglegetInstance(){ //定义公有并静态的方法,返回该对象。
return s;
}
}
懒汉式代码体现
//懒汉式:延迟加载方式。
class Single2{
private Single2(){}
private static Single2 s =null;
public static Single2getInstance(){
if(s==null)
s =new Single2();
return s;
}
}