内部类(诠释)


含义:把一个类定义放到另一个类的内部

例如:
public class demo

       class I
      {
       
         demo get()
       {
            demoO.this;
        }
    }

    public static void main(String[] args) {

        demo outer = new demo();
        demo.I inner = outer.new I();
        System.out.println(outer == inner.get());

    }
}

诠释:
1.内部类的创建依赖外部类对象
2.外部类的作用域之外,可以使用  outerClass.innerClass  方式引用内部类
3.内部类访问外部类不需要任何特殊条件,拥有外部类所有的访问权
4.内部类不仅能够访问包含他的外部类,还可以访问局部变量(但是局部变量必须被声明为final?因为局部内部类会将调用的变量进行拷贝,为了保证一致性,所以变量必须为final)

注意:
1.内部类可以声明为private 与protected,可以对同一个包中其他类隐藏
2.内部类持有的外部类对象就是外部类对象本身,内存地址是相同的
3.内部类可以达到类似"多重继承"的效果(每个内部类都能独立的继承自一个(接口的)实现)

接下来说说分类:

内部类分为 1.成员内部类 2.局部内部类 3.匿名内部类 4.静态内部类
---------------------------------------------------------------------------------------------------------
成员内部类(实例内部类)
例如:
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();//注意是对象.new

注意:
每一个外部类对象都需要一个内部类的实例,内部类离不开外部类存在

既然是成员内部类,和成员属性成员方法地位上自然没有什么不同

每个外部类对象都有一个内部类对象,自然持有外部类的引用

 
-------------------------------------------------------------------------------------------------
局部内部类

局部内部类不能用public或者private或者protected访问说明符,作用域被限定在了声明这个局部内部类中

局部类可以对外面完全的隐藏起来,即使是外部类的其他的代码也不能访问他

局部内部类虽然被限定在局部代码块{} 里面,但是他也是可以访问外部类的属性的

 -----------------------------------------------------------------------------------------

匿名内部类

匿名内部类就是局部内部类的进一步隐藏,局部内部类定义了之后在局部区域内仍旧可以创建多个对象

匿名内部类声明一个类之后就只能创建一个对象了,因为他并没有类名字

形式为:

new xxxClass  (){    //或者new xxxInterface()
//.......

}

表示创建一个类的对象,这个类是xxxClass  子类或者实现了xxxInterface 接口的类

也可以说匿名内部类就是创建了一个匿名类的子类对象

构造方法名字和类名是相同的,匿名内部类显然是没有构造方法的,因为连名字都没有

既然没有构造方法想要构造参数,就只能把参数传递给外部的构造器,通过外部类的构造器绕一圈,本身内部类可以访问外部类所有的属性,去把值操作起来

当然外部类自然可以搞点属性根据业务逻辑单独给内部类用

如果是实现接口,不能带任何的参数的,因为接口都没有构造方法的呀

 

例:匿名内部类的参数传递

fun(new ArrayList<String>(){{add("a");add("b");add("c");}});

fun(new ArrayList<String>()
{    

 {
  add("a");
   add("b");
  add("c");
 }
}
---------------------------------------------------------------------------------------------------------
静态内部类

将内部类声明为static, 只是为了将一个类隐藏到一个类的内部,并不需要内部类引用外部类的对象

静态的创建形式:

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

通过  外部类 . 内部类   来访问

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值