黑马程序员_Java面向对象下

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

 

        继承:继承的概述,继承的特点,super关键字,函数覆盖,子类的实例化过程,final关键字。

继承的概述 :继承提高了代码的复用性。让类与类之间产生了关系。有了这个关系,才有了多态的特性。

注意:类与类之间必须有所属关系才可以继承,不要为了获取其他类的功能,简化代码而继承。 先有父类,再有子类。父类是从子类中不断向上抽取共性内容得到的。Java语言中,只支持单继承,不支持多继承。

Java支持多层继承,也就是一个继承体系。

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

想要使用体系,先查阅体系父类的描述,因为父类中定义的是该体系中共性功能。通过了解共性功能,就可以知道该体系的基本功能,那么这个体系已经可以基本使用了。

在具体调用时,要创建最子类的对象。因为有可能父类不能创建对象。创建子类对象可以使用更多的功能,包括基本的和特有的。

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

 

子父类出现后,类成员(变量,函数,构造函数)的特点:

1.变量:如果子类中出现非私有的同名成员变量时,子类要访问本类中的变量,用this。子类要访问父类中的同名变量用super。

super的使用与this的使用几乎一致。this代表的是本类对象的引用,super代表的是父类对象的引用。

2.子父类中的函数:当子类出现和父类一模一样的函数时,当子类对象调用该函数,会执行子类函数的内容。如同父类的函数被覆盖一样。这种情况是函数的另一种特性:覆盖。

覆盖注意事项:

a.子类覆盖父类,必须保证子类权限大于等于父类权限,才可以覆盖。否则编译失败。

b.静态只能覆盖静态。

记住:重载只看同名函数的参数列表。覆盖:子父类方法要一模一样,包括返回值类型。

3.子父类中的构造函数:在对子类对象进行初始化时,父类的构造函数也会运行。那是因为子类的构造函数默认第一行有一条隐式的语句super()。super()会访问父类中空参数的构造函数,而且子类中所有的构造函数默认第一行都是super()。如果要访问父类中指定的构造函数,可以通过手动定义super语句的方式来指定。

为什么子类一定要访问副类中的构造函数?

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

 

子类的实例化过程:子类的所有构造函数,默认都会访问父类中空参数的构造函数,因为子类中的每一个构造函数默认第一行有一条隐式的语句super()。

当父类中没有空参数的构造函数时,子类必须手动通过super语句的方式来指定要访问父类中的构造函数。当然子类的构造函数第一行也可以手动直到this语句来访问本类中的构造函数。子类中至少有一个构造函数会访问父类中的构造函数。

 

final关键字:

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

2.final修饰的类不可以被继承。

3.final修饰的方法不可以被覆盖。

4.final修饰的变量是一个常量,只能被赋值一次。可以修饰成员变量和局部变量。

5.内部类只能访问被final修饰的局部变量。

注意:final修饰的变量是一个常量。常量的书写规范是所有字母都大写。如果由多个单词组成,单词间通过_连接。

 

抽象类:

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

关键字abstract:抽象。

抽象类的特点:

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

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

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

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

抽象类和一般类的区别:抽象类比一般类多了个抽象函数。抽象类不可以实例化。

特殊:抽象类中可以不定义抽象方法,这样做仅仅是不让该类建立对象。

模板方法:在定义功能时,功能的一部分是确定的,但是有一部分是不确定的。而确定的部分在使用不确定的部分。那么这时就将不确定的部分暴露出去,由该类的子类去完成。这种方式,称之为模板方法设计模式 。

 

接口:

格式:interface{}

接口中的成员修饰符是固定的。

成员变量:public static final

成员函数:public abstract

接口的出现将“多继承”通过另一种形式体现出来,即“多实现”。

注意:接口中的成员都是public的。

            接口是不可以创建对象的。因为有抽象方法。需要被子类实现。子类对接口中的抽象方法全部覆盖后,子类才可以实例化,否则子类是一个抽象类。

            类继承(extends)类,因为父类中有非抽象方法可直接拿过来用。类实现(implements)接口,因为接口中的方法全都是抽象的,需要子类全部复写后才能用。简言之,实现子类要写内容,继承子类不用写内容,直接用方法。

接口的特点:

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

2.接口是程序的功能扩展,降低了程序之间的耦合性。

3.接口可以用来多实现。

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

5.接口与接口之间可以有继承关系,而且可以多继承。

注意:基本功能定义在类中,扩展功能定义在接口中。

 

多态:

定义:某一类事物的多种存在形态。

例如:动物中的猫,狗。

            猫这个对象对应的类型是猫类型:猫 x=new 猫();

            同时猫也是动物中的一种,也可以把猫称为动物:动物 y=new 猫();

            动物是猫和狗具体事物中抽取出来的父类型。父类型引用指向了子类对象。

多态的体现:父类的引用可以接收自己的子类对象。如:Animal c=new Cat();

多态的前提:必须是类与类之间有关系。要么继承,要么实现。通常还有一个前提,存在覆盖。

多态的好处:多态的出现大大的提高程序的扩展性。

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

注意:Animal a=new Cat(); 这种方式叫类型提升,也称为向上转型,会自动完成。

            Cat c=(Cat)a;   这种方式叫强制将父类的引用转成子类类型,称为向下转型。

            千万不要将父类对象转成子类类型。我们能转换的是父类引用指向自己的子类对象时,该引用可以被提升,也可以被强制转换。

关键字instanceof:谁的实例。

作用:判断子类型是哪种所属类型,以便使用所属类型特有的方法。

