内部类
2016-04-24 22:16
204 查看
//匿名内部类
//位置:在外部类的某个方法内部,new对象的同时定义属性行为,所以只能用这一次
//访问修饰符:不存在
//class文件名:外部类的类名&数字编号
new Object(){
只能定义非static的属性和方法
如果outMethod是静态的,则不能访问外部类的非静态属性和方法;其他情况都可以访问
this代表当前的匿名内部类对象
如果内部类属性与外部类属性同名:使用外部类类名.this.属性名调用外部类的属性
如果内部类方法与外部类方法同名:使用外部类类名.this.方法名调用外部类的方法
无法访问内部类所在方法--即outMethod()中的的局部变量,只能访问常量
//局部内部类
//位置:在外部类的某个方法内部
//访问修饰符:没有
//class文件名字:外部类类名&数字编号+内部类类名
//产生对象:只能在内部类所在的方法中
class InnerClass3{
//只能定义非static的属性和方法
private int innerField31;
public void innerMethod31(){
//如果outMethod是静态的,则不能访问外部类的非静态属性和方法;其他情况都可以访问
//this代表当前内部类对象
//如果内部类属性与外部类属性同名:使用外部类类名.this.属性名调用外部类的属性
//如果内部类方法与外部类方法同名:使用外部类类名.this.方法名调用外部类的方法
//无法访问内部类所在方法的变量,只能访问常量
}
}
//直接new出来即可
InnerClass3 ic3 = new InnerClass3();
//无视访问修饰符视情况调用其属性和方法
静态内部类
// 位置:位于外部类的全局位置,但是添加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();
成员内部类
//位置:位于外部类的全局位置
//访问修饰符:决定能否在第三方类中使用该内部类
//class文件名:外部类名字$内部类名字。
//产生对象:可以在外部类的任意方法中,也可以在第三方类的方法中(考虑访问修饰符)
public class InnerClass1{
//属性:不能定义static的属性
private int innerField1;
int a;
//方法:不能定义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();
//位置:在外部类的某个方法内部,new对象的同时定义属性行为,所以只能用这一次
//访问修饰符:不存在
//class文件名:外部类的类名&数字编号
new Object(){
只能定义非static的属性和方法
如果outMethod是静态的,则不能访问外部类的非静态属性和方法;其他情况都可以访问
this代表当前的匿名内部类对象
如果内部类属性与外部类属性同名:使用外部类类名.this.属性名调用外部类的属性
如果内部类方法与外部类方法同名:使用外部类类名.this.方法名调用外部类的方法
无法访问内部类所在方法--即outMethod()中的的局部变量,只能访问常量
//局部内部类
//位置:在外部类的某个方法内部
//访问修饰符:没有
//class文件名字:外部类类名&数字编号+内部类类名
//产生对象:只能在内部类所在的方法中
class InnerClass3{
//只能定义非static的属性和方法
private int innerField31;
public void innerMethod31(){
//如果outMethod是静态的,则不能访问外部类的非静态属性和方法;其他情况都可以访问
//this代表当前内部类对象
//如果内部类属性与外部类属性同名:使用外部类类名.this.属性名调用外部类的属性
//如果内部类方法与外部类方法同名:使用外部类类名.this.方法名调用外部类的方法
//无法访问内部类所在方法的变量,只能访问常量
}
}
//直接new出来即可
InnerClass3 ic3 = new InnerClass3();
//无视访问修饰符视情况调用其属性和方法
静态内部类
// 位置:位于外部类的全局位置,但是添加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();
成员内部类
//位置:位于外部类的全局位置
//访问修饰符:决定能否在第三方类中使用该内部类
//class文件名:外部类名字$内部类名字。
//产生对象:可以在外部类的任意方法中,也可以在第三方类的方法中(考虑访问修饰符)
public class InnerClass1{
//属性:不能定义static的属性
private int innerField1;
int a;
//方法:不能定义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();
相关文章推荐
- 归并排序
- Hibernate4实战 之第六部分:基本实现原理
- [改善Java代码]推荐使用String直接量赋值
- 个人工作总结(6)
- php的mysqli用法
- 1_mysql +DBA职业发展
- 线程池懒加载实现初探
- 【模板】c++ 大数模板
- Windows下git的安装与设置
- 数据时代的平台架构项目开发那点事
- CSS-盒模型
- React-Native学习[起步]
- Java String.split用法
- Hibernate4实战 之第五部分:Hibernate的事务和并发
- 奇淫巧技之程序启动后在进程列表中隐藏密码等关键信息
- Elasticsearch升级1.5版本暴露jdk的bug
- Qt基础:样式表
- 我对多线程的理解和分类
- 2016年工作计划
- 我对多线程的理解和分类