黑马程序员--面对对象1

时间:2021-04-02 04:05:16

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

主要内容:

一、面向对象概念

二、类与对象的关系

三、面向对象的主要特征

四、成员变量与局部变量的区别

五、匿名对象

六、构造函数和构造代码块

七:几个关键字(private this static)


一、面向对象概念
1.1 理解面向对象:
面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。
(1)面向对象是相对面向过程而言
(2)面向对象和面向过程都是一种思想
(3)面向过程 : 强调的是功能行为
面向对象 :将功能封装进对象,强调具备了功能的对象。
(4)面向对象是基于面向过程的。 

 1.2面向对象的特点:

是一种符合人们思考习惯的思想,可以将复杂的事情简单化,将程序员从执行者转换成了指挥者。 

完成需求时:

先要去找具有所需的功能的对象来用。
如果该对象不存在,那么创建一个具有所需功能的对象。
这样简化开发并提高复用。
二、类与对象的关系
类:对现实生活中事物的描述,它将数据以及这些数据上的操作封装在一起。
对象:就是这类事物,实实在在存在的
类是对象的抽象,而对象是类的具体实例。类是抽象的,不占用内存,而对象是具体的,占用存储空间。类是用于 创建对象的蓝图,它是一个定义包括在特定类型的对象中的方法和变量的软件模板。
映射到java中,描述就是class定义的类。具体对象就是对应java在堆内存中用new建立实体。

三、面向对象的主要特征

计算机软件系统是现实生活中的业务在计算机中的映射,而现实生活中的业务其实就是一个个对象协作的过程。面向对象编程就是按现实业务一样的方式将程序代码按一个个对象进行组织和编写,让计算机系统能够识别和理解用对象方式组织和编写的程序代码,这样就可以把现实生活中的业务对象映射到计算机系统中。

面向对象的编程语言有封装、继承 、抽象、多态等4个主要的特征。   
封装:  

封装是保证软件部件具有优良的模块性的基础,封装的目标就是要实现软件部件的“高内聚、低耦合”,防止程序相互依赖性而带来的变动影响。在面向对象的编程语言中,对象是封装的最基本单位,面向对象的封装比传统语言的封装更为清晰、更为有力。面向对象的封装就是把描述一个对象的属性和行为的代码封装在一个“模块”中,也就是一个类中,属性用变量定义,行为用方法进行定义,方法可以直接访问同一个对象中的属性。通常情况下,只要记住让变量和访问这个变量的方法放在一起,将一个类中的成员变量全部定义成私有的,只有这个类自己的方法才可以访问到这些成员变量,这就基本上实现对象的封装,就很容易找出要分配到这个类上的方法了,就基本上算是会面向对象的编程了。把握一个原则:把对同一事物进行操作的方法和相关的方法放在同一个类中,把方法和它操作的数据放在同一个类中。  

例如,人要在黑板上画圆,这一共涉及三个对象:人、黑板、圆,画圆的方法要分配给哪个对象呢?由于画圆需要使用到圆心和半径,圆心和半径显然是圆的属性,如果将它们在类中定义成了私有的成员变量,那么,画圆的方法必须分配给圆,它才能访问到圆心和半径这两个属性,人以后只是调用圆的画圆方法、表示给圆发给消息而已,画圆这个方法不应该分配在人这个对象上,这就是面向对象的封装性,即将对象封装成一个高度自治和相对封闭的个体,对象状态(属性)由这个对象自己的行为(方法)来读取和改变。一个更便于理解的例子就是,司机将火车刹住了,刹车的动作是分配给司机,还是分配给火车,显然,应该分配给火车,因为司机自身是不可能有那么大的力气将一个火车给停下来的,只有火车自己才能完成这一动作,火车需要调用内部的离合器和刹车片等多个器件协作才能完成刹车这个动作,司机刹车的过程只是给火车发了一个消息,通知火车要执行刹车动作而已。  

抽象:  

抽象就是找出一些事物的相似和共性之处,然后将这些事物归为一个类,这个类只考虑这些事物的相似和共性之处,并且会忽略与当前主题和目标无关的那些方面,将注意力集中在与当前目标有关的方面。例如,看到一只蚂蚁和大象,你能够想象出它们的相同之处,那就是抽象。抽象包括行为抽象和状态抽象两个方面。例如,定义一个Person类,如下:

 
 

class Person
{
String name;
int age;
}

人本来是很复杂的事物,有很多方面,但因为当前系统只需要了解人的姓名和年龄,所以上面定义的类中只包含姓名和年龄这两个属性,这就是一种抽像,使用抽象可以避免考虑一些与目标无关的细节。我对抽象的理解就是不要用显微镜去看一个事物的所有方面,这样涉及的内容就太多了,而是要善于划分问题的边界,当前系统需要什么,就只考虑什么。

继承:  

在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并可以加入若干新的内容,或修改原来的方法使之更适合特殊的需要,这就是继承。继承是子类自动共享父类数据和方法的机制,这是类之间的一种关系,提高了软件的可重用性和可扩展性。  

多态:  

多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。多态性增强了软件的灵活性和扩展性。例如,下面代码中的UserDao是一个接口,它定义引用变量userDao指向的实例对象由daofactory.getDao()在执行的时候返回,有时候指向的是UserJdbcDao这个实现,有时候指向的是UserHibernateDao这个实现,这样,不用修改源代码,就可以改变userDao指向的具体类实现,从而导致userDao.insertUser()方法调用的具体代码也随之改变,即有时候调用的是UserJdbcDao的insertUser方法,有时候调用的是UserHibernateDao的insertUser方法:

 
 

