黑马程序员_java基础day09

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

主要内容:一、内部类;二、匿名内部类;三、异常;四、异常实例


一、内部类

    1,内部类概念:将一个类定义在另一个类的里面,
        对里面那个类就称为内部类(内置类,嵌套类)。
    2,内部类的访问规则:
       a.内部类可以直接访问外部类中的成员,包括私有成员。
           之所以可以直接访问外部类中的成员,是因为内部类中持有了一个外部类的引用。
  格式  外部类名.this
       b.外部类要访问内部类中的成员,必须要建立内部类的对象。

class Outer
{
    private int x = 3;
    class Inner//内部类
    {
        void function()
	{
	    System.out.println("inner:"+x);
	}
    }
    void method()
    {
        Inner in = new Inner();
	in.function();
    }
}
class InnerClassDemo
{
    public static void main(String[] args)
    {
        Outer.Inner in = new Outer().new Inner();//直接访问内部类成员
	in.function();
    }
}

    3,访问格式:
       a.当内部类定义在外部类的成员位置上,而且非私有,可以在外部其他类中。
         可以直接建立内部对象。
         格式:
              外部类名.内部类名 变量名 = 外部类对象.内部类对象;
     Outer.Inner in = new Outer().new Inner();
       b.当内部类在成员位置上,就可以被成员修饰符所修饰。
             比如:private:将内部类在外部类中进行封装。
          static:内部类就具备static的特性。
  当内部类被static修饰后,只能直接访问外部类中的static成员。出现了访问局限。


                   在外部其他类中,如果直接访问static内部类的非静态成员呢?
  new Outer.Inner().function();


  在外部其他类中,如果直接访问static内部类的非静态成员呢?
  Outer.Inner.function();


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


    4,内部类定义原则:
       当描述事物时,事物的内部还有事物,该事物用内部类来描述。
       因为内部事务在使用外部事物的内容。
       内部类定义在局部时:
       a.不可以被成员修饰符修饰。
       b.可以直接访问外部类中的成员,因为还持有外部类中的引用。
         但是不可以访问它所在的局部中的变量。只能访问被final修饰的局部变量。
       例:

       class Outer
       {
           int x = 3;
	   void method(final int a)
	   {
	       final int y = 4;
	       class Inner
	       {
	           void function()
		   {
		       System.out.println(a);
		   }
	       }
	       new Inner().function();
	   }
       }

二、匿名内部类
    1,匿名内部类其实就是内部类的简写格式。
    2,定义匿名内部类的前提:
       内部类必须是继承一个类或者实现接口。
    3,匿名内部类的格式:new 父类或者接口(){定义子类的内容}
    4,其实匿名内力类就是一个匿名子类对象。而且这个对象有点胖。
       可以理解为带内容的对象。
    5,匿名内部类中定义的方法最好不要超过3个。

    例

      abstract class AbsDemo
      {
          abstract void show();
      }
      class Outer
      {   
          int x = 3;
	  /*
	  class Inner extends AbsDemo
	  {
	      void show()
	      {
	          System.out.println("x="+x);
	      }
	  }
	  */
          public void function()
	  {
	      //AbsDemo a = new Inner()
	      AbsDemo a = new AbsDemo()
	      {
	          void show()
		  {
		      System.out.println("x="+x);
		  }
	      };
              a.show();
	  }
      }

三、异常
    1,异常体系
       Throwable
       Error:通常出现重大问题如:运行的类不存在或者内存溢出等。
             不编写针对代码对其处理。
       Exception:在运行时运行出现的一些情况,可以通过try catch finally
      Exception和Error的子类名都是以父类名作为后缀。
       异常由来:问题也是现实生活中一个具体的事物,也可以通过java的类的形式进行描述。并封装成对象。
           其实就是java对不正常情况进行描述后的对象体现。


       对于问题的划分:两种:一种是严重的问题,一种是非严重的问题。
       对于严重的,java通过Error类进行描述。
           对于Error一般不编写针对性的代码对其进行处理。


       对于非严重的,java通过Exception类进行描述。
           对于Exception可以使用针对性的处理方式进行处理。



       无论Error或者Exception都具有一些共性内容。
       比如:不正常情况,引发原因等。
       Throwable
           |--Error
  |--Exception
       异常怎么来的?就是用面向对象的思想,把问题进行了描述并进行了对象的封装。
 
    2,异常的处理
       java 提供了特有的语句进行处理。
       try
       {
           需要被检测的代码;
       }
       catch(异常类 变量)
       {
           处理异常的代码;(处理方式)
       }
       finally
       {
           一定会执行的语句;
       }
       异常语句的几种结合格式
       try                   try                   try
       { }                    { }                   {  }
       catch              finally             catch()
       {   }                 {    }                 {  }
                                                     finally
                                                     {  }
    3,对捕获到的异常对象进行常见方法操作。
        String getMessage(); 获取异常信息。


