黑马程序员-面向对象

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

 

面向对象:

在面向对象出现之前,写程序的是使用面向过程的思想,它强调做一件事从头到尾的过程,显然,这样用这样的思想去思考问题会十分复杂和繁琐. 后来出现的面向对象的思想不用再考虑每一个动作,而是把一个事物应该具有的动作全部封装到事物里面,然后得到这个事物就等于得到这个事物所有的动作了,用这种思想思考问题可以让复杂的事物简单化, 并且让人从操作者变成了指挥者. 举一个简单的例子:做菜

用面向过程的思想考虑:

              做菜所有的过程都要亲力亲为,首先买菜,然后洗菜,切菜,炒菜,每一个过程都是自己在做,自己就是一个操作者.

用面向对象的思想考虑:

              使用一个用做菜功能的对象,请一个保姆. 保姆买菜, 保姆洗菜,保姆切菜, 保姆炒菜,,这里面的过程都不需要自己做,而是自己使用了一个封装了买菜,洗菜,切菜,炒菜等功能的对象,这么一来,做菜这件事对自己来说就显得十分简单了,并且自己的角色从一个操作者变成了一个指挥者.

 

类和对象:

       在使用面向对象的时候,首先要明白什么是类? 什么是对象? 类和对象是什么关系?

:

类是对一种事物的概述,它描述了这种事物的属性和方法,但是这只是描述,并没有明确到某个事物,比如描述人这一类事物:人有身高,体重,姓名,性别,年龄等; 描述汽车这一类事物:汽车有轮子,发动机 ,方向盘等.这样描述出一类事物,可以大概对这类事物有抽象的概念,这就是类.

对象:

对象是每一类事物的具体的,实实在在的一个个体,比如具体的某一个人,具体的某一辆车等待,对象是把类的属性和方法都具体化了.

类和对象的关系:类是对象抽象出来的共性,是对某一种事物的描述(比如汽车这一类事物);对象是类的具体,是某一类事物中实实在在的个体(比如具体的某一辆汽车).

面向对象有三个重要的特征: 封装 ,继承 ,多态

 

:     封装

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

简单的说,封装就是把不需要让别人知道的东西隐藏起来,再提供一些对外的方法来给别人访问就行了. 比如我们的电脑,电脑的主板是封装在机箱里面的,至于机箱里面的主板是怎么插的,每个零件是什么安装的,外界没有必要知道, 机箱只需要提供几个插口和按钮给外界使用就行了.这就是封装.

封装的好处:1.将变化隔离   2.便于使用   3.提高重用性   4.提高安全性

封装原则:1.把不需要对外提供的内容隐藏起来

               2.把属性都隐藏,提供公共方法对其访问

 

构造函数:

特点:1.函数名与类名相同   2.不需要返回值类型          3.不能写return语句

作用:给对象进行初始化

注意:1.对象只要已建立,就会调用其构造函数,并且构造函数只运行一次

       2.如果没有定义一个类的构造函数,系统会自动添加一个空参数的构造函数,如果自己定义了构造函数,系统就不再添加空的构造函数

 

格式:   类名(参数1,…)

              {

}

什么时候定义构造函数?

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

 

       构造代码块:

作用:给对象初始化,对象一建立就运行,而且优先于构造函数运行

和构造函数的区别:

构造代码快是给所有对象进行统一的初始化,而构造函数是个对应的对象初始化

构造代码块中定义的是不同对象共性的初始化内容

格式:     在类与方法之间  直接       {  内容 }

 

       This:

this关键字是用于区分局部变量和成员变量的同名情况,哪个对象引用带有this的方法,this就代表这个对象的引用,其实所有对象调用是都有this,只是如果局部变量和成员变量没有同名的时候,this可以省略. 调用构造函数不能像常规函数一样调用,调用方法是this(参数)

this调用构造函数的语句要放在构造函数的第一行,因为初始化动作要执行

 

