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

黑马程序员_Java基础_面向对象(一)_05

2014-01-17 00:39 309 查看
------- android培训java培训、期待与您交流!
----------

导读:概述,类与对象,成员变量和局部变量,匿名对象,封装,pravite, 构造函数,this

1、 概述

面向对象是相对面向过程而言

面向过程,强调的是功能行为。

面向对象,将功能封装进对象,强调具备了功能的对象。

面向过程和面向对象是一种思想。

面向过程,是面向对象的基础。

面向对象使复杂的问题变得简单。以前要面向好多的动作,现在只在面向一个对象就要以了。
面向对象的角色发生了变化,由以前面向过程的执行者变成了面向对象的指挥者。面向过程有一个所有代码从前到后的执行过程,面向对象只要找到相应的对象就可以了。

例:把大象放到冰箱里。

面向过程:(1)打开冰箱 (2)存储进冰箱 (3)关闭冰箱

面向对象:找冰箱就可行了。它就可以完成开门,关门和存储的的功能。

(1)冰箱.打开 (2)冰箱.存储 (3)冰箱.关闭

把功能封装到事物当中。只要找事物,功能全在。
C语言只要有功能就可以执行。如果以后还需要某个功能的话,还要一个个的找。而如果用面向对象的话,你只用面向冰箱就可了。

我开门,对象是我还是门?

对象是门,开门这个功能的具体的细节(合页打开多少度,弹簧怎么弹的,灯亮),谁最清楚?门最清楚,而不是你最清楚。你在使用门的方法将门打开,因此门是对象。

名词提炼法:



{

开门(门)

{

门.开();

}

}



{

开(){操作门轴}

}

举例:我去买电脑(查资料,看电脑,买电脑,砍价)(面向过程)。

我不懂,怕被骗,让小张帮我去买。(面向对象)

结合实际场景去说,到什么场景就说什么样的例子。

Thinking In Java:万物皆对象。

2、类与对象的关系

面向对象有三个特征:封装,继承,多态。
以后的开发:其实就是找对象在使用。没有对象,就创建一个对象。
找对象,建立对象,使用对象。维护对象的关系
类和对象的关系:

类:在现实生活中事物的描述。(提取对象中共性内容、对具体的描述。如:姓名,年龄,性别)
对象:就是这类事物,实实在在的个体。(张三,李四)

映射到java中,描述就是class定义的类。具体对象就是对应java在堆内存中用new建立实体。
描述事物其实就是在描述事物的属性和行为。属性对应类中变量,行为对应的类中的函数(方法)。
定义类,就是描述事物,就是在定义属性和行为。属性和行为共同成为类中的成员(成员变量和成员方法)(要先分析,分析完了才能写代码)

引用类型变量:第二种,类类型变量(第一种数组类型已经学过)

Car c = new Car(); //c就是一个类类型的变量。记住:类类型变量指向对象(该类产生的实体)

堆内存有一个特点,每一个对象的量在刚产生时都有一个默认初始化值(隐性),再把显性的值赋给它。
在java中指挥对象的方式:对象.对象成员

3、成员变量和局部变量

如果一个类,只是为了描述事物,并不需要独立运行的时候不需要写主函数
成员变量和局部变量区别:

作用范围:成员变量作用于整个类中,局部变量作用于函数中或语句中。
在内存中的位置:成员变量在堆内存中,因为对象的存在,才在内存中存在。局部变量:存在在栈内存中
是否初始化:成员变量都有一个默认的值,即使不赋值,它也是能参与运算的,因为它在堆内存中。而局部变量不初始化是不能参与运算的。
局部变量作用范围结束,变量空间会自动释放。

4、匿名对象

匿名对象是对象的简化形式
匿名对象两种使用情况:

(1)当对对象方法进行一次调用时,可以用匿名对象来完成这样写来完成比较简便。如果对一个对象进行多个成员调用,必须给这个对象起个起个名字

new car.color = blue; 匿名对象,改变属性没有意义,改完之后变成垃圾了。
new car.run() ; 调用方法有意义

(2)匿名对象可以做为实际参数进行传递

在开发中想让某对象变垃圾,可以指定一下:q = null;

5、封装概述

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

好处:将变化隔离。便于使用。提高重用性。提高安全性。
封装原则:将不需要对外提供的内容都隐藏起来。把属性都隐藏,提供公共方法对其访问

6、封装private

private关键字: 私有的权限修饰符,用于修饰类中的成员(成员变量,成员函数)。

