Java内部类和异常类

个人笔记记录

内部类

内部类:在一个类中定义另一个类;
外嵌类:包含内部类的类。
内部类和外嵌类之间的重要关系:

内部类外嵌类
类中的方法可以调用外嵌类中方法在内部类中仍然奏效
不可以声明类变量和类方法可以用内部类声明对象作为外嵌类的成员
仅供外嵌类使用,其他类不可用
public class InterExam {
    public static void main(String[] args){
        RedCow form=new RedCow("红牛农场");
        form.showCow();
        form.cow.speak();
    }
}
class RedCow{
    static String formName;
    Cow cow;//内部类声明对象
    RedCow(){}//构造方法
    RedCow(String name) {
        cow=new Cow(150,11,5000);
        formName=name;
    }
    public void showCow(){
        cow.speak();
    }
    class Cow{
        String cowName="红牛";
        int height,weight,price;
        Cow(int h,int w,int p){
            height=h;
            weight=w;
            price=p;
        }
        void speak(){
            System.out.println("偶是"+cowName+",身高"+height+"cm 体重"+weight+"kg,生活在"+formName);
        }
    }//内部类结束
}//外嵌类结束

偶是红牛,身高150cm 体重11kg,生活在红牛农场
偶是红牛,身高150cm 体重11kg,生活在红牛农场

内部类对应的字节码文件名字格式:

外嵌类名$内部类名.class

非内部类不可以是staic类

匿名类

和子类有关的匿名类

允许直接使用一个类的子类的类体创建一个子类对象。
匿名类:创建子类对象时,除了使用父类的构造方法外还有类体,此类体被认为时一个子类去掉类声明后的类体。

特点
1可以继承父类的方法也可以重写父类的方法
2使用时必然是某个类中直接用匿名类创建对象,因此匿名类一定是内部类
3可以访问外嵌类中的成员变量和方法,类体中不可以声明static成员变量和static方 法
4是一个子类,没有类名,在创建对象时,要直接使用父类的构造方法
public class Example06 {
    public static void main(String[] args){
        Show b=new Show();
        b.showM(new OutputE());//像参数传递OutputA的子类OutputE的对象
        b.showM(new OutputA() {//像参数传递OutputA的匿名子类E的对象
            @Override
            public void output() {
                for(char c='1';c<='9';c++){
                    System.out.printf("%3c",c);
                }
            }
        });//分号
    }
}
abstract class OutputA{
    public abstract  void output();
}
class OutputE extends OutputA{

    @Override
    public void output() {
        for(char c='a';c<='z';c++)
            System.out.printf("%3c",c);
    }
}
class Show{
    void showM(OutputA show){//参数是接口
        show.output();
    }
}
a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p  q  r  s  t  u  v  w  x  y  z  1  2  3  4  5  6  7  8  9

和接口有关的匿名类

某方法的参数是接口类型,那么使用接口名和类体组合创建一个匿名对象传递给方法的参数,类体必须要重写接口中的全部方法。

public class Example08 {
    public static void main(String[] args){
        HelloMa m=new HelloMa();
        m.turnOn((new SpeakHello() {//和接口SpeakHello有关的匿名类
            @Override
            public void speak() {
                System.out.println("hello,you are welcome");
            }
        }));
        m.turnOn(new SpeakHello() {//和接口SpeakHello有关的匿名类
            @Override
            public void speak() {
                System.out.println("你好,欢迎光临");
            }
        });
    }
}
interface SHello{
    void speak();
}
class HelloMa{
    public void turnOn(SpeakHello hello){
        hello.speak();
    }
}

hello,you are welcome
你好,欢迎光临

异常类

使用throw抛出一个Exception子类的实例表示异常发生。
1、java.lang包中的Integer类调用类方法public static int parseInt(String s)可以将数字格式的字符串转化为int型

int number=Integer.parseInt("ab89");

定义方法时声明该方法调用过程中可能出现的异常,即允许方法调用过程中抛出异常对象,终止当前方法的继续执行。

2、异常对象可以调用如下方法得到或输出有关异常的信息

public String getMessage();
public void printStackTrace();
public String toString();

3、try-catch语句
将可能出现的一场异常操作放在try部分,一旦try部分抛出异常对象,或调用某个可能异常对象的方法,并在该方法抛出异常对象,那么try部分将立即结束执行,转向执行相应的catch部分。所有程序可能将发生异常后的处理放在catch部分。
格式:

try{
	包含可能发生异常的语句;
}catch(ExceptionSubClass1 e){....
}catch(ExceptionSubClass2 e){....
}

catch参数中的异常类都是Exception的某个子类,表明try部分可能发生的异常,这些子类之间不能有父子关系,否则保留一个含有父类参数的catch即可。

public class Example08 {
    public static void main(String[] args){
        int n=0,m=0,t=1000;
        try{
            m=Integer.parseInt("8888");
            n=Integer.parseInt("ab89");//发生异常,转向catch
            t=7777;//没有机会被赋值
        }
        catch (NumberFormatException e){
            System.out.println("发生异常:"+e.getMessage());
        }
        System.out.println("n="+n+",m="+m+",t="+t);
        try {
            System.out.println("故意抛出异常I/O异常!");
            throw new java.io.IOException("我是故意的");//故意抛出异常
            //System.out.println("这个输出语句肯定没有机会执行,必须注释,否则编译出错");
        }catch (java.io.IOException e){
            System.out.println("发生异常:"+e.getMessage());
        }
    }
}

发生异常:For input string: "ab89"
n=0,m=8888,t=1000
故意抛出异常I/O异常!
发生异常:我是故意的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值