14.Java面向对象(五)

01.面向对象(内部类访问规则)

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

内部类特点:
内部类可以直接访问外部类中的成员,也包括私有。
外部类要访问内部类必须建立内部类对象。
在另一个类中访问内部类方式:外部类.内部类 名称=new 外部类(). new 内部类();
private可以修饰内部类的class前面。
如果内部类和外部类有相同的变量名,则在外部类访问内部类变量时方式:外部类.this.变量名;

02.面向对象(静态内部类)

总结访问格式:
1当内部类定义在外部类的成员位置上,而且非私有,可以再外部其它类中,可以直接建立内部类对象。
格式:外部类名.内部类名 变量名=外部类对象.内部类对象;
如:Outer.Inner in=new Outer().new Inner();
2当内部类在成员位置上,就可以被成员修饰符所修饰,比如:private,将内部类在外部类中进行封装。还有static,内部类就具备static的特性。
当内部类被static修饰后,只能直接访问内部类中的static成员,出现了访问权限。
在外部其它类中,如何直接访问静态内部类呢?
方式:new 外部类名.内部类().函数名(参数);如:new Outer.Inner().Function();
如果内部类的成员函数也是静态的,访问方式是:Outer.Inner.Function();

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

03.面向对象(内部类定义原则)

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

04.面向对象(匿名内部类)

在成员方法中也可以定义局部类,但该局部类不能被private和static修饰

内部类定义在局部时,不可以被成员修饰符修饰,可以直接访问外部类中的成员,因为还有外部类中的引用,但是不可以访问他所在的局部中的变量,只能访问final修饰的局部变量。

匿名内部类:
1.匿名内部类其实就是内部类的简写格式。就是没名字的内部类。
2.定义匿名内部类的前提:内部类必须继承一个类,或者实现接口。
3.匿名内部类的格式:new 父类或者接口(){定义子类的内容}
4.其实匿名内部类就是一个匿名子类对象,而且这个对象有点胖,可以理解为带内容的内部对象。
在成员方法中定义匿名内部类的方法:
public void 成员方法()
{
 new 外部接口或类名()
 {
  重写或覆盖外部类或接口中的方法或抽象方法;
 }.重写或自己特有的方法或覆盖的方法名();
}

05.面向对象(异常概述)

异常:就是程序运行时出现的不正常情况。
异常由来:问题也是现实生活中一个具体的事物,也可以通过java的类的形式描述,并封装成对象,其实就是java对不正常情况进行描述后的具体体现。
对于问题的划分:两种:一种是严重的问题,一种是非严重的问题。
对于严重的,java通过Error类进行描述。对于非严重的,java通过Exception类进行描述。
对于Error一般不编写针对性的代码对其进行处理。
对于Exception可以通过针对性方式进行处理。

06.面向对象(Try-catch)

异常处理:java提供了特有的语句进行处理;
try
{
 需要检测的代码;
}
catch(异常类 变量)
{
 处理异常的代码;
}
finally
{
 一定会执行的语句;
}
对捕获到的异常对象进行常见方法操作:String getMessage();
e.printStackTrce();其实jvm默认的异常处理机制,就是调用这个方法。

07.面向对象(异常声明throws)

08.面向对象(多异常处理)

多异常处理:
1.声明异常时,建议声明更为具体的异常,这样处理可以更具体。
2.对方声明几个异常,就应有几个catch块,如果多个catch块的异常出现继承关系,父类异常catch块放在最下面。
建立在进行catch处理时,catch中一定要定义具体处理方式,不要简单定义一句e.printStackTrace();也不要简单的就书写一条输出语句。

09.面向对象(自定义异常)

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

需求:在本程序中,对于除数是负数,也无法运算,那么就需要对这个问题进行自定义的描述。

class ZiDingYiException extends Exception
{
 ZiDingYiException(String msg)
 {
  super(msg);
 }
}
class Test
{
 int div(int a,int b)
 {
  if(b<0)
  {
   throw new ZiDingYiException();
  }
 }
}

当在函数内部出现了throw抛出的异常,那么就必须要给对应的处理动作,要么在函数内部try-catch处理,要么在函数声明上让调用者处理。
一般情况下,函数内部出现异常,函数上需要声明。

如何自定义异常信息呢?
因为父类中已经把异常信息的操作都完成了,所以子类只要在构造时,将异常信息传递给父类通过super语句,那么就可以直接通过getMessage方法获取自定义的异常信息。
自定义异常必须是自定义类继承Execption。
为什么要继承Exception?
1.异常体系有一个特点,因为异常类和异常对象都需要被抛出,他们都具备可抛性,这个可抛性是throwable这个体系独有的特点,只有这个体系的成员才可以被throw和throws抛出。

10.面向对象(throw和throws的区别)

(1)throws使用在函数上,throw使用在函数内。
(2)throws后面跟的是异常类,而throw后面跟的是异常对象。

11.面向对象(RuntimeException)

Exception中有一个特殊的子类异常RuntimeException,运行时异常,如果在函数内部抛出异常,函数上可以不用声明,编译一样通过,如果在函数上声明了对象,调用者可以不用进行异常处理,编译一样通过。

注意:之所以不用在函数上声明,是因为不需要让调用者处理,当该异常发生,希望程序停止,因为程序运行时,出现了无法继续运算的情况,希望停止程序后,对代码进行修正。

自定义异常时,如果该异常的发生无法再继续进行运算的话,就让自定义异常继承RuntimeException。

对于异常分两种:
1.编译时被检测到的异常
2.编译时不能被检测的异常(运行时异常,RuntimeException及其子类)

12.面向对象(异常练习)

需求:
毕老师用电脑上课
正常情况
class computer
{
 public void run()
 {
  System.out.println("电脑运行");
 }
 public void reset()
 {
  System.out.println("电脑重启");
 }
}
class Teacher
{
 private String name;
 private Computer cmpt;
 Teacher(String name)
 {
  this.name=name;
 }
 public void prelect()
 {
  cmpt.run();
  System.out.println("讲课");
 }
}
class test
{
 public static void main(String[] args)
 {
  
 }
}

posted on 2012-04-17 14:47  Barclay.Xu  阅读(520)  评论(0编辑  收藏  举报