黑马程序员_java面向对象_多态和异常

来源:互联网 发布:大数据产业链包括哪些 编辑:程序博客网 时间:2024/05/29 19:35
多态
一、概述:
      多态可以理解为事物存在的多种体现形态。
      例:动物中猫,狗。猫这个对象对应的类型是猫类型,如:猫 x = new(); 同时猫也是动物中的一种,也可以把猫称为动物。动物  y = new(); 那么   动物就是猫和狗具体事物中抽取出来的父类型。父类型引用指向了子类对象。

二、多态的体现

      1、父类的引用指向了自己子类的对象。 

        2、父类的引用也可以接收自己的子类对象。

三、多态的前提

      1、类与类之间必须有关系,要么继承,要么实现。

        2、存在覆盖。父类中有方法被子类重写。

四、多态的利与弊

      利:提高了程序的可扩展性和后期可以维护性。

      弊:只能使用父类中的引用访问父类中的成员。也就是说使用了多态,父类型的引用在使用功能时,不能直接调用子类中的特有方法。

     注:如果父类可以创建对象,如:Animal a = new Animal(); 此时,就不能向下转型了,Cat c = (Cat)a; 这样的代码就变得不容许,编译时会报错。所以千万不能出现这样的操作,就是将父类对象转成子类类型。

五、多态的特点

        1、多态中非静态成员函数的特点

              成员函数在多态调用时,编译看左边,运行看右边。

      2、多态中成员变量的特点

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

      3、多态中静态成员函数的特点

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

     多态的特点例子代码如下:

    /**      * 多态中成员变量、非静态函数、静态函数的特点演示      * @author liufeibo 2015     */      class Person      {          String name;          int age=25;//父类对年龄初始化          Person(String name)          {              this.name=name;          }          public static void show()          {              System.out.println("speak");          }          public  void study()          {              System.out.println("study");          }      }      class Student extends Person//继承父类      {          int age=18;//子类对年龄初始化          Student(String name)          {              super(name);          }          public static void show()//复写父类的静态函数          {              System.out.println("Student speak");          }          public  void study()//复写父类的非静态函数          {              System.out.println("Student study");          }      }      public class DuoTai       {          public static void main(String[] args)          {              Person p=new Student("zhangsan");              System.out.println(p.age);//输出结果为25,父类的属性值              p.show();//输出结果为speak,调用了父类的静态函数              p.study();//输出结果为Student study,调用了子类的非静态函数          }      }  


异常

一、概述

        1、异常:就是程序在运行时出现不正常情况。

        2、异常由来:问题也是现实生活中一个具体的事物,也可以通过java的类的形式进行描述。并封装成对象。其实就是java对不正常情况进行描述后的对象体现。

        3、程序可能出现的错误或问题

                a、用户输入错误导致的异常:如用户不正常使用程序,输入一些非法参数

                b、设备硬件等发生的错误:如硬盘损坏等

                c、物理限制:如存储空间不足等

                d、代码错误:在程序编写的方法可能不正确,返回错误参数等。

二、异常体系

     1、 Throwable

                |---Error  //严重的问题,一般不编写针对性的代码对其进行处理

                |---Exception //非严重的问题,使用针对性的处理方式进行处理。

                            |---R       untimeException    //特殊异常类,抛时不需要声明

         ExceptionError的子类名都是以父类名作为后缀,且都具有一些共性内容。

      2、异常体系的特点:

          1、异常体系中的所有类以及建立的对象都具备可抛性。

             2、也就是说可以被throwthrows关键字所操作。

          3、只有异常体系具备这个特点。

三、异常有两种:

      1、编译时被检测异常

              该异常在编译时,如果没有处理(没有抛也没有try),编译失败。该异常被标识,代表着可以被处理。

        2、运行时异常(编译时不检测)

             在编译时,不需要处理,编译器不检查。该异常的发生,建议不处理,让程序停止。需要对代码进行修正。如:RuntimeException以及其类。

四、异常的处理

        1 java提供了特有的语句进行处理。

            try

             {

                      需要被检测的代码。

             }

             catch(异常类  变量)

             {

                      处理异常的代码;(处理方式)

             }

              finally

              {

                     一定会执行的语句;

               }

       注:try可单独与catch组合;try也可单独与finally组合。特殊:当执行到System.exit(0);fianlly不会执行。

     2throwthrows的用法

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

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

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

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

五、对捕获到的异常对象进行常见方法操作:

        1、String getMessage();//获取异常的信息。返回字符串。

        2、toString();//获取异常类名和异常信息,返回字符串。

        3、printStackTrace();//获取异常类名和异常信息,以及异常出现在程序中的位置.返回值void.

       4、 printStackTrace(PrintStream s)//通常用该方法将异常内容保存在日志文件中,以便查阅。

六、自定义异常

        因为项目中会出现特有的问题,而这些问题并未被java所描述并封装对象。所以对这些特有的问题可以按照java中的面向对象思想。将特有的问题,进行自定义的异常封装。定义类继承Exception或者RuntimeException

        1,为了让该自定义类具备可抛性。

        2,让该类具备操作异常的共性方法。

七、异常的处理原则

     1、函数内容如果抛出需 要检测的异常,那么函数上必须要声明。否则,必须在函数内用try/catch捕捉,否则编译失败。
     2、如果调用到了声明异常的函数,那么try/catch,要么throws,否则编译失败。    

     3、什么时候catch,什么时候throws呢?功能内容可以解决,用catch。 解决不了,用throws告诉调用者,由调用者解决。
     4、一个功能如果抛出了多个异常,那么调用时,必须有对应多个catch进行针对性处理。
         内部有几个需要检测的异常,就抛几个异常,抛出几个,就catch几个。

八、自定义异常示例代码:

/*求长方形和圆的面积*/class MyException extends RuntimeException  //自定义一个异常类{MyException(String meg){super(meg);   //调用父类中的构造器}}class Area2{private int len,wid,sum;//len和win进行初始化Area2(int len,int wid){this.len=len;this.wid=wid;}public int show(){if(len<=0 || wid<=0){throw new MyException("长与宽有的小于等于0啦");}return sum=len*wid;}}class ExceptionDemo2 {public static void main(String[] args) {Area2 a=new Area2(-3,4);   int x=a.show();   System.out.println(x);System.out.println("over");}}

        
0 0
原创粉丝点击