内部类小总结

内部类基础

成员内部类

public class demo{
	int sign = 0;
	class A{

	}
}

例如,demo和A这两个类,A称为demo的成员内部类,demo为A的外部类

  • 在成员内部类中,可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员)。

  • 如果成员内部类拥有和外部类相同名称的方法或是变量时,将会发生隐匿现象,即成员内部类使用的是自己的方法或者变量,如果要使用外部类的方法或者变量,必须使用

类名.this.方法名
或者
类名.this.变量名

  • 如果外部类想要访问成员内部类的方法,并不能够直接调用,而是要先创建一个成员内部类的对象,用对象去引用
public class test {
	int sign = 2;
	private A getA(){
		return new A();
	}
	public static void main(String[] args) {
		test t = new test();
		t.getA().test();
		
	}
	class A{
		public void test(){
			System.out.println(sign);
		}
	}
}
  • 这里又涉及到外部类创建内部类对象的问题
    其中一种方法是上面代码所示的创建方法
    另一种如下:
test t = new test();
test.A a = t.new A();
  • 内部成员类可以拥有private、protected、public
    如果成员内部类A用private修饰,则只能在外部类的内部访问,
    如果用public修饰,则任何地方都能访问;
    如果用protected修饰,则只能在同一个包下或者继承外部类的情况下访问;
    如果是默认访问权限,则只能在同一个包下访问。这一点和外部类有一点不一样,外部类只能被public和包访问两种权限修饰。

局部内部类

class A{

}
public class demo{
	public A getA(){  //内部类
		class B extends A{
			int word = 0;
		}
		return new B();
	}
}

注意,局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的。

匿名内部类

匿名内部类用来写监听

scan_bt.setOnClickListener(new OnClickListener() {
             
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                 
            }
        });
  • 同样的,匿名内部类也是不能有访问修饰符和static修饰符的
  • 匿名内部类是唯一一种没有构造器的类。正因为其没有构造器,所以匿名内部类的使用范围非常有限,大部分匿名内部类用于接口回调。匿名内部类在编译的时候由系统自动起名为Outter$1.class。一般来说,匿名内部类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的实现或是重写。

静态内部类

静态内部类也是定义在另一个类里面的类,只不过在类的前面多了一个关键字static。静态内部类是不需要依赖于外部类的,这点和类的静态成员属性有点类似,并且它不能使用外部类的非static成员变量或者方法

内部类的好处

  1. 每个内部类都能独立的继承一个接口的实现,所以无论外部类是否已经继承了某个(接口的)实现,对于内部类都没有影响。内部类使得多继承的解决方案变得完整,
  2. 方便将存在一定逻辑关系的类组织在一起,又可以对外界隐藏。
  3. 方便编写事件驱动程序
  4. 方便编写线程代码

猜你喜欢

转载自blog.csdn.net/bigbigChopper/article/details/84542338