Static:

用法:是一个修饰符,用于修饰成员变量或成员函数,静态修饰的内容被对象共享,当成员被静态修饰后,就多了一个调用方式,除了可以被对象调外,还可以直接被类名调用,格式是:类名.静态成员

当一个属性或方法被静态修饰后,它就从堆内存中取出来,放进方法区,方法区里面放的都是共享内容

 

特点:1.随着类的加载而加载,随着类的消失而消失,它的生命周期最长

       2.优先于对象存在

       3.被所有对象共享

       4.可以直接被类名调用

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

1.       存放位置:类变量随着类的加载而存在于方法区中;

实例变量随着对象的加载而存在与堆内存中.

2.       生命周期:类变量生命周期最长,随着类的消失而消失;

实例变量随着对象的消失而消失.

 

注意:

1.       静态方法不能访问非静态方法,因为静态方法定义时,还没有对象,所以没有非静态方法

2.       静态方法中不可以定义this

 

静态的利弊:

       :对对象的共享数据进行单独空间的存储,节省空间;可以直接被类名调用

:生命周期太长,访问有局限性.

 

:继承

继承是面向对象的另一个特征. A类继承B,那么A类就拥有了B类所有的非私有方法,比如:猫是哺乳动物,猫继承自哺乳动物,所以猫具有哺乳动物的特性.

继承的特点:1.提高代码的复用性

       2.让类和类之间产生关系,有了关系,才有多态的特性

被继承的类叫父类,需要继承的类叫子类,比如人是父类,学生是子类

 

继承格式:

Class 子类名 extends 父类名

{

}

 

Java语言中,只支持单继承,不支持多继承,因为多继承容易带来安全隐患:当父类中定义了相同功能,但是功能内容不同,此时子类不知道运行哪一个.

也就是说一个子类不能继承多个父类,但是java支持多层继承

 

如何使用一个继承体系的功能:

1.       先查阅体系父类的描述,因为父类定义了该体系的共性功能,通过了解这些共性功能就可以知道该体系的基本功能

 

在具体使用时,要创建最子类的对象,因为:

1.有可能父类不能创建对象

2.创建子类对象,可以即使用子父类的功能.又使用子类的功能

简单一句话,查阅父类功能,创建子类对象使用功能

 

子父类出现后,成员变量的特点:

   如果子类中的成员变量和父类中的成员变量同名,要访问父类的成员变量要super.变量名

Super代表父类对象的引用

 

子父类中的函数的特点:

 

 当子类出现和父类一样的函数时,调用此函数时,执行子类函数的内容,如同把父类的函数覆盖了,这是函数的一种新特性,叫做重写(覆盖)

 

当子类继承父类,子类具备父类的功能,但是功能的内容不同,这时没有必要定义新功能,只需要使用覆盖,保留父类的功能,并重写功能内容

 

注意:

1.       需要覆盖时,子类中函数的权限要>=父类的函数权限

2.       子类中要覆盖父类的方法,必须要和父类方法定义格式一样,包括返回类型,参数,和方法名

 

子父类中的构造函数

 在对子类对象初始化的时候,父类的构造函数也会运行,那是因为子类的构造函数默认第一行有一条隐式的语句super(),super()会访问父类中空参数的构造函数,而且子类中所以构造函数默认第一行都是super()

 

为什么子类一定要访问父类的构造函数:

因为父类中的数据子类可以直接获取,所以子类对象在建立时,需要先查看父类是如何对这些数据初始化的,所以子类在对象初始化的时候,要先访问父类中的构造函数

如果要访问父类中指定的构造函数,可以通过super()语句来指定

 

子类的实例化过程:

子类的所以构造函数都会默认访问父类中的空参数构造函数,因为子类每一个构造函数的第一行都是隐式的super()

当父类么有空参数构造函数时,在子类中必须手动通过super()来指定访问父类中的构造函数

 

final:

特点:

