关于在外部对内部类进行实例化和引用

有些时候在写一些小的项目或者demo时,为了方便或者逻辑上归类往往定义一些内部类,比如一些小型的model,各种Adapter、BroadcastReceiver等等。


类似结构:

class A{
    static class B{
        public void put(){
           System.out.println("abc);
        }      
    }
}


此时,对B进行实例化这样:

A.B b1  = new A.B();
b1.put();

此时类B作为类A中的静态成员,可以以A.B的形式对B进行访问而不必实例化A。 这种形式的优点是访问方便,清晰明了,不必持有A的引用;缺点是不利于在A与B之间进行数据传递。

例如:

class A{
    String str = "abc";
    static class B{
        public void put(){
            System.out.println(str);
        }      
    }
}

 此时将报错Cannot make a static reference to the non-static field str,即静态的成员不能持有非静态的成员的引用。 可以将str改为static,将B要访问的成员都改为static,但这会导致static的滥用违背面向对象的思想,还可能会造成内存泄漏。 

另一种用法是将class B的static 修饰去掉

class A{
    class B{
	public void put(){
            System.out.println("abc");
        }      
    }
}


 这样实例化 
A a1 = new A();
A.B b1 = a1.new B();
b1.put();

先取得A的引用,在借由A的实例对B进行实例化,由于此时B作为A的成员,因此B中可自由访问A类的其他成员。这种情况下AB之间联系密切,实例化B必须取得A的引用。

 

当然,在项目规模较大而且考虑到后续的拓展,还是尽量采用合适的架构和写成独立的类。





  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值