黑马程序员Java基础__内部类与异常

---------------------- ASP.Net+Android+IO开发S.Net培训、期待与您交流! ----------------------


一、内部类


一、定义

如果A类需要直接访问B类中的成员,而B类又需要建立A类的对象。这时,为了方便设计和访问,直接将A类定义在B类中。就可以了。A类就称为内部类。内部类可以直接访问外部类中的成员。而外部类想要访问内部类,必须要建立内部类的对象。

二、访问规则

1、内部类方法可以访问该类所在的类中作用域的成员,包括私有成员变量。

2、内部类可以对同一个包中的其他类隐藏起来,从而不被访问。

三、访问格式

1、当内部类定义在外部类的成员位置上,而且非私有,可在外部其他类中直接建立内部类对象。

 格式:
  外部类名.内部类名 变量名=new外部类对象.new内部类对象

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


2、 当内部类在成员位置上,就可以被成员修饰符所修饰。
  比如:private:将内部类在外部类中进行封装。
             static:内部类就具备static的特性。

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


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

   在外部其它类中,如何直接访问static内部类的静态成员呢?
   uter.Inner.function();

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


示例1:

class Outer//外部类  
{  
 private int x=3;//外部成员变量  
 class Inner//内部类  
 {  
  int x=4;//内部成员变量  
  void function()  
  {  
   int x=5;//内部局部成员变量.  
   System.out.println(Outer.this.x);  
  }  
 }  
 //定义一个方法建立内部类对象.  
 void method()  
 {  
  Inner in=new Inner();  
  in.function();  
 }  
}  
class InnerClassDemo  
{  
 public static void main(String[] args)   
 {  
  Outer out = new Outer();  
  out.method();  
  /* 
  Outer.Inner in=new Outer().new Inner();//直接建立内部类对象. 
  in.function();//调用function()方法 
  */  
 }  
}  


四、内部类定义原则

1、何时定义内部类:当一个类需要直接访问另一个类中的成员时,则当这个类放入另一个类中,并将内部类封装。

2、局部内部类:当内部类只在外部类中的某个方法中,创建了这个类型的对象时,且仅使用了一次,那么可在这个方法中定义局部类。

3、内部类定义在局部的情况:
 1)不可以被成员修饰符修饰。

 2)可以直接访问外部类中的成员,因为还持有外部类中的引用。但是不可以访问它所在的局部中的变量,只能访问被final修饰的局部变量。

示例2:

class Outer//外部类  
{  
 int x = 3;//成员变量  
 void method(final int a)  
 {  
  final int y = 4;//被final修饰的常量  
  class Inner//局部内部类  
  {  
   void function()  
   {  
    //只能方法被final修饰的常量因为.  
    //因为一常量在常量池比方法存在的时间长.  
    System.out.println(y);  
   }  
  }  
  //如果放在上面编译失败.因为虚拟机还不知道有内部类Inner呢.  
  new Inner().function();  
 }  
}  
class  InnerClassDemo3  
{  
 public static void main(String[] args)   
 {  
  Outer out = new Outer();  
  out.method(7);  
  out.method(8);  
 }  
}   

五、匿名内部类

1、匿名内部类:没有名字的内部类。就是内部类的简化形式。一般只用一次就可以用这种形式。匿名内部类其实就是一个匿名子类对象。想要定义匿名内部类:需要前提,内部类必须继承一个类或者实现接口。

2、定义前提:

1)内部类必须继承一个类或实现接口。

2)但是有一种很特殊,可以不直接继承一个父类,仍可定义一个匿名内部类。因为任何类都是Object的子类。

3)格式:匿名内部类的格式:new 父类名&接口名(){ 定义子类成员或者覆盖父类方法 }.方法。

3、使用场景:当函数的参数是接口类型引用时,如果接口中的方法不超过3个。可以通过匿名内部类来完成参数的传递。其实就是在创建匿名内部类时,该类中的封装的方法不要过多,最好两个或者两个以内。

示例4:

abstract class AbsDemo//父类  
{  
 abstract void show();   
}  
class Outer外部类  
{  
 int x = 3;  
 public void function()  
 {  
  //匿名内部类  
  AbsDemo d = new AbsDemo()  
  {  
   int num = 9;  
   void show()  
   {  
    System.out.println("num==="+num);  
   }  
   void abc()  
   {  
    System.out.println("haha");  
   }  
  };  
  d.show();  
  //d.abc();//编译失败;  
 }  
}  
class InnerClassDemo4   
{  
 public static void main(String[] args)   
 {  
  new Outer().function();  
 }  
}  

——————————————华丽的分割线————————————


二、异常


一、概述
异常就是不正常。程序在运行时出现的不正常情况。其实就是程序中出现的问题。这个问题按照面向对象思想进行描述,并封装成了对象。因为问题的产生有产生的原因、有问题的名称、有问题的描述等多个属性信息存在。当出现多属性信息最方便的方式就是将这些信息进行封装。异常就是java按照面向对象的思想将问题进行对象封装。这样就方便于操作问题以及处理问题。