在函数上声明异常,
便于提高安全性,让调用者进行处理。不处理编译失败。
       例

       class Demo
       {
           int div(int a,int b)throws Exception//在功能上通过throws的关键字声明了该功能有可能出现问题。
	   {
	       return a/b;
	   }
       }
       class ExceptionDemo
       {
           public static void main(String[] args)
	   {
	       Demo d = new Demo();
	       try
	       {
	           int x = d.div(4,0);
		   System.out.println("x="+x);
	       }
	       catch(Exception e)
	       {
	           System.out.println("除数为零");
		   System.out.println("e.getMassage());//   /by zero;
		   System.out.println("e.toString());  //异常名称,异常信息
		   e.printStackTrace();//异常名称,异常信息,异常出现的位置
	                             //其实jvm默认的异常处理机制,就是在调用printStackTrace方法。
				     //打印异常的堆栈跟踪信息。
	       }
	       System.out.println("over");
	   }
       }
    

    4,对多异常的处理。
       (1),声明异常时,建议声明更为具体的异常。这样处理的可以更具体。
       (2),对方声明几个异常,就对应有几个catch块。不要定义多余的catch块。
            如果多个catch块中的异常出现继承关系,父类异常catch块放在最下面。
       建议在进行chatch处理时,catch中一定要定义具体处理方式。
       不要简单定义一句 e.printStackTrace();
       也不要简单就书写一句输出语句。
    6,自定义异常
       因为项目中会出现特有的问题,
       而这些问题并未被java所描述并封装对象。
       所以对于这些特有的问题可以按照java的对问题封装的思想。
       将特有的问题,进行自定义的异常封装。
       当在函数内部出现了throw抛出异常对象,那么就必须要给对应的处理动作。
       要么在内部try catch处理。
       要么在函数上声明让调用者处理。
       一般情况,在函数内出现异常,函数上需要声明。
       发现打印的结果中只有异常的名称,却没有异常的信息。
       因为自定义的异常并未定义信息。
       如果定义异常信息呢?
       因为父类中已经把异常信息的操作都完成了。
       所以子类只要在构造时,将异常信息传递给父类通过super语句。
       那么就可以直接通过getMessage方法获取自定义的异常信息。


       自定义异常类:
       必须是自定义类继承Exception
       继承Exception原因:
       异常体系有一个特点:因为异常类和异常对象都需要被抛出。
       他们都具备可抛性,这个可抛性是Throwable这个体系中独有特点。
       只有这个体系中的类和对象才可以被throws和throw操作。

       class FuShuException extends Exception
       {
	   FuShuException(String msg)
	   {
	       super(msg);
	   }
       }

       定义异常类继承Exception或者RuntimeException
       (1),为了让该类具备可抛性。
       (2),让该类具备操作异常的共性方法。
    7,throws和throw的区别:
       (1),throws使用在函数上。
           throw使用在函数内。
       (2),throws后面跟的是异常类。可以跟多个,用逗号隔开。
           throw后跟的是异常对象。
    8,RuntimeException:
       Exception中有一个特殊子类异常RuntimeException运行时异常。
       如果在函数内容抛出该异常,函数上可以不用声明,编译一样通过。
       如果在函数上声明了该异常,调用者可以不要进行处理,编译一样通过。
       注意:之所以不用在函数上声明,是因为不需要让调用者处理。
       当该异常发生,希望程序停止。因为在运行时,出现了无法继续运行的情况,
       希望停止程序后,对代码进行修正。
       自定义异常时:如果该异常的发生,无法再继续进行运算,
       就让自定义异常继承RuntimeException


    总结:对于异常分两种:
    (1),编译时被检测的异常。


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


四、异常练习
    需求:
以老师讲课使用电脑,而电脑可能出现各种各样的故障,
    例如,蓝屏,或者硬件损坏等等,蓝屏的话,老师可以自己处理,重启电脑就行了,
    如果是硬件损坏,则老师无法处理,但是这个异常与老师调用讲课的方法无关,
    但是他可以转换为自己的异常然后抛出,让高层解决。

    class LanPingException extends Exception
    {
        LanPingException(String message)
	{
	    super(message);
	}
    }
    class MaoYanException extends Exception
    {
        ManYanException(String message)
	{
	    super(message);
	}
    }
    class NoPlanException
    {
        NoPlanException(String msg)
	{
	    super(msg);
	}
    }
    class Computer
    {
        private int state = 1;

        public void run()throws LanPingException,MaoYanException
	{   
	    if(state==2)
	        throw new LanPingException("蓝屏了");
	    if(state==3)
	        throw new MaoYanException("冒烟了");
	    System.out.println("电脑运行");
	}
	public void reset()
	{
	    state = 1;
	    System.out.println("电脑重启");
	    
	}
    }
    class Teacher
    {
        private String name;
	private Computer cmpt;
	Teacher(String name);
	{
	    this.name = name;
	    cmpt = new Computer();
	}
	public void prelect()throws NoPlanException
	{
	    try
	    {
	       cmpt.run();
	    }
	    catch(LanPingException e)
	    {
	        cmpt.reset();  
	    }
	    catch(MaoYanException e)
	    {
	        test();
                throw new NoPlanException("课时无法继续"+e.getMassage());
	    }	    
	    System.out.println("讲课");
	}
        public void test()
	{
	    System.out.println("练习");
	}
    }

    class ExceptionTest
    {
        public static void main(String[] args)
	{
	    Teach t = new Teacher("毕老师");
	    try
	    {
	        t.prelect();
	    }
	    catch(NoPlanException e)
	    {
	        System.out.println("e.toString());
	        System.out.println("换老师上课或者放假");    
	    }
	    
	}
    }



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值