黑马程序员_Java_内部类

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

一.内部类


           1.什么是内部类:
                         在一个类的内部声明另外一个类, 这个新类就是内部类.


           2.内部类的类名:
                        外部类名.内部类名.  class文件名为: 外部类名$内部类名.class


           3.创建内部类对象:
                        必须指定在哪个外部类上创建, 也就是说先要创建一个外部类对象, 才能创建内部类对象.
             例如: Outer outer = new Outer();   Outer.Inner inner = outer.new Inner(); 

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


          4.内部类访问外部类成员:
                       使用 外部类名.this.成员名 形式访问


           5.外部类访问内部类成员:
                      不能直接访问, 因为外部类创建之后有可能还没有创建内部类对象.
                      如果一定要在外部类中访问内部类成员, 可以先创建内部类对象. 再通过对象访问.


           6.在外部类中创建内部类对象:
                       可以直接使用 内部类名 创建, 无须再加上 外部类名.  会优先找内部类.
                       在外部类中可以直接通过引用访问内部类的私有成员.


           7.内部类中的静态成员:
                      静态的本意就是让别人不创建对象就可以使用.
                     而内部类的本意是让别人先创建外部类对象再使用内部类.
                     他们之间互相矛盾, 所以不能再内部类中声明静态的成员.


二.方法中的内部类:


            1.应用场景:
                       如果一个类只在某一个方法中使用, 那么就可以定义在方法中.


            2.方法中内部类的使用:
                      在方法中定义的内部类, 只能在方法中使用, 必须先定义才能创建对象(方法中的代码是由上到下顺序执行的).


            3.方法中内部类的类名:
                      在方法中直接写内部类名就可以, 方法外访问不到. class文件名: 外部类名$1内部类名.class
  
三.匿名内部类


            1.应用场景:
                     通常用在参数传递的时候, 方法的形参定义的是一个父类类型.
                     这时我们需要写一个子类, 并创建对象传入.
                     这个类只使用一次, 我们就可以使用匿名内部类.


             2.定义方式:
                     new 父类名(){类定义}
                    在这里做了两件事, 定义一个子类, 再根据这个子类创建了一个对象.


            3.类名:
                    在程序中只使用一次, 没有类名, 不能多次通过此类创建对象. class文件名为: 父类类名$编号.class


四.静态内部类


           1.什么是静态内部类:
                     用static修饰的内部类, 就是静态内部类.


            2.静态内部类的使用:
                     直 接使用 外部类名.内部类名 创建, 不用创建外部类对象.
                      例如: Outer.Inner inner = new Outer.Inner();


            3.内部类访问外部成员:
                      静态内部类中不能访问外部非静态成员
                      因为静态内部类创建的时候, 外部类有可能没有创建对象, 所以外部类成员不能被直接访问.


           4.内部类中的静态成员:
                     普通内部类不能定义静态成员, 因为必须创建外部类对象.
                     静态内部类由于不用创建外部类对象, 直接可以使用. 那么也就可以定义静态成员了, 其静态成员仍然不需要创建任何对象即可直接访问.


           5.静态内容:
                     只要是静态内容(context), 那么就不能访问外部非静态成员, 也不能使用this.

 

学习内部类时所遇到的错误:

                   Exception in thread "main" java.lang.ClassCastException: Typist cannot be cast to Coder
                    at TypeCastDemo.main(TypeCastDemo.java:34)
                   34行: 类型转换异常: Typist 不能转换成 Coder

 

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值