UserDao userDao = daofactory.getDao(); userDao.insertUser(user);

比喻:人吃饭,你看到的是左手,还是右手?

面向对象开发的特征:

开发的过程:其实就是不断的创建对象,使用对象,指挥对象做事情。 
设计的过程:其实就是在管理和维护对象之间的关系。 
四、成员变量与局部变量的区别:
成员变量: 
  1. 成员变量定义在类中,在整个类中都可以被访问。  
  2. 成员变量随着对象的建立而建立,存在于对象所在的堆内存中。  
  3. 成员变量有默认初始化值。  
局部变量:  
  1. 局部变量只定义在局部范围内,如:函数内,语句内等。  
  2. 局部变量存在于栈内存中。  
  3. 作用的范围结束,变量空间会自动释放。  
  4. 局部变量没有默认初始化值。
  五、匿名对象:
匿名对象是对象的简化形式   
匿名对象两种使用情况 
  1. 当对对象方法仅进行一次调用的时 
  2. 匿名对象可以作为实际参数进行传递 
如:
 
 

class Car { //描述颜色 String color = "红色"; //描述轮胎数 int num = 4; //运行行为。 void run() { System.out.println(color+".."+num); } }

class CarDemo { public static void main(String[] args) { new Car().num = 5; new Car().color = "blue"; new Car().run(); //匿名对象使用方式一:当对对象的方法只调用一次时,可以用匿名对象来完成,这样写比较简化并且用匿名对象调用属性是没有  //意义的。

  //如果对一个对象进行多个成员调用,必须给这个对象起个名字。

Car q = new Car(); show(q); //show(new Car()); //匿名对象使用方式二:可以将匿名对象作为实际参数进行传递。 } //需求:汽车修配厂。对汽车进行改装,将来的车都改成黑车,三个轮胎。 public static void show(Car c) { c.num = 3; c.color = "black"; c.run(); } }

六、构造函数和构造代码块
构造函数特点: 
 1. 函数名与类名相同 
 2. 不用定义返回值类型 
 3. 不可以写return语句  
 对象一建立就会调用与之对应的构造函数。
 
构造函数的作用:可以用于给对象进行初始化。
 
构造函数的小细节:
 当一个类中没有定义构造函数时,那么系统会默认给该类加入一个空参数的构造函数。
 当在类中自定义了构造函数后,默认的构造函数就没有了。

构造函数和一般函数在写法上有不同。
 在运行上也有不同。
 构造函数是在对象一建立就运行。给对象初始化。
 而一般方法是对象调用才执行,是给对象添加对象具备的功能。
 一个对象建立,构造函数只运行一次。
 而一般方法可以被该对象调用多次。
 什么时候定义构造函数呢?
 当分析事物时,该事物存在具备一些特性或者行为,那么将这些内容定义在构造函数中。

构造代码块。
作用:给对象进行初始化。
  对象一建立就运行,而且优先于构造函数执行。
和构造函数的区别:
  构造代码块是给所有对象进行统一初始化,
  而构造函数是给对应的对象初始化。
  构造代码块中定义的是不同对象共性的初始化内容。
默认的空参数的构造函数的特点:
  这个默认的构造函数的权限和所属类一致。
  如果类被public修饰,那么默认的构造函数也带public修饰符。
  如果类没有被public修饰,那么默认的构造函数,也没有public修饰。
 
  默认构造构造函数的权限是随着的类的变化而变化的。
七:几个关键字(private this static)
private关键字: 
  1. 是一个权限修饰符。 
  2. 用于修饰成员(成员变量和成员函数) 
  3. 被私有化的成员只在本类中有效。 
常用之一: 
   将成员变量私有化,对外提供对应的set ,get 方法对其进行访问。提高对数据访问的安全性。 
this:
 就代表本类的对象,到底代表哪一个呢?
 this代表它所在函数所属对象的引用。
 简单说:哪个对象在调用this所在的函数,this就代表哪个对象。
 this的应用:当定义类中功能时,该函数内部要用到调用该函数的对象时,这时用this来表示这个对象。但凡本类功  能内部使用了了本类对象,都用this表示。
静态:static。
 用法:是一个修饰符,用于修饰成员(成员变量,成员函数).
 当成员被静态修饰后,就多了一个调用方式,除了可以被对象调用外,
 还可以直接被类名调用。类名.静态成员。
static特点:
 1,随着类的加载而加载。 也就说:静态会随着类的消失而消失。说明它的生命周期最长。
 2,优先于的对象存在  明确一点:静态是先存在。对象是后存在的。
 3,被所有对象所共享
 4,可以直接被类名所调用。
实例变量和类变量的区别:
 1,存放位置。
  类变量随着类的加载而存在于方法区中。
  实例变量随着对象的建立而存在于堆内存中。
 2,生命周期:
  类变量生命周期最长,随着类的消失而消失。
  实例变量生命周期随着对象的消失而消失。
静态使用注意事项:
 1,静态方法只能访问静态成员。
  非静态方法既可以访问静态也可以访问非静态。
 2,静态方法中不可以定义this,super关键字。
  因为静态优先于对象存在。所以静态方法中不可以出现this。
 3,主函数是静态的。    
静态有利有弊
 利处:对对象的共享数据进行单独空间的存储,节省空间。
 没有必要每一个对象中都存储一份。可以直接被类名调用。
 弊端:生命周期过长。
 访问出现局限性。(静态虽好,只能访问静态。)