私有只在本类中有效,将age私有化以后,类以外即使建立了对象也不能直接访问。但是人应该有年龄,就需要在Person类中提供对应访问age的方式。
对于变量有一个规范。它(属性)有两种操作方式,一种是get,一种是set。set的返回值是void,要设置传入参数,get没有传入参数,它的返回值类型和它要获取的参数的变量一致。如果看到一个类中有两相操作:setXXX和getXXX,则它一定会有一个私有的属性,叫做XXX。一个事物中可能有n多个属性,这些属性可能都会被初始化。
注意:封装不是私有,私有仅仅是封装的一种表现形式。私有是一种最小的权限。
属性之所以对外提供访问方式,就因为可以在它的访问方式中加入逻辑判断等语句。进而对访问的数据进行操作。提高代码健壮性。

7、构造函数

特点:

(1)函数名与类名相同
(2)不用定义返回值类型。(void是一种返回值类型,代表没有返回值的情况。而构造函数是根本不需要定义返回值类型)

(3)不可以写return语句

对象一建立就会自动调用与之相对应的构造函数。如果只需要调用一次的话,不用再用手动的方式去调用这个构造方法。

作用:给对象进行初始化。

注意:

(1)默认构造函数的特点。(当一个类中没有定义构造函数时,那么系统会默认给该类加入一个空参数的构造函数,如person(){ } , 方便该类进行初始化,否则该类是建不出来的。当在类中自定义了构造函数后,默认的构造函数就没有了。)

(2)多个构造函数是以重载的形式存在的。

构造函数和一般函数的区别:

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

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

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

8、构造代码块(面试用,开发不常用)

作用:给对象进行初始化。对象一建立就运行,而且优先于构造函数执行。
和构造函数的区别:构造代码块是给所有对象进行统一初始化(定义的是不同对象共性的初始化内容),而构造函数是给对应的对象初始化。

9、this关键字

两种用法:(1)区分同名变量的情况 (成员和局部重名的时候) (2)构造函数单调用。
一般函数是不能调用构造函数的,因为this语句是不能用在一般函数中的。
构造函数也是可以私有化的,可是如果把所有的构造函数私有化的话,那么是不可能创建对象的,因为对象都不能进行初始化动作。

class Person

{
private String name;
Person(String name);
{
name = name;
//局部变量和成员变量有一样的name名字。第一个name不是成员变量,局部中有,就在局部中找name使用,如果没有再就去找成员变量中的name。
}
}

this为什么可以解决这个问题?

this:用于区分局部变量和成员变量同名情况。this.name = name; 把name赋给对象中的name;

this到底代表的是什么呢?

this:就代表本类对象。一个类可以有多个对象,但到底代表哪一个呢?this代表它所在函数所属对象的引用。(简单说:哪个对象在调用this所在的函数,this就代表哪个对象。)

在一个类里成员之间互相调用的时候,其实都是由对象完成的。通过对象来区分是哪个对象中的成员。

10、this关键字的应用

this的应用:当定义类中功能时,该函数内部要用到调用该函数的对象时(如,人和人比较,人自身具有一个功能,这个功能又使用到了人这个对象),这时用this来表示这个对象。但凡本类功能内部使用了本类对象,都在功能中用this表示。如下代码:

class Person
{
private int age;
Person(int age)

{

this.age = age;

}

public boolean compare(Person p)
{
return p.age == this.age; //看到对象的时候要想到这是一个对象的引用,this在这里和p1的所指向是一致的。
}
}

public static void main(String[] args)
{
Person p1 = new Person(20);
Person p2 = new Person(25);
boolean b = p1.compare(p2);
System.out.println(b);

}

什么时候使用this关键字呢?

当在该函数内需要用到调用该函数的对象时,就用this。(不能用p.name = name; 因为你在描述的时候还不知道你要建立对象的名称是p呢,怎么用p去调用。用this谁调用我,我就代表谁,预先给对象留了一个位置)

11、this关键字在构造函数间调用

class Person //this语句:仅适用于构造函数之间进行互相调用时使用

{

private String name;

private int age;

Person()

{

}

Person(String name)

{

this();

this.name = name; //(2)将lisi传给p.name;

}

Person(String name,int age) //初始化两个值

{

this(name); //即p(name); 即new Person(name);

//this后面没有点。相当于初始化两个值中的一个值。(1)相当于对p这个对象进行姓名的初始化。

this.age = age;

}

}

public static void main(String[] args)

{
Person p = new Person("lisi" , 20);
}

构造方法可能有很多个,但可能对外只提供一个(用户用起来方便),而内部有很多初始化方式(内部初始化动作)
this语句只能定义在构造函数的第一行(否则编译出错)。初始化的动作要先执行,如果初始化中还有初始化的话,要先执行那个更细节的初始化。然后再执行自己的初始化。

Person(String name)

{

this.name = "haha";

}

Person(String name,int age)

{

this.name = name;

this(name); //传入lisi输出haha错误

this.age = age;

}

------- android培训java培训、期待与您交流!
----------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: