您的位置:首页 > 职场人生

黑马程序员-----面向对象(上)

2015-05-11 11:41 218 查看




------- android培训java培训、期待与您交流!
----------

1  面向对象的概念

面向对象是指把解决的问题按照一定规则划分为多个独立的对象,然后通过调用对象的方法来解决问题。当然,一个应用程序包含多个对象,通过各个对象的相互配合来实现应用程序的功能,这样当应用程序发生变动时,只需要修改个别的对象就行,从而使代码更容易得到维护,面向对象的特点主要表现为封装性、继承性、多态性。

1.1  类与对象

1.1.1  定义

类是对某一类事物的抽象描述,而对象用于表示现实中该类事物的个体。类与对象的关系类似玩具模型和玩具的关系,类用于描述多个对象的共同特征,它是对象的模板,且对象是根据类创建的,并且通过一个类可以创建多个对象。

 


1.1.2  成员变量和局部变量

作用范围:成员变量作用于整个类中,局部变量作用于语句中。

在内存中的位置:成员变量在堆内存中,因为对象的存在才在内存中存在,局部变量存在栈内存中。

1.1.3  匿名对象

使用方式:

*  匿名对象是对象的简化形式

*  当对对象方法仅进行一次调用的时候,如果对一个对象进行多个成员调用,必须给这个对象起个名字。

*  匿名对象可以作为实际参数进行传递

 


 

1.1.4  对象在内存中的状态

当新创建一个对象时,虚拟机会在堆内存中开辟一个空间,用来存储对象的成员变量、成员函数等,并且根据构造函数初始化值(没有构造函数会进行默认的初始化),然后把这个对象的地址值赋值给栈内存的变量,这样变量便持有了对象的引用。    

1.2  Java的垃圾回收机制

1.2.1  什么是垃圾

当对象被实例化后,在程序中可以通过对象的引用变量来访问该对象的成员,当没有任何变量引用这个对象时,它将成为垃圾对象,不能再被使用,下面的例子就是使对象成为垃圾。

 


1.2.2  垃圾回收机制

在Java中,当一个对象成为垃圾后仍会占用内存空间,时间一长,就会导致内存空间的不足。针对这种情况,Java中引入了垃圾回收机制,虚拟机会不定时的启动垃圾回收器将这些垃圾对象从内存中释放,从而使程序获得更多可用的内存空间。除了等待Java虚拟机进行自动垃圾回收,也可以通过调用System.gc()方法来通知Java虚拟机立即进行垃圾回收。

 

1.3  构造方法

定义:一个类中的方法如果满足以下几个条件,那么该方法称为构造方法

1  方法名和类名相同

2  在方法名前面没有返回值类型的声明

3  在方法中不能使用return语句返回一个值

 

构造函数和一般函数在运行上的不同?

构造函数是在对象一建立就运行,给对象初始化而一般方法是对象调用才执行,是给对象添加对象具备的功能。一个对象建立,构造函数只运行一次,而一般方法可以被该对象调用多次。

什么时候定义构造函数呢?

当分析事物时,该事物存在具备一些特性或者行为,那么将这些内容定义在构造函数中。

 

1.3.1  构造方法的重载

与普通方法一样,构造方法也可以重载,在一个类中可以定义多个构造方法,只要每个构造方法的参数类型或参数个数不同即可。



运行结果:  My name is leo,my age is 10

            My name is jay,my age is 0

 

特别注意:如果在一个类中没有定义构造方法,系统会自动为这个类创建一个默认的构造方法,这个默认的构造方法没有参数,在其方法体中没有任何代码。但是一旦为该类定义了有参的构造方法,系统将不再生成无参的构造方法,因此创建实例对象时就有可能会报错,为了避免这种错误,如果定义了有参的构造方法,务必再定义一个无参的构造方法!

 

<
4000
strong>1.3.2  构造代码块[/b]

作用:给对象进行初始化。对象一建立就运行,而且优先于构造函数执行。定义的是不同对象共性的初始化内容。

和构造函数的区别:构造代码块是给所有对象进行统一初始化,而构造函数是给对应的对象(不同参数)进行初始化。

 


 

运行结果: 构造代码块执行了

           构造函数执行了

 

1.4  this关键字

this:用于区分局部变量和成员变量同名的情况

