内部类
1.成员内部类
内部类可以随意使用外部类的成员方法和成员变量,哪怕是这些成员被修饰为private。
外部类不能使用内部类的成员。
内部类对象依赖外部类对象创建
class OuterClass{
innerClass inner=new InnerClass();
public void ouf(){
inner.inf();
}
class InnerClass{
InnerClass(){}
int i=0;
public void inf(){
System.out.println("内部类方法");
}
}
public InnerClass getInstance(){
inner.y=9;
return new InnerClass();
}
public static void main(String args[]){
OuterClass outer=new OuterClass();
outer.InnerClass inner=outer.getInstance();
//outer.InnerClass inner=outer.new InnerClass();
}
}
如果在外部类中定义的成员变量与内部类中的成员变量名称相同,可以用this关键字。
class Outer{
int i=0;
class Inner{
int i=0;
public void print(int i){
i++; //调用的形参i
this.i++; //调用的内部类i
Outer.this.i++; //调用的外部类i
}
}
}
2.局部内部类
内部类不仅可以在类中进行定义,也可以在类的局部位置定义,比如方法中。
interface OuterInterface{}
class Outer{
public OuterInterface doit(final String x){
class Inner implements OuterInterface{
Inner(String s){
s=x;
System.out.println(s);
}
}
return new Inner("doit");
}
}
内部类是doit方法的一部分,只能在方法内部访问内部类,但是该内部类可以访问方法的常量
以及外部类的所有成员。
3.匿名内部类
将上面代码改写:
class Outer{
public OuterInterface doit(){
return new OuterInterface(){
private i=0;
public int getValue(){
return i;
}
};
}
}
4.静态内部类
在内部类前添加static修饰符,该内部类就变为静态内部类。
静态内部类中可以声明静态成员,非静态内部类中不可以声明静态成员。
如果创建静态内部类的对象不需要外部类的对象引用。
不能从静态内部类的对象中访问非静态外部类的对象。
class Outer{
int i=0;
static int j=9;
static class Inner{
void doit(){
System.out.println(j);
}
}
}
1.成员内部类
内部类可以随意使用外部类的成员方法和成员变量,哪怕是这些成员被修饰为private。
外部类不能使用内部类的成员。
内部类对象依赖外部类对象创建
class OuterClass{
innerClass inner=new InnerClass();
public void ouf(){
inner.inf();
}
class InnerClass{
InnerClass(){}
int i=0;
public void inf(){
System.out.println("内部类方法");
}
}
public InnerClass getInstance(){
inner.y=9;
return new InnerClass();
}
public static void main(String args[]){
OuterClass outer=new OuterClass();
outer.InnerClass inner=outer.getInstance();
//outer.InnerClass inner=outer.new InnerClass();
}
}
如果在外部类中定义的成员变量与内部类中的成员变量名称相同,可以用this关键字。
class Outer{
int i=0;
class Inner{
int i=0;
public void print(int i){
i++; //调用的形参i
this.i++; //调用的内部类i
Outer.this.i++; //调用的外部类i
}
}
}
2.局部内部类
内部类不仅可以在类中进行定义,也可以在类的局部位置定义,比如方法中。
interface OuterInterface{}
class Outer{
public OuterInterface doit(final String x){
class Inner implements OuterInterface{
Inner(String s){
s=x;
System.out.println(s);
}
}
return new Inner("doit");
}
}
内部类是doit方法的一部分,只能在方法内部访问内部类,但是该内部类可以访问方法的常量
以及外部类的所有成员。
3.匿名内部类
将上面代码改写:
class Outer{
public OuterInterface doit(){
return new OuterInterface(){
private i=0;
public int getValue(){
return i;
}
};
}
}
4.静态内部类
在内部类前添加static修饰符,该内部类就变为静态内部类。
静态内部类中可以声明静态成员,非静态内部类中不可以声明静态成员。
如果创建静态内部类的对象不需要外部类的对象引用。
不能从静态内部类的对象中访问非静态外部类的对象。
class Outer{
int i=0;
static int j=9;
static class Inner{
void doit(){
System.out.println(j);
}
}
}