您的位置:首页 > 其它

内部类

2016-04-24 22:02 127 查看
public class OutClass1 {

//成员内部类

//位置:位于外部类的全局位置

//访问修饰符:决定能否在第三方类中使用该内部类

//class文件名:外部类名字$内部类名字。

//产生对象:可以在外部类的任意方法中,也可以在第三方类的方法中(考虑访问修饰符)

public class InnerClass1{

//属性:不能定义static的属性(常量可以是static)
private int innerField1;

//方法:不能定义static的方法
public void innerMethod(){
//可以访问外部类的任意属性和方法
//使用this代表的是内部类对象
//如果内部类属性与外部类属性同名:使用外部类类名.this.属性名调用外部类的属性
//如果内部类方法与外部类方法同名:使用外部类类名.this.方法名调用外部类的方法
}
}

public void outMethod(){
//可以直接产生内部类对象,然后无视访问修饰符视情况调用其属性和方法
InnerClass1 ic1 = new InnerClass1();
ic1.innerField1 = 199;
}


}

class ThirdClass1{

public static void main(String[] args) {
//在第三方类中产生内部类对象,必须先产生外部类对象
OutClass1 oc1 = new OutClass1();
//使用特殊外部类对象.new的语法产生内部类对象
OutClass1.InnerClass1 inc1 = oc1.new InnerClass1();
//根据访问修饰符视情况调用属性和方法
inc1.innerMethod();
}


}

public class OutClass2 {

static int a;

// 静态内部类

// 位置:位于外部类的全局位置,但是添加static修饰符

// 访问修饰符:决定能否在第三方类中使用该内部类

// class文件名:外部类名字$内部类名字

//产生对象:可以在外部类的任意方法中,也可以在第三方类的方法中(考虑访问修饰符)

public static class InnerClass2 {

//属性可以定义静态和非静态的

private int innerFiled21;

private static int innerFiled22;

private int a;

//方法可以定义静态和非静态的
public void innerMethod21() {
//只能访问外部类的静态属性和静态方法
//this代表内部类对象
//如果属性方法出现同名的情况,用外部类类名.的方式特制外部类中的属性方法
}
public static void innerMethod22() {
//只能访问外部类的静态属性和静态方法
}
}

public void a(){
//直接new出内部类对象
InnerClass2 ic2 = new InnerClass2();
//用对象名.的方式访问内部类的非static属性和方法,无视访问修饰符
ic2.innerFiled21 = 100;
//用内部类类名.的方式访问内部类的static属性和方法,无视访问修饰符
InnerClass2.innerMethod22();
}


}

class ThirdClass2{

public static void main(String[] args) {
//无需产生外部类对象,使用外部类类名.内部类类名的方式产生内部类对象
OutClass2.InnerClass2 ic2 = new OutClass2.InnerClass2();
//根据访问修饰符,调用属性和方法
ic2.innerMethod21();
}


}

public class OutClass3 {

public void outMethod(){
//局部内部类
//位置:在外部类的某个方法内部
//访问修饰符:没有
//class文件名字:外部类类名&数字编号+内部类类名
//产生对象:只能在内部类所在的方法中
class InnerClass3{
//只能定义非static的属性和方法(常量可以是static)
private int innerField31;

public void innerMethod31(){
//如果outMethod是静态的,则不能访问外部类的非静态属性和方法;其他情况都可以访问
//this代表当前内部类对象
//如果内部类属性与外部类属性同名:使用外部类类名.this.属性名调用外部类的属性
//如果内部类方法与外部类方法同名:使用外部类类名.this.方法名调用外部类的方法
//无法访问内部类所在方法的变量,只能访问常量
}
}

//直接new出来即可
InnerClass3 ic3 = new InnerClass3();
//无视访问修饰符视情况调用其属性和方法
ic3.innerField31 = 100;
}


}

public class OutClass4 {

public static void outMethod(){
//匿名内部类
//位置:在外部类的某个方法内部,new对象的同时定义属性行为,所以只能用这一次
//访问修饰符:不存在
//class文件名:外部类的类名&数字编号
new Object(){
//只能定义非static的属性和方法(常量可以是static)
private int innerField41;

public void innerMethod41(){
//如果outMethod是静态的,则不能访问外部类的非静态属性和方法;其他情况都可以访问
//this代表当前的匿名内部类对象
//如果内部类属性与外部类属性同名:使用外部类类名.this.属性名调用外部类的属性
//如果内部类方法与外部类方法同名:使用外部类类名.this.方法名调用外部类的方法
//无法访问内部类所在方法--即outMethod()中的的局部变量,只能访问常量
}
};

}


}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: