内部类--看这篇就懂啦~

1.try( 声明AutoCloseable接口对象,会自动调用close){

//这里写可能出现异常的代码

//若真的出现异常,默认由JVM构造一个异常对象,传递给程序,由catech捕获异常对象

}catch(FileNotFoundException e){}

}catch(IOEException e){}//输入输出流

}catch(Exception e){}//空指针异常

假设此时文件不存在,

当JVM出现异常时。JVM只会创建一个异常对象,catch捕获的时候就会选择最接近这个异常对象类型的catch段捕获。

finally{无论是否有异常都会执行的代码块,进行资源的释放处理,如文件关闭等}

免检异常(非受查异常):不需要强制进行异常处理的异常

Error 和RuntimeException及子类都属于免检异常,空指针,类型转换,数组越界

必检异常(受查异常):

除了免检异常以外的都是必检异常,IOEException


throw:方法中人为产生异常对象,相当于此处有异常产生,若是必检异常,此处就要显示处理

throws:用在方法声明上,明确表示该方法可能会产生的异常,但是在本方法中不处理


内部类

1.成员内部类:直接定义在类中,不加static定义的内部类,成员方法或属性

成员内部类必须依赖外部类的存在而存在,必须先有外部类对象才能产生成员内部类。

成员内部类对象的产生

 1>外部类的内部:语法就和普通类一样

Inner in = new Inner();

2>外部类的外部:前提是内部类对于外部的这个类是可见的public

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

ps:new Outter产生了外部类对象,然后通过此对象来构造内部类对象,当产生内部类对象时,构造这个内部类的外部对象就会被编译器传入内部类。

2.内部类和外部类可以方便的访问彼此的私有域

内部类访问外部类的私有域直接访问(内部类中隐藏了一个外部类的对象)

public class Outter {
    private String msg = "outter类中的msg属性";
    //对外部完全隐藏,只是在类的内部来使用
    class Inner{
        private int num = 10;
        private String msg = "内部类中的msg属性";
        public void test(){
            //直接访问外部类的msg属性
            //此处直接访问了外部类的私有成员变量msg,成员变量必须通过对象访问
            System.out.println(msg);
            System.out.println(Outter.this.msg);//外部类传入的msg
            System.out.println(Outter.this);
        }
    }

    public void fun(){
        Inner inner = new Inner();
        //通过内部类对象访问内部类的私有属性

        inner.test();
        }

    public static void main(String[] args) {
       Outter outter = new Outter();
       outter.fun();
    }
}

运行结果如下:

 外部类要访问内部类的私有域,不想通过对象来访问。


 成员方法能访问静态域,不能定义静态变量

对于成员内部类来说,能否定义一个静态变量?

不能,成员内部类必须要依赖于外部类,若成员内部类有静态属性,没有外部类对象也能访问了。

 对于外部类来说,能否在外部类的静态方法中使用成员内部类?== 相当于在静态方法中调用成员变量   肯定不行!

 2.静态内部类

定义在类中,使用static 修饰的内部类就是静态内部类

静态内部类不需要依赖外部类对象

外部类的内部:

 为何成员方法和静态方法都能创建成员内部类的对象?

类比类中静态变量,没有类的对象就能使用。类的静态方法可以调用,成员方法更可以。

内部类的外部:

外部类.内部类 引用= new 外部类.内部类();

此时不需要产生外部类对象

静态内部类就是一个普通的类,只是套在了一个类的内部而已。

总结:

成员内部类可以访问外部类的成员域和静态域,但不能拥有静态域

静态内部类可以拥有成员域,但不能直接访问外部类的成员域,可以通过new一个外部类对象来访问,静态域随便访问。

3.方法内部类(局部内部类)-- 类比局部变量

直接定义在方法内部的类,不允许使用任何访问修饰符,对外部完全隐藏(出了这个类就没了)

1>不能用任何访问修饰符

2>不能用static修饰

3>如果要用方法的参数,它默认用fianl修饰了,所以不能修改大小

4.匿名内部类(lambda表达式的前身,函数式编程)99%用在方法传参过程

匿名内部类是方法内部类的特殊版本,直接不写类名称。

匿名内部类遵从方法内部类的所有要求,匿名内部类默认继承一个类(普通类和抽象类都可以,一般是继承抽象类或者实现接口)或实现一个接口

内部类的设计不是我们现在的首选,写数据结构代码如链表,Node就是典型的内部类设计。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值