this代表它所在函数所属对象的引用。简单说,就是哪个对象在调用this所在的函数,this就代表哪个对象。

this的应用:当定义类中的功能时,该函数内部要用到调用该函数的对象时,这时用this来表示这个对象。

1.4.1  构造方法中的this语句

可以在构造方法中通过this语句调用其它的构造方法。例如:

 


运行结果: My name is leo,my age is 5

在类中通过this语句调用构造方法时,需要注意以下三点:

1  只能在构造方法中使用,不能在成员方法中使用

2  必须位于第一行,因为要先被初始化

3  不能在一个类的两个构造方法中相互调用

 

1.5  static关键字

静态:static 是一个修饰符,用于修饰成员(成员变量,成员函数)、代码块等,它被对象所共享,当成员被静态修饰后,就多了一个调用方式,除了可以被对象调用外,还可直接被类名调用。用法:类名.静态成员

特点:

1  随着类的加载而加载,也就是说,静态会随着类的消失而消失。

2  优先于的对象存在,明确一点:静态是先存在的,对象是后存在的。

3  被所有对象所共享。

4  可以直接被类名所调用。

 

实例变量和类变量的区别:

1  存放位置

类变量随着类的加载而存在于方法区中。

实例变量随着对象的建立而存在于堆内存中。

2  生命周期

类变量生命周期最长,随着类的消失而消失。

实例变量生命周期随着对象的消失而消失。

 

static使用注意事项:

1  静态方法只能访问静态成员。

非静态方法既可以访问静态也可以访问非静态。

2  静态方法中不可以定义this,super关键字。

因为静态优先于对象存在,所以静态方法中不可以出现this。

3  主函数是静态的

 

静态有利有弊

利处:对对象的共享数据进行单独空间的存储,节省空间。没有必要每一个对象中都存储一份,可以直接被类名调用。

弊处:生命周期过长,访问出现局限性(静态只能访问静态。)

 

1.5.1  静态代码块

格式:

static 

{

静态代码块中的执行语句。

}

特点:随着类的加载而执行,只执行一次,并优先于主函数。

注意:只有用到类中的元素才加载        



运行结果:  静态代码块执行了

                   构造函数执行了

 

什么时候定义静态函数?

当功能内部没有访问到非静态数据(对象的特有数据),那么该功能可以定义成静态的。


                 

 

1.6  对象的实例化过程

1  因为new用到了Person.class 所以虚拟机会先找到Person.class文件并加载

2  如果有static代码块,执行

3  在堆内存中开辟空间,分配内存地址

4  在堆内存中建立对象的特有属性,并进行默认初始化

5  对属性进行显示初始化

6  对对象进行构造代码块初始化

7  对对象进行对应的构造函数初始化

8  将内存地址赋给栈内存中的p变量

如以下代码所示:



运行结果: abc

注意:静态代码块给类初始化的时候,不能给成员变量初始化,因为此时对象还没有建立!         

 

1.7  main函数

主函数:是一个特殊的函数,作为程序的入口,可以被jvm调用。

public :代表着该函数的访问权限是最大的

static :代表着随着类的加载就已经存在了

void :主函数没有具体的返回值

main :不是关键字,但是是一个特殊的单词,可以被jvm识别。

(String[] args):函数的参数 ,参数类型是一个数组,该数组中的元素是字符串。字符串类型的数组,args = arguments

虚拟机只识别 public static void main(String[] args) args可以改,但是习惯不改。

String[] args的作用:可以往主函数传递参数 :java className haha heihei hehe

 

1.8  单例设计模式

单例设计模式:解决一个类在内存中只存在一个对象

想要保证对象唯一:

1.为了避免其他程序过多建立该类对象,先禁止其他程序建立该类对象。

2.还为了让其他程序可以访问到该类对象,只好在本类中,自定义一个对象。

3.为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式。

 

如何用代码实现?

1  将构造函数私有化

2  在类中创建一个本类对象

3  提供一个方法可以获取到该对象

如下图所示,单例设计模式分为饿汉式和懒汉式,推荐使用饿汉式。

 


2    面向对象之封装



封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。

好处:将变化隔离,便于使用,提高重用性,提高安全性

封装原则:将不需要对外提供的内容都隐藏起来,把属性都隐藏(访问权限private),提供公共方法对其访问(访问权限public)

 


运行结果:  10
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息