------- android培训、java培训、期待与您交流! ----------
1. 面向对象的初始
面向对象的概念:
面向对象是相对面向过程而言,面向对象原来指是专指在程序设计中采用封装、继承、多态等设计方法。现在已经扩展到很多领域。面向过程强调的是功能行为,面向对象是将功能封装进对象,强调具备了功能的对象,和面向过程一样都是一种编程思想。
面向过程与面向对象的区别:
面向过程强调的功能行为,面向对象可以将功能封装进对象,强调具备了功能的对象。
面向对象是基于面向过程的。
面向对象的特点:
1、是一种符合人们思考习惯的思想。
2、可以将复杂的事情简单化。
3、将程序员从执行者转换成了指挥者。
4、完成需求时:
a、先去找具有所需的功能的对象来用。
b、如果该对象不存在,那么创建一个具有所需功能的对象。
c、这样可以简化开发并提高复用性。
开发的过程:
就是不断创造对象,使用对象,指挥对象的的过程。
设计的过程:
其实就是管理和维护对象之间的关系。
面向对象的特征:封装,继承,多态
面向对象理解:
简单的一个例子,笔记本电源适配器,插座提供的是220V的电压,笔记本需要的是19V电压,通过适配器就可以得到适合的电压。可以把适配器看做一个对象,该对象有转换电压的功能,实现过程很复杂,但是作为使用者的我们不需要知道它里里面是怎么实现的只需要知道它的功能直接用就可以,指挥该对象完成转换电压的功能。
2. 封装
封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
好处:
将变化隔离。
便于使用。
提高重用性。
提高安全性。
封装原则:
将不需要对外提供的内容都隐藏起来。
把属性都隐藏,提供公共方法对其访问。
private :私有,权限修饰符:用于修饰类中的成员(成员变量,成员函数)。
私有只在本类中有效。
将变量私有化以后,类以外即使建立了对象也不能直接访问。
3.类、构造函数、对象的关系
对象是用类来描述的,但类并不都是用来描述对象的。对象的存在首先要存在一个类来描述;而一个类存在并不一定就是描述对象或者说是创建对象的。
理解:
3.1 一个汽车,有颜色和时速属性,而这些属性不是开始就有的,需要有一个设计图纸进行设计,设计通过后,才能生产出对应的汽车;汽车就是对象,,设计图纸就是类,需要用类把属性描述完了,才能产生出相应的对象。
3.2 一个抽象类或者接口或者工具类,是不能创建对象的,这都是一种设计思想,接口的存在,是为了提供更多的选择性,让实现它的类强行带有某些功能等,有的抽象类实现了某一接口,是为了让其子类能够不用实现接口中全部的方法,用到哪个方法就复写父类中的某一方法即可,如事件监听中的WindowAdapter类,就是抽象类,实现了WindowListener接口,需要某一功能继承WindowAdapter复写其功能即可,提高灵活性。工具类是不能创建对象的,存在的目的就是为了服务于其他类,如Collections(服务于集合)、Arrays(服务于数组)等,类中提供各种方法操作对应的对象。
类类型:类本身也是一种类型,和数组一样,属于引用型变量,那么它的值是什么呢?int 型变量的值可以是2、可以是20等,类可以描述对象,类的值就是其产生出的对象,一个类的引用星变量都可以关联到一个对应的对象实体,假定有一个Person类,描述人的姓名和乃年龄属性,有对象p,如下图:
类在堆内存创建对象实体,将地址值传给引用p,p就指向了对应的Person对象实体。道理和数组是一样的。
定义就是在定义行为和属性,定义好了属性和行为就定义了一类事物。就描述好了该类对象。
如:
class Person
{
//定义属性
private String name;
private int age;
Person(String name,int age)
{
this.name = name;
this.age = age;
}
//定义行为
public void est()
{
System.out.println("吃饭");
}
}
4.构造函数
对象一建立就会调用与之对应的构造函数。
作用:可以用于给对象进行初始化。
小细节:当一个类中没有定义构造函数时,那么系统会默认给该类加入一个空参数的构造函数。
当在类中自定义了构造函数后,默认的构造函数就没有了。
构造函数和一般函数在写法上有不同。
类名(参数)
{
代码块//不用写return语句
}
多个构造函数以重载的形式存在。
构造函数是在对象一建立就运行。给对象初始化。
一般函数是对象调用才执行,是对象添加对象具备的功能。
一个类中默认会有一个空参数的构造函数,
这个默认的构造函数的权限和所属类一致。
如果类被public修饰,那么默认的构造函数也带public修饰符。
如果类没有被public修饰,那么默认的构造函数,也没有public修饰。
默认构造构造函数的权限是随着的类的变化而变化的。
4.1构造代码块
定义格式
{
代码;
}
作用:给对象进行初始化。
对象一建立就运行,而且优先于构造函数执行。
与构造函数的区别:
构造代码块是给所有对象进行统一初始化。
而构造函数是给对应的对象初始化。
5.this关键字
特点:this代表其所在函数所属对象的引用。this代表本类对象的
this代表它所在函数所属对象的引用。
哪个对象在调用this所在的函数,this就代表哪个对象。
this的应用:在定义类中功能时,该函数内部要用到该函数的对象时,
这时用this来表示这个对象。但凡本类功能内部使用了本类对象,都用this表示。
this语句 :用于构造函数之间进行互相调用。
如:this();
this语句只能定义在构造函数的第一行。因为初始化要先执行。默认都在第一行。
例子:
class Person
{
private String name;
privateint age;
Person(int age)
{
this.age = age;
}
Person(String name)
{
this.name = name;
}
Person(String name,int age)
{
this.name = name;
this.age = age;
}
publicvoid speak()
{
System.out.println("name="+this.name+"...age="+this.age);
this.show();
}
publicvoid show()
{
System.out.println(this.name);
}
/*
需求:给人定义一个用于比较年龄是否相同的功能。也就是是否是同龄人。
*/
publicboolean compare(Person p)
{
returnthis.age==p.age;
}
}
6.static关键字
static关键字用于修饰成员(成员变量和成员函数)
被修饰的成员具有以下特点:
随着类的加载而加载
优先于对象存在
被所有对象所共享
可以直接被类名调用。类名.静态成员。
实例变量和类变量的区别:
6.1.存放位置
类变量随着类的加载而存在于方法区中。
实例变量随着对象的建立而存在于堆内存中。
6.2.生命周期
类变量生命周期最长,随着类的消失而消失。
实例变量生命周期随着对象的消失而消失。
注意:
静态方法只能访问静态成员
静态方法中不可以写this,super关键字
主函数是静态的
利弊:
利处:对对象的共享数据进行单独空间的存储,节省空间。
没有必要每个对象中都存储一份。
弊端:生命周期过长。访问出现局限性。静态只能访问静态。
成员变量也叫实例变量。
静态的成员变量也叫类变量。
public static void main(String[] args)
主函数:是一个特殊的函数。是程序的入口,可以被jvm调用。
定义:
public:代表着该函数访问权限是最大的。
static:代表主函数随着类的加载而加载。
void:主函数没有具体的返回值。
main:不是关键字,但是是一个特殊的单词,可以被虚拟机识别。
(String[] arr):函数的参数,参数类型是一个数组,该数组中的元素是字符串。字符串类型的数组。
固定格式。
静态的应用:
每一个应用程序中都有共性的功能,可以将这些功能进行抽取,独立封装。以便复用。
静态代码块:
格式:
static
{
//代码
}
特点:随着类的加载而执行,但只执行一次,并优先于主函数和构造代码块。用于给类进行初始化的。
静态变量:
当分析对象中所具备的成员变量的值都是相同的,这时这个成员就可以被静态修饰。只要数据在对象中
都是不同的,就是对象的特有数据,必须存储在对象中,定义成静态的。
静态函数:
函数是否用静态修饰,就参考一点,就是该函数功能是否访问到对象中的特有数据。
静态函数只能访问静态方法或者静态变量。
-----------------------------------
Person p = new Person("zhangsan",20);
该句话:
1.因为new用到了Person.class。所以会先找到Person.class文件并加载到内存中。
2.执行该类中的static代码块,如果有的话,给Person.class类进行初始化。
3.在堆内存中开辟空间,分配内存地址。
4.在堆内存中建立对象的特有属性。并进行默认初始化。
5.对属性进行显示初始化。
6.对对象进行构造代码块初始化。
7.对对象进行对应的构造函数初始化。
8.将内存地址赋给栈内存中的p变量。
-------------------------------------
7.单例设计模式
单例设计模式:解决一个类在内存只存在一个对象。
饿汉式
public Single()
{
private Single(){}
private static Single s = new Single();
public static Single getInstance()
{
return s;
}
}
public Single()
{
private Single(){}
private static Single s = new Single();
public static Single getInstance()
{
return s;
}
}
懒汉式
public Single()
{
private Single(){}
private static Single s = null;
public static Single getInstance()
{
if(s==null)
s = new Single();
return s;
}
}
public Single()
{
private Single(){}
private static Single s = null;
public static Single getInstance()
{
if(s==null)
s = new Single();
return s;
}
}
优化:
class Single
{
private static Single s = null;
private Single(){}
public static Single getInstance()
{
if(s==null)
{
synchronized(Single.class)
{
if(s==null)
s = new Single();
}
}
return s;
}
}
class Single
{
private static Single s = null;
private Single(){}
public static Single getInstance()
{
if(s==null)
{
synchronized(Single.class)
{
if(s==null)
s = new Single();
}
}
return s;
}
}
8..值传递和引用传递的区别
值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参数的值。
引用传递:也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。