java内部类详解

主要参考了这篇文章

所谓内部类,即是说,定义在一个类内部的类。

内部类能够访问到外部类的所有数据。

那么内部类是如何做到能够访问外部类的数据的呢?

是这样的,用外围类创建内部类对象时,此内部类对象会秘密的捕获一个指向外围类的引用,于是,可以通过这个引用来访问外围类的成员。

通常,这些都是编译器来处理,我们看不到,也不用关心这个。

正是因为如此,我们创建内部类对象时,必须与外围类对象相关联。

注意:嵌套类(后面会讲到)除外。

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

在内部类中想要得到外部类的引用,可以使用  外部类名.this  方法来做到。

比如:

private class Inner{   
    public Test2 getTest2(){   
        return Test2.this;   
    }   
       
    public Test2 newTest2(){   
        return new Test2();   
    }   
}   


上面的内部类中,getTest2方法返回了当前外部类的引用。而newTest2则方法返回了一个新的Test2对象。

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

.new关键字
如果想直接创建一个内部类对象,而不是通过外围类对象的方法来得到,可以使用.new关键字
形式是这样的:

OutClass.InnerClass obj = outClassInstance.new InnerClass();   

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

方法内部类

在方法中定义一个类,称作方法内部类。

void func() {
		class Stu {

		}
	}


在方法中创建的类,不能加public、private等修饰符。

另外,方法内部的类也不是在调用方法时才会创建的,它们一样也被编译了【后面会有讲解】

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

匿名内部类

package comz;

public class Main {

	public static void main(String[] args) {

	}

	Stu func() {
		return new Stu() {
			@Override
			public void showme() {
				// TODO Auto-generated method stub
			}
		};
	}
}

interface Stu {
	public void showme();
}


上面就是一个匿名内部类的例子。

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

嵌套类

static的内部类就叫做嵌套类
前面提到了很多次,嵌套类是个例外
使用嵌套类时有两点需要注意:
a、创建嵌套类对象时,不需要外围类。这与普通的内部类很不同。想创建普通内部类的对象的时候,必须有一个外部类的实例,然后才能 实例.new 内部类()
b、在嵌套类中,不能像普通内部类一样访问外围类的非static成员

   public class StaticClass {
	private int num;
	private static int sum = 2;
	private static class StaticInnerClass{
	    public int getNum(){
		//只能访问sum,不能访问num
                return sum;
	    }
	}
   }
   public class Test {
	public static void main(String [] args){
                //可以直接通过new来创建嵌套类对象
		StaticClass.StaticInnerClass inner = new StaticClass.StaticInnerClass();
		inner.getNum();
	}
   }
 

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

为何要内部类?
a、内部类提供了某
种进入外围类的窗户。
b、也是最吸引人的原因,每个内部类都能独立地继承一个接口,而无论外围类是否已经继承了某个接口。
因此,内部类使多重继承的解决方案变得更加完整。
在项目中,需要多重继承,如果是两个接口,那么好办,接口支持多重继承。
如果是两个类呢?这时只有使用内部类了。

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

另外,内部类还可以隐藏一些方法的实现细节。

你可能感兴趣的:(java内部类详解)