面向过程注重的是功能和行为,而面向对象注重的是具有功能和行为的对象。面向对象是一种基于面向过程的编程思想。
学过C语言的都知道她是面向过程的,然后来的C++、C#、Java等都在这个基础上,都部分或所有地转移到了面向对象的大阵营中。简单来讲就是一样作一件事,面向过程要本身作全部的事,事无巨细面面俱到;而面向对象是先找有没有能作这件事的对象实体,把要作的事委托给对象来作,本身只要调用对象作事,不用管对象是怎么作的。例如:你为远方的好友写信,完了要寄给TA这件事。
面向过程:(假设没有邮差)你写完信就得本身拿着信,走上几百里地甚至更远的路去 给TA。
面向过程:有邮差了,写好信直接给邮差付钱就OK了,让邮差给你寄去,无论邮差是 怎么到达怎么给TA的,你只要确认信发到了就好。
从上述例子可知,面向对象相对于面向过程处理一件事更简单,咱的身份也从执行者变成了指挥者,爽!!!
面向对象有3大特征:封装(encapsulation) 继承(inheritance) 多态(polymorphism)
2、类与对象
说到特性就要引出一个词“类”,字面意思是具备相同特征的事物的集体。而对于计算机编程语言来讲,类是对对象的属性和行为的描述,世间万物都是实体对象,而有些对象有共同的一些属性和行为,为了便于描述和使用,就将这些共同的属性和行为放在类中。这就是说:“类是对象的抽象,对象是类的实例。”
3、封装
一、概述:
定义:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
优势: 一、将变化隔离 二、便于使用 三、提升重用性 四、提升安全性
原则:将不须要对外提供的内容隐藏起来;把自有属性都隐藏,提供公共方法对其访问。
深刻了解3大特征以前要定义一个类,这里用Person表示人这一类事物,人有姓名和年龄这2个属性,人也能够说话。Person类代码以下: java
public class Person { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Person(String name, int age) { super(); this.name = name; this.age = age; } public Person() { super(); } public void sayHello(){ System.out.println("Hello,itheima."); } }
看懂上述代码还需知道Java中的权限修饰符:private、protected、default、public。如下用表格显示出被不一样权限修饰符对应的不一样访问权限: 编程
从上面Person类中能够看出,咱们每一个人的姓名和年龄都是本身的隐私信息,不想让外界直接访问和操做,那就用private修饰变成私有的,仅仅提供getAge()和setAge()供外界访问和操做,这就是Person类对于人这一类事物信息的封装。类通常由成员变量(属性)、成员函数(行为)和构造函数构成。
二、成员变量和局部变量
1)区别 :
做用范围:成员变量做用于整个类中;局部变量做用于函数(方法)中或者整个语句中。
内存位置:成员变量存在于堆内存中;随着对象存在而存在,随着对象消失而消失。局部变 量存在于栈内存中。当方法被调用或语句被执行的时候存在;当方法调用完,或者 语句结束后,就自动释放内存。
初始值:成员变量有默认初始值;局部变量没有默认初始值,使用前必须赋值。
定义位置:成员变量定义在类中,方法外;局部变量定义在方法内或者做为方法的形式参数 存在。
Note:使用变量时,遵循就近原则。首先在局部范围找,有就使用;接着在成员方法里找, 有就使用;不然就报错。
2)成员变量赋值的三种方式:
a)直接在定义的时候赋值,或者是经过对象名.成员赋值。
b)经过 set 方法类赋值
c)在构造函数中赋值(在实例化对象的时候赋值)
三、构造函数
1) 特色:
a)函数名与类名相同
b) 没有返回类型(无需定义返回值类型)
c)没有返回值(不写 return 语句)
2)做用:给对象进行初始化。
Note:
构造函数是用于建立对象,并对其进行初始化赋值,对象一创建就自动调用相对应的构造函数。对于一个对象,构造函数只执行一次。通常函数是不能直接调用构造函数。
一般状况下类中有一个默认的空参构造函数,且该构造函数的权限和所属类一致。对于默认构造函数,当一个类中没有定义任何构造函数时,那么系统会默认给该类定义一个空参的构造函数;当在类中自定义了构造函数后,默认的空参构造函数就不存在了(通常状况下建议在自定义类中手动给出无参构造函数)。同一个类中的多个构造函数是以重载的形式存在的。相对于构造函数,成员函数就普通多了,只要按照正常格式和规则定义出来的就是成员函数。
3)构造函数与成员函数的区别:
a)构造函数与通常函数格式(写法)不一样:构造函数和类名相同,而且没有返回类型,也没有返回值;而普通成员函数能够任意起名,必须有返回类型,能够没有返回值。
b)构造函数与通常函数做用(运行上)不一样:构造函数用于建立对象,并进行初始化值;而普通成员函数是用于完成特定功能的。
c)构造函数与通常函数调用方式不一样:构造函数是在建立对象时被系统调用的,对于同一个对象只调用一次相应构造函数;而普通成员函数通常是由建立好的对象调用,而且能够调用屡次。类中除上述内容以外还会有代码块。
4)代码块:
格式:由{}括起来的代码。
分类:局部代码块(定义在方法中的代码块) 、构造代码块(定义在方法外的代码块)
做用:
a)局部代码块:控制代码块内变量的生命周期和做用域(使用范围), 从而提升效率。
b)构造代码块:把全部构造方法中共同的内容定义在构造代码块。
c)构造代码块与构造函数都是给对象进行初始化的,可是构造代码块中定义的是同一类下不一样对象的共性初始化内容,而且对象一创建就运行,对对象进行统一初始化,优先于构造函数执行。而构造函数是给对象进行特定初始化的。
四、this关键字
1)概述:this表明所在函数所属对象的引用。(简单说,谁调用 this 所在的方法,this 就表明谁。)
2)this 应用:
a)用于区分同名成员变量和局部变量。
b)当定义类中功能时,该函数内部要用到调用该函数的对象时,用 this 来表示这个对象。但凡本类功能内部使用了了本类对象,都用 this 表示。
c)在构造函数间互相调用对象时,只能用 this(参数);而且 this(参数)只能定义在构造函数的第一个语句(由于初始化动做要先执行)。
五、static关键字
1)概述:static关键字用于修饰成员(成员变量和成员方法),写在权限修饰符以后,类型名以前。
2)static特色:(被修饰后的成员具有的特色)
a)随着类的加载而加载。
b)优先于对象存在。
c)被全部对象所共享。
d)能够直接被类名调用(类名.成员)
Note:
a)静态方法只能访问静态成员(静态方法不能调用、获取非静态变量;非静态方法既能够访问静态,也能够访问非静态。)
b)静态方法中不能够出现 this、super 关键字(由于静态优先于对象存在)。
c)主函数是静态的
被static修饰的还有静态代码块,例如: 设计模式
static{ System.out.println(“静态代码块输出”); }
其特色是:随着类的加载而执行,只执行一次,用于给类进行初始化的。
2)实例变量(成员变量)与类变量(静态变量)的区别:
a)调用方式:静态变量也称为类变量,能够直接经过类名调用,也能够经过对象名调用,这个变量属于类。用 static 修饰 成员变量也称为实例变量,只能经过对象名调用。这个变量属于对象。
b)存储位置:静态变量存储在方法区中的静态区。成员变量存储在堆内存。
c)生命周期:静态变量随着类的加载而存在,随着类的消失而消失,生命周期长。成员变量随着对象的建立而存在,随着对象的消失而消失。
d)与对象的相关性:静态变量是全部对象共享的数据。成员变量是每一个对象所特有的数据。
Note:静态变量的优点:对对象的共享数据进行单独空间的存储,节省空间。没有必要每个对象中都存储一份。能够直接被类名调用。缺陷:生命周期过长,访问出现局限性。(静态虽好,只能访问静态。)
六、单例设计模式
1)概述:解决某一问题最行之有效的方法,java中共有23种设计模式。此处咱们讲解其中之一:单例设计模式。
2)单例设计模式的做用:使一个类在内存中只存在一个对象。用代码实现单例设计模式须要作三部:
a)将构造函数初始化。
eg:private SingleModel(){} 安全
b)在类中建立一个本类对象。
eg:private staticSingleModel s= newSingleModel();
c)提供一个访问方法能够获取到该对象。
eg:public staticSingleModel getInstance()
{
return s;
}
3)写法:单例设计模式只是为了保证内存中的对象惟一,其余在类中该怎么描述吗,仍是怎么描述。单例设计模式有两种写法:
a)饿汉式:也就是刚三部中的示例语句。它的特色是先初始化对象。如:Single类一进内存,就已经建立好了对象(在实际开发中,出于安全考虑,建议使用饿汉式)。
代码以下: 编程语言
class SingleModel { private static SingleModels=new SingleModel(); private SingleModel(){} public static SingleModel getInstance() { return s; } }
b)懒汉式:它的特色对象是方法被调用时,才初始化,这也叫对象的延时加载。如:在如下完整代码中,Single类进内存,对象尚未存在,只有调用了getInstance()方法时,才建立对象。 函数
代码以下: this
class SingleModel { private static SingleModels=null; private SingleModel(){} public static SingleModel getInstance() { if(s==null) s=new SingleModel(); return s; } }下面演示单例设计模式的使用,代码以下:
class Person { private static Person person = new Person(); private Person() { } public static Person getPerson() { return person; } } public class SingleModel { public static void main(String[] args) { Person p1 = Person.getPerson(); Person p2 = Person.getPerson(); System.out.println("p1==p2::" + (p1 == p2)); System.out.println("p1.equals(p2)::" + p1.equals(p2)); } }结果以下:
本篇幅所描述的仅表明我的见解,若有出入请见谅。 spa