黑马程序员-Java语言基础–面向对象 第9天

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

 

1、内部类

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

 

内部类的访问规则:

1、内部类可以直接访问外部类中的成员,包括私有

      之所以内部类能够直接访问外部类中的成员,是因为内部类中持有了一个外部类的引用。该引用格式:外部类名.this(Outer.this)

2、外部类要访问内部类,必须要建立内部类对象。

 

内部类的位置

1.内部类定义在成员位置上

      ·可以被private static 成员修饰符修饰。

      ·被static修饰的内部类只能访问外部类中的静态成员。

2.内部类定义在局部位置上:(局部内部类不能定义为static)[day09-04]

      ·也可以直接访问外部类中的成员。因为还持用外部类中的引用。

      ·同时可以访问所在局部中的局部变量,但必须是被final修饰的。

      ·不可以被成员修饰符修饰

class Outer

{

      int x = 3;

      void method(final int a)

      {

           //a++;a为final型后,被锁定。

           final int y = 4;//可以定义一些局部变量。但必须为final型。

           class Inner//内部类定义在局部。

           {

                 void function()

                 {

                      System.out.println(a);

                      //System.out.println(Outer.this.x);

                 }

           }

           new Inner().function();//非静态,没对象,不运行,so,建立一个对象。                           

      }

}

定义在局部的内部类,必须在局部位置创建自己的对象以供外界访问。

 

 

访问格式:

1、当内部类定义在外部类的成员位置上,而且非私有,可以在外部其他类中。

      可以直接建立内部类对象。

      格式: 

      外部类名.内部类名  变量名 = 外部类对象.内部类对象;

      Outer.Innerin = new Outer().new Inner();(外部类直接访问内部类的方式)

 

2、当内部类在成员位置上时(可以被私有),就可以被成员修饰符所修饰。

      比如,private:将内部类在外部类中进行封装。对外仅提供方法进行访问。

              static:内部类就具有static的特性。

      当内部类被static修饰后,只能直接访问外部类中的static成员。出现访问局限。

 

      在外部其他类中,如何直接访问静态static内部类的非静态成员?[day09-02]

      newOuter.Inner().function();//方法function()非静态时。

class Outer

{

      private static int x = 3;    

      static class Inner//静态内部类

      {

                 void function()

           {

          System.out.println(“inner : ”+x);                                                                              

       }

   }

}

New 内部类对象进行调用。

 

      在外部其他类中,如何直接访问静态static内部类的静态成员?

      Outer.Inner.function();//方法function()静态时。

class Outer

{

      private static int x = 3;    

      static class Inner//静态内部类 static class Inner                                                                

      {

                 static void function()

           {

          System.out.println(“inner :”+x);

       }

   }

}

方法也静态,直接类名.方法 调用

 

注意:当内部类中定义了静态成员,该内部类必须是静态static的。

        当外部类中的静态方法访问内部类时,内部类也必须是static的.

 

当描述事物时,事物的内部还有事物,该事物用内部类来描述。

因为内部事物在使用外部事物的内容。

 

2、匿名内部类

 

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

2、定义一个匿名内部类的前提:内部类必须是继承一个类或者实现接口。

3、匿名内部类的格式:new父类或者接口(){定义子类的内容}

new外部类名或者接口名(){ 覆盖类或者接口中的代码,(也可以自定义内容) }

new外部类名(){

     覆盖类或者接口中的代码;

     }.方法();

4、其实匿名内部类就是一个匿名子类对象。而且这个对象有点胖,可以理解为是带内容的对象。(内部类都是子类对象。)

5、匿名内部类中定义的方法最好不要超过三个。1个或2个。

 

 

 

3、异常

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

异常的由来:问题也是现实生活中一个具体的事物。也可以通过Java的类的形式进行描述,并封装成对象。

      其实就是Java对不正常情况进行描述后的对象体现。

     把问题封装成对象,就是异常。

对于问题的划分:两种,一种是严重的问题,一种是非严重的问题。

1、对于严重的问题,Java通过Error类进行描述。(不可治愈)

      对于Error,一般不编写针对性的代码进行处理。

2、对于非严重的,Java通过Exception类进行描述。(可以治愈)

      对于Exception可以使用针对性的处理方式进行处理。

 