多态的代码中的特点:

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

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

在运行时期,参阅对象所属的类中是否有调用方法。

简单总结就是,非静态成员函数在多态调用时,编译看左边,运行看右边。

在多态中成员变量的特点:无论编译和运行,都参考左边。

在多态中静态成员函数的特点:无论编译和运行,都参考左边。因为在加载时,静态成员函数不需要对象,可直接被类名调用。所以它只看引用对象的所属的类,而不属于对象。

Object类中的equals方法:

Object类:是所有对象的直接后者或间接父类。该类中定义的肯定是所有对象都具备的功能。

equals():比较对象是否相同的方法。如果自定义类中也有比较相同的功能,没有必要重新定义。只要沿袭父类Object的equals()功能,建立自己的比较内容即可。

 

内部类:将一个类定义在另一个类的里面,对里面那个类就称为内部类(内置类,嵌套类)。

访问特点:内部类可以直接访问外部类中的成员,包括私有成员。而外部类要访问内部类中的成员必须要建立内部类的对象。

注:内部类之所以可以直接访问外部类中的成员,是因为内部类中持有了一个外部类的引用:外部类名.this

访问格式:

1.当内部类定义在外部类的成员位置上,而且非私有,可以在外部其他类中,直接建立内部类对象。格式:外部类名.内部类名   变量名=外部类对象.内部类对象;

如:Outer.Inner  in=new Outer().new Inner();

2.当内部类在成员位置上,就可以被成员修饰符所修饰。

如:private,将内部类在外部类中进行封装。

        static,内部类就具备静态的特性。当内部类被static修饰后,只能直接访问外部类中的静态成员,出现了访问局限。

注意:当内部类中定义了静态成员,该内部类必须是静态的。当外部类中的静态方法访问内部类时,内部类也必须是静态的。

内部类的应用:

当描述事物时,事物的内部还有事物,该事物用内部类来描述。因为内部事物在使用外部事物的内容。

注意:一般将内部类用private封装在外部类中。在外部类中提供访问内部类成员的方法。

内部类定义在局部时:不可以被成员修饰符修饰。可以直接访问外部类中的成员,但是不可以访问它所在的局部中的变量,只能访问被final修饰的局部变量。

匿名内部类:匿名内部类其实就是内部类的简写格式。

定义匿名内部类的前提:

内部类必须是继承一个类或者实现接口。

匿名内部类的格式:

new  父类或者接口(){定义子类的内容}

注:其实匿名内部类就是一个匿名子类对象。可以理解为带内容的对象。

        匿名内部类中定义的方法最好不要超过3个。

 

异常:

异常是对问题的描述。将问题进行对象的封装。

异常体系:

Throwable

       |--Error(一般不编写针对性的代码对其进行处理)

       |--Exception(可以使用针对性的处理方式进行处理)

                 |--RuntimeException

异常体系的特点:异常体系中的所有类以及建立的对象都具备可抛性。也就是说可以被throw和throws关键字所修饰。只有异常体系具备这个特点。

throw和throws的用法:

throw定义在函数内,用于抛出异常对象。

throws定义在函数上,用于抛出异常类,可以抛出多个异常类,用逗号隔开。

当函数内容有throw抛出异常对象,并未进行try处理,必须要在函数上声明,否则编译失败。

注意:RuntimeException除外。也就是说,函数内如果抛出的是RuntimeException异常,函数上可以不用声明。

异常有两种:

编译时被检测异常:该异常在编译时,如果没有处理,编译失败。该异常被标识,代表该异常可以被处理。

运行时异常(编译时不检测):在编译时,不需要处理,编译器不检查。该异常的发生,建议不处理,让程序停止,需要对代码进行修正。

异常处理语句:try

                             {

                                 需要被检测的代码;

                             } 

                           catch()

                             {

                                 处理异常的代码;

                             } 

                           finally

                             {

                                 一定会执行的代码;

                             } 

有三个格式:

1. try

      {}

    catch()

      {}

2. try

      {}

    finally

      {}

3. try

      {}

    catch()

      {}

   finally

      {}

注意:finally中定义的通常是:关闭资源代码。因为资源必须释放。finally只有一种情况不会执行。当执行到System.exit(0);finally不会执行。

自定义异常:按照Java的面向对象思想,将程序中出现的特有问题进行封装。

定义类继承Exception或者RuntimeException。作用:为了让该自定义类具备可抛性。让该类具备操作异常的共性方法。

当要定义自定义异常的信息时,可以使用父类已经定义好的功能,将异常信息传递给父类的构造函数。

异常的好处:

1.将问题进行封装。

2.将正常流程代码和问题处理代码相分离,方便于阅读。

异常的处理原则:

1.处理方式有两种:try或者throws

2.调用到抛出异常的功能时,抛出几个,就处理几个。一个try对应多个catch()。

3.多个catch(),父类的catch()放到最下面。

4.catch()内,需要定义针对性的处理方式。不要简单的定义printStackTrace,输出语句,也不要不写。

当捕获到的异常,本功能处理不了时,可以继续在catch()中抛出。如果该异常处理不了,但并不属于该功能出现的异常,可以将异常转换后,再抛出和该功能相关的异常。

或者异常可以处理,当需要将异常产生的和本功能相关的问题提供出去,让调用者知道,并处理。也可以将捕获异常处理后,转换为新的异常。

异常的注意事项:

在子父类覆盖时:

1.子类抛出的异常必须是父类的异常的子类或者子集。

2.如果父类或者接口没有异常抛出时,子类覆盖出现异常,只能try不能抛。

 

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值