一、为何使用内部类
内部类提供了更好的封装,只有外部类能访问内部类
内部类可以独立继承一个接口,不受外部类是否继承接口影响
内部类中的属性和方法即使是外部类也不能直接访问,相反内部类可以直接访问外部类的属性和方法,即使private
一个内部类的例子:
public class OuterClass {
private String outerName;
private int outerAge;
public class InnerClass{
private String innerName;
private int innerAge;
}
}
内部类可以直接访问外部类的元素,但是外部类不可以直接访问内部类的元素
public class OuterClass {
private String outerName;
private int outerAge;
public class InnerClass{
private int innerName;
InnerClass(){
//内部类可以访问外部类的元素
outerName="I am outer class";
outerAge=23;
}
public void display(){
System.out.println(outerName+" and my age is "+outerAge);
}
}
public static void main(String[] args) {
OuterClass outerClass = new OuterClass();
OuterClass.InnerClass innerClass = outerClass.new InnerClass();
innerClass.display();
}
}
在上面例子中我们可以看到,内部类可以直接访问外部类属性,尽管外部类属性是用private修饰的。这是因为在创建外部类时,内部类会自动捕获一个外部类的引用,所以内部类访问外部类元素,实际上是通过他所持有外部类引用访问的。在java中,我们可以通过OuterClass.this来获得外部类的引用,请看下面例子:
public class OuterClass {
public void display(){
System.out.println("this is OuterClass...");
}
public class InnerClass{
//获取外部类的引用
public OuterClass getOuterClass(){
return OuterClass.this;
}
public void innerDisplay(){
//内部类也可以通过外部类的引用访问外部元素
getOuterClass().display();
}
}
public static void main(String[] args) {
OuterClass outerClass = new OuterClass();
OuterClass.InnerClass innerClass = outerClass.new InnerClass();
innerClass.innerDisplay();
}
}
外部类可以通过内部类引用间接访问内部类元素
public class OuterClass {
public void display(){
//外部类访问内部类元素,需要通过内部类引用访问
InnerClass innerClass=new InnerClass();
innerClass.innerDisplay();
}
public class InnerClass{
public void innerDisplay(){
System.out.println("I am inner class");
}
}
public static void main(String[] args) {
OuterClass outerClass=new OuterClass();
outerClass.display();
}
}
创建内部类
3.1 在外部类外面(或外部类main方法)创建内部了对象
其实上面2.2例子中我们已经看到了如何创建内部类。如果要创建一个内部类对象,必须利用outerClass.new来创建:
OuterClass outerClass = new OuterClass();
OuterClass.InnerClass innerClass = outerClass.new InnerClass();
其实我们还可以一步到位:
OuterClass.InnerClass innerClass=new OuterClass().new InnerClass();
内部类创建方法示例:
public static void main(String[] args) {
//先创建外部类对象,再创建内部类对象
OuterClass outerClass = new OuterClass();
OuterClass.InnerClass innerClass1 = outerClass.new InnerClass();
innerClass1.innerDisplay();
//一步到位创建
OuterClass.InnerClass innerClass2=new OuterClass().new InnerClass();
innerClass2.innerDisplay();
}
3.2 在外部类里面创建内部类
正如2.3代码中display()方法那样,在外部类里面创建内部类,就像创建普通对象一样直接创建:
InnerClass innerClass=new InnerClass()