【黑马程序员】Java学习笔记之面向对象基础篇
2015-07-01 10:29
323 查看
面向对象基础篇
一、概念
面向对象是相对面向过程而言,面向对象和面向过程都是一种思想。面向过程:
强调的是功能行为。代表语言:C语言。
例子:把大象装进冰箱
1. 打开冰箱。
2. 存储大象。
3. 关上冰箱。
“打开”、”存储”、”关上”都是功能行为,在代码中的直观体现就是函数或者方法,这就是一种面向过程的以功能行为为主体的思想体现。
面向对象:
将功能封装进对象,强调具备了功能的对象。代表语言:Java、C++、C#。
例子:把大象装进冰箱
1. 冰箱打开。
2. 冰箱存储。
3. 冰箱关闭。
可以看到,所有的操作都是以”冰箱”为主体,而不是功能行为。也就是说冰箱自己已经具备”打开”、”存储”、”关上”的行为功能,我们只需要让冰箱执行它具备的功能就可以了。这就是一种面向对象的以执行功能的对象为主体的思想体现。
二、特点
是一种符合人们思考习惯的思想,可以将复杂的事情简单化,将程序员从执行者转换成了指挥者。完成需求时:
1. 先要去找具有所需功能的对象来用。
2. 如果该对象不存在,那么创建一个具有所需功能的对象。
这样可以简化开发并提高复用。
三、面向对象开发、设计和特征
开发的过程:就是不断的创建对象,使用对象,指挥对象做事情。
设计的过程:
就是在管理和维护对象之间的关系。
面向对象的特征:
封装(encapsulation)
继承(inheritance)
多态(polymorphism)
四、类与对象的关系
使用计算机语言就是不断地在描述现实生活中的事物。java中描述事物通过类的形式体现,类是具体事物的抽象,概念上的定义。
对象即是该类事物实实在在存在的个体。
对于同一类事物可以抽取它们的共性的内容,定义在类中。如:生活中的汽车,每一台车都有轮胎数和颜色。那么在通过java描述汽车这类事物时,就可以将这两个共性属性作为类中的属性进行定义。通过该类建立的每一个汽车实体都具有该属性,并可以有对象特有的属性值。
类的定义:描述事物的属性和行为。如:人有身高,体重等属性,有说话,打球等行为。
Java中用类class来描述事物也是如此。
属性:对应类中的成员变量。
行为:对应类中的成员函数。
定义类其实在定义类中的成员(成员变量和成员函数)。
那么成员变量和局部变量有什么不同呢?
成员变量:
1. 成员变量定义在类中,在整个类中都可以被访问。
2. 成员变量随着对象的建立而建立,随着对象的消失而消失,存在于对象所在的堆内存中。
3. 成员变量有默认初始化值。
局部变量:
1. 局部变量只定义在局部范围内,如:函数内,语句内等,只在所属的区域有效。
2. 局部变量存在于栈内存中,作用的范围结束,变量空间会自动释放。
3. 局部变量没有默认初始化值。
五、匿名对象
匿名对象是对象的简化形式。匿名对象两种使用情况:
1. 当对对象方法仅进行一次调用时;
2. 匿名对象可以作为实际参数进行传递。
示例:
class Car { String color = "red"; int num = 4; public static void run() { System.out.println("function run is running!" ); } } class CarDemo{ public static void main(String[] args){ //对对象方法仅进行一次调用时,就可以使用匿名对象 new Car().run(); //匿名对象可以作为实际参数进行传递 show(new Car()); } public static void show(Car c){ c. num = 3; c. color = "black" ; System.out.println("function show is running!" ); System.out.println(c.num + "..." + c. color); } }
ps:在java中,方法参数的传递永远都是传值,而这个值,对于基本数据类型,值就是你赋给变量的那个值。而对于引用数据类型,这个值是对象的引用,而不是这个对象本身。
六、封装
封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。好处:
1. 将变化隔离。
2. 便于使用。
3. 提高重用性。
4. 提高安全性。
封装原则:
1. 将不需要对外提供的内容都隐藏起来。
2. 把属性都隐藏,提供公共方法对其访问。如,getXXX,setXXX。
示例:
/* 人: 属性:年龄 行为:说话 */ class Person{ //private:私有,是一个权限修饰符,用于修饰 //不希望别人直接访问赋值,需要通过私有化把属性进行隐藏 private int age ; //通过提供set、get公共方法对其访问 public void setAge( int a){ //在set方法内可以对属性的赋值进行限制 if (a > 0 && a < 130){ age = a; } else System.out .println("错误的数据" ); } public int getAge(){ return age ; } void speak(){ System.out .println("age = " + age); } } class PersonDemo{ bc46 public static void main(String[] args){ Person p = new Person(); //通过其他方式访问 p.setAge(20); p.speak(); //赋值不合法,set方法就不允许成功赋值 p.setAge(-20); } }
运行结果: age=20
P.S.
1、私有仅仅是封装的一种体现而已。
2、private关键字:是一个权限修饰符,用于修饰成员(成员变量和成员函数),被私有化的成员只在本类中有效。
3、常用场景之一:将成员变量私有化,对外提供对应的set、get方法对其进行访问,提高对数据访问的安全性。
七、构造函数
特点:1、函数名与类名相同。
2、不用定义返回值类型。
3、没有具体的返回值。
PS: 在构造函数前面加上返回值就只是一般函数了。
作用:给对象进行初始化。
示例:
class Person{ private String name ; private int age ; //定义一个Person类的构造函数 //构造函数,而且是空参数的 Person(){ System.out.println("person run"); } public void speak(){ System.out.println(name + ":" + age); } } class ConsDemo{ public static void main(String[] args){ //构造函数:构建创造对象时调用的函数 //作用:可以给对象进行初始化 Person p = new Person(); p.speak(); } }
运行结果: person run null:0
那么问题来了
1、一般函数和构造函数什么区别呢?
构造函数:对象创建时,就会调用与之对应的构造函数,对对象进行初始化。
一般函数:对象创建后,需要函数功能时才调用。
构造函数:对象创建时,会调用并且只调用一次。
一般函数:对象创建后,可以被调用多次。
2、创建对象都必须要通过构造函数初始化。
一个类中如果没有定义过构造函数,那么该类中会有一个默认的空参数构造函数。
如果在类中定义了指定的构造函数,那么类中的默认构造函数就没有了。
3、多个构造函数是以重载的形式存在的。
示例:
class Person{ private String name ; private int age ; Person(){ name = "baby" ; age = 1; System.out.println("person run"); } //如果有的孩子一出生就有名字 Person(String n){ name = n; } //如果有的孩子一出生就有名字和年龄 Person(String n, int a){ name = n; age = a; } public void speak(){ System.out.println(name + ":" + age); } } class ConsDemo{ public static void main(String[] args){ Person p1 = new Person(); p1.speak(); Person p2 = new Person("小李" ); p2.speak(); Person p3 = new Person("小张" ,10); p3.speak(); } }
运行结果: person run baby:1 小李:0 小张:10
八、this关键字
定义: this代表其所在函数所属对象的引用。换言之,this代本类对象的引用。用途:当成员变量和局部变量重名,可以用关键字this来区分,this就是所在函数所属对象的引用。
简单说,哪个对象调用了this所在的函数,this就代表哪个对象。一般方法调用默认加this。
什么时候使用this关键字呢?
当在函数内部需要用到调用该函数的对象时,就用this。
(简言之:本类功能内部用调用本类对象时,用this)
示例:
class Person{ private String name ; private int age ; Person(String name){ //通过this区分成员变量和局部变量 this.name = name; } Person(String name, int age){ //this也可以用于在构造函数中调用其他构造函数 this(name);//初始化赋值必须先执行,;因此要放在构造函数的第一行,否则报错 this.age = age; } public void speak(){ System.out.println(name + ":" + age); } } class ConsDemo{ public static void main(String[] args){ Person p1 = new Person("lisi" ); p1.speak(); Person p2 = new Person("zhangsan" ,30); p2.speak(); } }
运行结果: lisi:0 zhangsan:30
注意:通过this在构造函数中调用其他构造函数的时候,只能定义在构造函数的第一行,因为初始化动作要先执行,否则就会报错。
this关键字的使用示例:
class Person{ private String name ; private int age ; Person(String name, int age){ this.name = name; this.age = age; } /* 判断是否是同龄人 */ public boolean compare(Person p){ return this.age == p.age;//这里用到了this关键字表示本人,和另一个人进行年龄的比较 } } class compareDemo{ public static void main(String[] args){ Person p1 = new Person("lisi" ,20); Person p2 = new Person("zhangsan" ,20); System.out.println(p1.compare(p2)); } }
运行结果: true
相关文章推荐
- 开发人员、程序员与计算机科学家三者之间的区别
- 程序员必备,程序员四大忌
- 程序员们,做好你手里的俩份试卷
- 主页木马的制作方法
- 解密网页加密的两个方法
- 定义标题的最好方法
- 程序员必备的10大健康装备! 我们要工作更要健康!
- Ruby简明教程之方法(Method)介绍
- Ruby基础知识之方法、代码段
- C#获取文件夹及文件的大小与占用空间的方法
- Delphi控件ListView的属性及使用方法详解
- VB6实现连接Access数据库的ADODB代码实现方法
- C#中面向对象编程机制之多态学习笔记
- C#中this指针的用法示例
- 浅谈Lua的面向对象特性
- Lua面向对象之类和继承浅析
- 一篇关于程序员性格的文章第1/3页
- JavaScript面向对象的两种书写方法以及差别
- 浅谈c# 面向对象之类与对象
- MySQL重定位数据目录的方法