将一个类(innerClass)定义在另一个类(outClass)中,那么(innerClass)就是内部类。
java内部类分为:成员内部类,局部内部类,匿名内部类,静态内部类。
1.成员内部类
public class outClass {
private int outData;
private int getOutData() {
return outData;
}
public void setOutData(int outData) {
this.outData = outData;
}
/**
* public类型的成员内部类
*/
public class innerClass{
/**
* 1.不能存在static修饰的变量和方法
*/
// static int data;
// private static int fun(){
//
// }
private int innerData=0;
public innerClass(){
//2.可以无限制使用外部类的变量,private和public类型都可以访问。
outData=0;
getOutData();
}
}
/**
* private类型的成员内部类
* 只能在外部内中使用innerClass2,外部类以外不能使用
* 可以通过继承
*/
private class innerClass2 implements Father{
}
/**
* 生成 innerClass2对象
* @return
*/
public Father getinnerClass2(){
return new innerClass2();
}
/**
* 3.内部类的对象生成,只能由外部类的对象来生成
*/
private void test(){
outClass outClass=new outClass();
outClass.innerClass innerClass=outClass.new innerClass();
}
}
2.局部内部类
public class outClass {
/**
* 局部内部类,PDestionation类只能作用于{}语句块中
*
* @param str
* @return
*/
public Father destionation(String str){
class Teacher extends Father {
private String label;
private Teacher(String whereTo){
label = whereTo;
}
public String readLabel(){
return label;
}
}
return new Teacher(str);
}
}
3.匿名内部类-没有类名的类
public class outClass {
String firstName="";
/**
* 匿名内部类:相当于生成继承于Father的子类
* 没有名字就没有构造方法
* 匿名内部类访问局部变量,局部变量必须是final型的
* @param lastName
* @return
*/
public Father getFather(final String lastName){
return new Father(){
public String name=lastName+firstName;
@Override
public void setName(String name) {
this.name = name;
}
@Override
public String getName() {
return name;
}
};
}
}
4.静态内部类:使用static修饰的内部类称为静态内部类
public class outClass {
int outdata;
static int data2;
/**
* 静态内部类
* 1.不能使用外部类的非static的变量和方法,只能使用外部类static的变量和方法
* 2.不指向外部类的引用
* 3.可以定义static和非static的变量和方法
*/
public static class innerClass{
public int indata;
public static int indata2;
public innerClass(){
indata=0;
}
}
}