1.       可以修饰类,方法,变量

2.       final修饰的类不能被继承

3.       final修饰的方法不能被复写

4.       变量被final修饰后,就变成了常量,不能再改变了

 

抽象:

当多个类中出现相同功能,但是功能主体不同,这时可以进行向上抽取,至抽取方法定义,不抽取方法主体

 

抽象类特点:

1.       抽象方法一定在抽象类中

2.       抽象方法和抽象类都必须用abstract关键字修饰

3.       抽象类不可以用new创建对象,因为调用抽象方法没意义

4.       抽象类中的抽象方法要被调用,必须由子类复写所有抽象类中的方法后,创建子类对象调用,如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类

 

接口:

接口在理解上可以理解为一个特殊的抽象类,这个抽象类的方法全部都是抽象的.

接口中所有的方法都是抽象的,所有的属性都是常量

接口定义格式:  interface{   语句 },相当于一个特殊的类

接口中的方法定义格式:public abstract void Show();         //方法是抽象的

接口中的常量定义格式:public static final int num=3;               //常量

接口不可以创建对象,只能由子类来把所有的方法全部实现

子类实现格式: class 子类名implements接口名 { }

 

接口和抽象类的异同:

1.抽象类是一个类,abstract class 修饰;接口相当于一个特殊类,但是不是类,interface修饰

        2.抽象类里面可以有非抽象方法,但是接口里面不能有非抽象方法;抽象类里面可以有变量,但是接口里面只能有常量

        3.抽象类里面的成员可以自定义访问修饰符,但是接口里面的访问修饰符只能是public

:  1.抽象类和接口里面都有抽象方法

        2. 子类必须复写全部抽象方法才能创建对象

        3. 抽象类和接口都不能创建对象

 

接口的特点:

1.       接口是对外暴露的规则

2.       接口是程序的功能扩展

3.       接口可以用来多实现

4.       类与接口之间是实现关系,而且类可以继承一个类的同时实现多个接口

5.       接口与接口之间有继承关心

 

 

Java中类与类之间不支持多继承,但是支持多实现;接口与接口之间支持多继承

: class A implements B,C{} //类的多实现

   Interface A extends C,D{} //接口的多继承

类可以在继承类的同时进行多实现

: class A extends B implements C,D{} //继承类的同时进行多实现

 

 

:多态

多态,简单的理解就是一种事物的不同的表现形态,比如人这个事物,它有男人和女人这两种不同的表现形态,再比如动物,它有猫,,,羊等不同的表现形态.

1.       多态的体现:父类的引用指向自己的子类对象

2.       多态的前提:类与类之间必须有继承或者实现的关系

3.       多态的好处:提高程序的扩展性

4.       多态的弊端:提高了扩展性,但是只能使用父类的引用访问父类中的成员

 

多态转型:

当父类的引用指向子类对象的时候,此时的子类会自动转型成父类类型

比如:Animal a=new Car()      //此时Car就自动向上转型

如果要使用子类中特有的方法时,可以把向上转型后的子类强制向下转型成子类类型

比如:Car c=(Car) a;       //向下转型,然后再用c.方法名类调用子类特有的方法

 

判断变量是否属于某种类型:

格式: 要判断的类型 instanceof 数据类型    比如: a instanceof Car   判断a是否属于Car类型

 

多态中成员函数的特点:

在编译时,参阅引用型变量所属的类中是否有调用的方法,如果有,编译通过,如果没有则失败.

在运行时,参阅对象所属的类中是否有调用的方法,如果有,编译通过,如果没有则失败.

简单总结就是:成员函数的多态调用时,编译看左边,运行看右边.

 

在多态中,成员变量的特点:

无论编译和运行,都参考左边(引用型变量所属的类)

在多态中,静态成员函数的特点:

无论编译和运行,都参考左边

 

 

 

 

 

 

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

详细请查看:http://edu.csdn.net/heima

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值