二、由来
问题是现实生活中的事物,也可以通过java类的形式进行描述,并封装成对象。因为异常也可以被抽取,形成一个体系,并由一个个具体的实例组成,也是一个个对象。

三、异常体系

Throwable:可抛出的。 

|--Error:错误,一般情况下,不编写针对性的代码进行处理,通常是jvm发生的,需要对程序进行修正。

|--Exception:异常,可以有针对性的处理方式。


四、异常体系的特点

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


五、异常分为两种

 1)编译时被检测异常:

该异常在编译时,如果没有处理(没有抛也没有try),编译失败。

该异常被标识,代表这可以被处理。
2)运行时异常(编译时不检测):

在编译时,不需要处理,编译器不检查。


六、异常处理语句
结合方式:
① try-chatch   ②try-finally  ③try-catch-finally
格式:
该异常的发生,建议不处理,让程序停止。需要对代码进行修正。

示例1:

try  
{  
    //需要被检测的代码;   
}  
catch (异常类 变量)  
{  
    //理异常的代码;(处理方式)   
}  
finally  
{  
    //一定会执行的语句;   
} 

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

  
七、对捕获的异常对象进行常见方法的操作:
1、trrows Exception:抛出异常。
try-catch-finally:捕获异常 ---- java中提供了特有的语句进行处理。
String getMessage();获得异常信息。
2、throw和throws的用法:
1)throw:定义在函数内,用于抛出异常对象。注:throw单独存在时,下面不要定义语句,因为执行不到,编译失败。
2)throws:定义在函数上,用于跑出异常类,可抛多个,用逗号隔开。

八、自定义异常:
1、概述:
因为项目中会出现特有问题,而这些问题并未被java所描述并封装成对象,所以这些特有问题可按java中对问题封装的思想,将特有问题进行定义的异常封装。
2、继承Exception或RuntimeException的原因:
1)异常体系有一个特点:异常类和异常对象都被抛出,他们都具有可抛性。这个可抛性是Throwable这个体系单独有的特点,只有此体系中的类和对象才可被throws和throw操作。
2)为了让该类具备操作异常的共性方法。

2、如何自定义异常?

当开发时,项目中出现了java中没有定义过的问题时,这时就需要我们按照java异常建立思想,将项目的中的特有问题也进行对象的封装。这个异常,称为自定义异常。

步骤:

1:定义一个子类继承Exception或RuntimeException,让该类具备可抛性。

2:通过throw 或者throws进行操作。



异常示例:

class LanPingException extends Exception//自定义蓝屏异常.因为可以处理集成Exception  
{  
 LanPingException(String Message)//覆盖父类的方法  
 {  
  super(Message);//因为父类有赋值方法.直接用就OK了  
 }  
}  
class MaoYanException extends Exception//自定义冒烟  
{  
 MaoYanException(String Message)  
 {  
  super(Message);  
 }  
}  
class NoPlanException extends Exception//课时计划完不成.讲师的异常  
{  
 NoPlanException(String Message)  
 {  
  super(Message);  
 }  
}  
class Computer//电脑类  
{  
 private int count=3;//定义一个变量为1的时候正常.2的时候代表蓝屏.3.冒烟  
 void run()throws LanPingException,MaoYanException//run电脑启动  
 {  
  if(count==2)  
   throw new LanPingException("蓝屏");//抛出蓝屏异常,不在这里处理是因为电脑自身处理不了  
  if(count==3)  
   throw new MaoYanException("冒烟");  
  
  System.out.println("电脑启动");  
 }  
 void reset()//电脑重启.重启之后count变量为1.电脑正常运行  
 {  
  System.out.println("电脑从启");  
  count=1;  
 }  
}  
class Teachar//讲师类.毕老师  
{  
 private String name;//将名字设为私有  
 private Computer comp;//电脑类私有  
 Teachar(String name)  
 {  
  this.name=name;//用构造函数.将name和电脑computer初始化  
  comp=new Computer();  
 }  
  
 void prelect()throws NoPlanException  
 {  
  try//因为电脑处理不了异常.所以在这里try  
  {  
   comp.run();  
  }  
  catch (LanPingException e)  
  {  
   comp.reset();//蓝屏之后调用从启方法  
  }  
  catch (MaoYanException e)  
  {  
   test();//冒烟之后启动自习.因为解决不了.所以抛给张老师  
   throw new NoPlanException("课程无法继续"+e.getMessage());  
  }  
  
  System.out.println("讲课");  
 }  
 void test()  
 {  
  System.out.println("自习");  
 }  
}  
class ExceptionTest  
{  
 public static void main(String[] args)//主函数.也代表Boss  
 {  
  Teachar t=new Teachar("毕老师");//创建Teachar对象并让毕老师讲课  
  try  
  {  
   t.prelect();//因为电脑冒烟了.毕老师蒙圈了.问题交给boss张老师来处理  
  }  
  catch (NoPlanException e)  
  {  
   System.out.println(e.toString());  
   System.out.println("换老师或者放假");  
  }  
   
 }  
}  
 


---------------------- ASP.Net+Android+IO开发S.Net培训、期待与您交流! ----------------------

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值