java基础:内部类+异常处理

admin 332 0
摘要:

内部类的存在可以辅助接口更好的实现多继承的效果,可以把冲突的方法等放到内部类中起到区分作用。

简单整理一下今天上课讲的,也顺便复习一下不至于忘得太快,争取用一个小时复习完。

内部类

内部类的存在可以辅助接口更好的实现多继承的效果,可以把冲突的方法等放到内部类中起到区分作用。

定义

在类A中声明了类B,称B为内部类,类A称为类B的外嵌类

A的成员变量在B内仍然有效,B可以访问A中的所有成员和方法,内部类仅供其外嵌类使用,对外隐藏,所以不能存在static。

继承性

外嵌类的子类能够继承该类的内部类;内部类也可以继承自其他的类。

一个外嵌类中可以有多个内部类,而且内部类也能继承内部类(相当于把一个类A当作环境,在里面再进行类的定义、继承等普遍动作,但是内部类只在这一个小环境中有效,在A外无效);甚至可以将一个内部类声明为抽象类,然后再继承它!

声明与调用

public class RedCowForm {
   static String formName;
   RedCow cow;  //内部类声明对象
   RedCowForm() {
   }
   RedCowForm(String s) {
      cow = new RedCow(150,112,5000);
      formName = s;
   }
   public void showCowMess() {
      cow.speak();
   }
   class RedCow {  //内部类的声明
      String cowName = "红牛";
      int height,weight,price;
      RedCow(int h,int w,int p){
          height = h;
          weight = w;
          price = p;
      }
      void speak() {
         System.out.println("偶是"+cowName+",身高:"+height+"cm 体重:"+weight+"kg,生活在"+formName);
      }
   }    //内部类结束
} 


public class Example7_1 {
   public static void main(String args[]) {
      RedCowForm form = new RedCowForm("红牛农场");
      form.showCowMess();
      form.cow.speak();
      //RedCowForm.RedCow redCow = new RedCowForm.RedCow(180,119,6000);
      //redCow.speak();
   }   
}

匿名类

匿名类也是内部类,是在使用new关键字创建父类对象时,不声明而直接使用的类,作用是无须声明子类而直接创建该子类的对象。匿名类是其父类的“无名子类”,因此可以覆盖父类的方法。

如果需要创建子类,但是子类只被调用一两次,只是临时使用,那么使用匿名类可以省去类的声明过程,直接在使用时定义一下即可。

class People
{
    String name;
    int MathScore=99;
    People(String name)
    {
        this.name=name;
    }
    void showScore()
    {
        System.out.println(MathScore);
    }
}

public class Test0324_Xian {
    
    public static void main(String[] args) { 
        // TODO code application logic here
          People p = new People("小明")
          {
              void showScore()
              {
                  System.out.println(MathScore+20);
              }
          };
          p.showScore();
    }
}
run:
119

除此之外,Java也允许直接用接口名和一个类体创建一个匿名对象,此类体被认为是实现了接口的类省略了类声明后的类体,也是匿名类。这种方法通常用于在Runnable接口的基础上创建类体,来增加临时性的线程

异常处理

异常就是程序运行中的一些错误,但是这些错误等级有点低(区别于Error),不至于导致程序无法运行,可以通过编写代码捕获和处理 。

异常类

程序运行过程中,出现一个可以识别的异常时,JVM会创建一个异常类的对象等待处理 。异常类为Exception及其子类,也可以自己创建异常类(继承于Exception)。

异常处理

抛出异常- throw,throws

throw用在方法内,用来抛出一个异常对象,将这个异常对象传递到调用者处,并结束当前方法的执行。

throws用在自己定义方法时,把可能遇到的异常抛出。格式为:

修饰符 返回值类型 方法名(参数) throws 异常类名1,异常类名2 ... { }

捕获异常- try,catch,finally

其中finally可以不写。详细用法见下面注释。

try {
    //包含可能发生异常的语句   
    //当try部分中的某个语句发生异常后,try部分将立刻结束执行,而转向执行相应的catch部分; 
}catch(ExceptionSubClass1  e) {
    /*
    对异常的处理语句放在 catch部分,可以包含多个catch语句,分别处理发生的相应异常,通常会用到两个方法:
    getMessage() :返回一个字符串对发生的异常进行描述。 
    printStackTrace() :给出方法的调用序列,一直到异常的产生位置 
    */
}catch(ExceptionSubClass2  ex) {    

}
……
finally{
    //不论在try代码段是否产生异常,finally 后的程序代码段都会被执行。通常在这里释放内存以外的其他资源

}
public class Test0324_Xian {
    public static void main(String[] args) { 
        try{
            System.out.println("第一行");
            System.out.println(3/0);
            System.out.println("第三行");
            
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            System.out.println("无论如何都会输出!");
        }
        
    }
}
run:
第一行
无论如何都会输出!
java.lang.ArithmeticException: / by zero
	at test0324_xian.Test0324_Xian.main(Test0324_Xian.java:21)

断言

还没学......

发表评论 取消回复
表情 图片 链接 代码

分享