有些时候在写一些小的项目或者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类的其他成员。这种情况下A与B之间联系密切,实例化B必须取得A的引用。
当然,在项目规模较大而且考虑到后续的拓展,还是尽量采用合适的架构和写成独立的类。