内部类:内部类是定义在类内部的类, 可以说它是类的一个属性,可分静态内部类和非静态内部类,内部类对象可以访问外部类的任何成员。
非静态内部类对象的创建:需要通过外部类对象.new 内部类构造方法()的形式创建
静态内部类对象的创建:new 外部类名.内部类构造方法()
如下例:
package com.mjlf.myBatis.accessControl.innerclass;
/**
* Created by a123 on 16/12/18.
*/
public class OuterClass {
private int num;
public void showNum() {
System.out.println(this.num);
}
class InnerClass1 {
private int innerNum;
public OuterClass newOuter() {//生成外部类
return new OuterClass();
}
public OuterClass newOuter1(){//通过.this生成外部类
return OuterClass.this;
}
public void showNum(){
System.out.println("innner num : " + this.innerNum);
System.out.println("outer num : " + num);//调用外部类属性
}
}
static class InnerClass2{
void showNum(){
System.out.println("this is a static inner class");
}
}
public static void main(String[] args){
OuterClass outerClass = new OuterClass();
outerClass.showNum();
InnerClass1 innerClass1 = outerClass.new InnerClass1();//生成内部类对象
innerClass1.showNum();
OuterClass outerClass1 = innerClass1.newOuter();//通过内部类对象生成外部类对象
outerClass1.showNum();
OuterClass outerClass2 = innerClass1.newOuter1();//通过内部类对象生成外部类对象
outerClass2.showNum();
InnerClass2 innserClass2 = new OuterClass.InnerClass2();//生成静态内部类
innserClass2.showNum();
}
}
注意: 每一个内部类对象都需要和一个外部类对象绑定(非静态内部类)
问题:如果内部类和外部内种同时存在相同的属性时, 在内部类中如何才能调用外部类的该属性?
package com.seengenearcontent;
/**
* Created by a123 on 16/12/20.
*/
public class OuterClass {
private int i = 10;
private int num = 10;
class InnerClass{
private int num = 5;
public void show1(){
System.out.println("i = " + i);
System.out.println("num = " + num);
}
public void show2(){
System.out.println("num outer = " + OuterClass.this.num);
System.out.println("num inner = " + this.num);
System.out.println("num = " + num);
}
}
public static void main(String[] args){
InnerClass innerClass = new OuterClass().new InnerClass();
innerClass.show1();
innerClass.show2();
}
}
/**
i = 10
num = 5
num outer = 10
num inner = 5
num = 5
*/
根据输出结果可以知道:
1. 如果内部类中没有与外部类相同的属性, 则可以知道使用外部类属性
2. 如果内部用于外部类相同的属性, 直接调用属性名则调用的是内部类属性,可以使用this.属性名调用内部类属性, 外部类名.this.属性名(OuterClass.this.num)调用外部类属性
3. 如果内部类属性与外部类属性相同, 直接使用属性名则调用时内部类属性
可以通过内部类来实现java多继承:这将在以后的博文中叙述