无论Error或者Exception都具有一些共性内容。

比如:不正常的信息,引发原因等

 

Throwable

      |--Error

           ·通常出现重大问题如:运行的类不存在或者内存溢出等。

           ·不编写针对代码对其处理

      |--Exception

           ·在运行时运行出现的一起情况,可以通过try catch finally进行处理。

·Exception和Error的子类名都是以父类名作为后缀。

 

Throwable中的方法:

      ·getMessage():获取异常信息,返回字符串。

      ·toString():获取异常类名和异常信息,返回字符串。

      ·printStackTrace():获取异常类名和异常信息,以及异常出现在程序中的位置,返回值void。

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

 

2、异常的处理:

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

try

{

     需要被检测的代码;

}

catch(异常类 变量)

{

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

}

 

finally

{

     一定会执行的语句;

}

Finally代码块只有一种情况不会被执行,就是在之前执行了System.exit(0)。

 

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

      String getMessage();获取异常信息

      System.out.println(e.getMessage());//byzero

      System.out.println(e.toString());//异常名称:异常信息。

 

e.printStackTrace();

//异常名称;异常信息,异常出现的位置。

//其实jvm默认的异常处理机制,就是在调用printStackTrace方法。

//打印异常的堆栈的跟踪信息。

 

 

3、异常声明throws

      在功能上通过throws的关键字声明了该功能可能会出现问题。

 

在函数声明异常。

便于提高安全性,让抛出进行处理,不处理编译失败。

 

对多异常的处理:(ArithmeticException 算数异常)

1、声明异常时,建议声明更为具体的异常,这样处理的可以更具体。

2、对方声明几个异常,就对应有几个catch块。不要定义多余的catch块。

      如果多个catch块中的异常出现继承关系,父类异常catch块放在最后。

 

建议在进行catch处理时,catch中一定要定义具体的处理方式。

不要简单定义一句:e.printStackTrace();

也不要简单的就书写一条输出语句。

 

自定义异常:                          

因为项目中会出现特有的问题。[day09-09]

而这些问题并未被Java所描述并封装对象。

所以对于这些特有的问题,可以按照Java的对问题的封装的思想。将特有的问题,进行自定义的异常封装。

 

自定义异常:

需求:在本程序中,对于除数是负数,也视为是错误的,是无法进行运算的。

那么就需要对这个问题进行自定义的描述。

 

当在函数内部出现throw抛出异常对象,那么就必须要给对应的处理动作。

要么在内部try catch处理

要么在函数上声明让调用者处理。

 

一般情况下。函数内出现异常,函数上要声明出来。

 

发现打印的结果中,只有异常的名称,却没有异常的信息。

因为自定义的异常并未定义异常信息。

 

如何定义异常信息喃?

因为父类中已经把异常信息的操作都完成了

所以子类只要在构造时,将异常信息传递给父类通过super语句。

那么就可以直接通过getMessage方法获取自定义的异常信息。

 

 

自定义异常:

必须是自定义类继承Exception。

 

继承Exception原因:

异常体系有一个特点:因为异常类和异常对象都需要被抛出。

他们都具备可抛性。这个可抛性是Throwable这个体系中的独有特点。

 

只有这个体现中的类和对象才可以被throws和throw使用。

继承

|--Throwable

|--Error

|--Exception

 

throws和throw的区别

throws使用在函数上。

throw使用在函数内。

 

throws后面跟的是异常类,可以跟多个,用逗号隔开。

throw后面跟的是异常对象。

 

RuntimeException异常

Exception 中有一个特殊的子类异常RuntimeException 运行是异常。

 

如果在函数内容中抛出该异常,函数上可以不用声明,编译时一样通过。

如果在函数上声明了该异常,调用者可以不用进行处理(throw \ try catch),编译一样通过。

 

之所以不用在函数上声明,是因为不需要让调用者处理。

当该异常发生,希望程序停止,因为在运行时,出现了无法继续运算的情况。

希望停止程序后,由程序员对程序代码进行修改或修正。

 

 

自定义异常时:如果该异常的发生,无法再继续运行运算,

就让自定义异常继承RuntimeException。

 

对于异常分两种:

1、编译时被检测的异常

2、编译时不被检测的异常(运行时异常,RuntimeException以及其子类。)


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

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


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值