java学习笔记(基础篇)—内部类
2019-08-16 10:56:13来源:博客园 阅读 ()
java学习笔记(基础篇)—内部类
一、内部类
1.顶层类和内部类的区别:
1)位置:
内部类是定义一个类的里面或者一个方法中,或者一个表达式中。
顶层类是定义在package下
2)修饰符:顶层类只能处于public和默认访问级别,
成员内部类可以处于public, protected, private和默认这4种访问级别;
2.作用:
1)可以避免命名冲突。
2)定义类的范围从package变成了类。在一个类的内部定义的类称为内部类。
3)进行再一次的封装
4)分担外围类的功能
3.内部类的分类:
? 变量按照作用域可分为:
? 1) 成员变量: 实例变量、静态变量;
? 2) 局部变量;
? 同样,内部类按照作用域可分为;
? 1) 成员内部类: 实例内部类、静态内部类;
? 2) 局部内部类;放在方法里
? 3) 匿名内部类
a) 静态内部类: 用static修饰,相当于静态方法。放在方法外,类里面的。
静态内部类具有以下特点:
1)静态内部类可以直接访问外部类的静态资源。如果静态内部类中的变量名字和外围类的变量名字相同,需要指定访问时的谁的名字。
2)静态内部类如果访问外部类的实例成员,
就必须通过外部类的实例去访问。
3)静态内部类的实例不会自动持有外部类的特定实例的引用,
在创建静态内部类的实例时,不必创建外部类的实例。
4)在静态内部类中可以定义静态成员和实例成员。
5)外围类可以通过完整的类名直接访问静态内部类的静态成员。
6)外围类可以通过内部类对象调用静态内部类对象的非静态成员。
7)在静态内部类中和外围类中创建静态内部类的对象:
静态内部类类名 m=new 静态内部类类名();
在其他类中创建静态内部类的对象:
外围类.静态内部类类名 m= new 外围类.静态内部类类名();
b)实例内部类:没有static修饰符。相当于成员变量。放在方法外,类里面的。
特点:
1)在内部类中,可以直接访问外部类的所有资源(属性和方法)。
2)成员内部类不能定义静态的资源,只能定义非静态的资源。
3)外围类不能直接访问成员内部类的资源.先创建成员内部类的对象,在通过调用非静态资源(对象.资源).
4)在成员内部类中和外围类中创建成员内部类的对象成员内部类中:
类名 m=new 成员内部类类名();
外围类中:
类名 m=this.new 成员内部类类名();
在其他类中创建成员内部类的对象:
外围类.成员内部类类名 m=new 外围类().new 成员内部类类名();
5)在创建实例内部类的实例时,外部类的实例必须已经存在。
6)在成员内部类中调用外围类中同名资源:
外围类.this.资源
7)如果实例内部类B与外部类A包含同名的成员,
那么在类B中,this.v表示类B的成员, A.this.v表示类A的成员
8)实例内部类的实例自动持有外部类的实例的引用。
9)外部类实例与内部类实例之间是一对多的关系,一个内部类实例只会引用一个外部类实例,而一个外部类实例对应零个或多个内部类实例。
c) 局部内部类: 在一个方法中定义的内部类,它的可见范围是当前方法。和局部变量一样。
特点:
1)局部内部类只能在当前方法中使用。
2)局部内部类和实例内部类一样,不能包含静态成员。
3)在局部内部类中定义的内部类也不能被public、
protected和private这些访问控制修饰符以及static修饰(都是局部的);
4)可以访问外部类的所有成员。
5)局部内部类还可以访问所在方法中的final类型的局部变量。final延长局部变量的生命周期。
d)匿名内部类:在一个方法中定义的内部类,它的可见范围是当前方法。和局部变量一样。
特点:
1)没有类名,使用接口或者抽象类代替类名
2)访问外围类的一切资源(方法和属性)
3)访问该方法final修饰的局部变量,jdk1.8以后不需要
4)放在方法中或者作为参数。
几种内部类的区别:
- 创建
a. 声明的位置:
静态内部类:类的内部,方法的外部,用static关键字修饰;
实例内部类:类的内部,方法的外部,不用static关键字修饰;
局部内部类:方法的内部;
匿名内部类:既可以在类的内部,方法的外部,也可以在方法的内部;
b. 实例化方式:
静态内部类:new Outer.Inner(); //在外部类外创建;
new Inner(); //在外部类内内部类外创建
实例内部类:new Outer().new Inner(); //在外部类外创建;
this.new Inner(); //在外部类内内部类外创建
局部内部类:new Inner(); //只能在方法内部创建
匿名内部类:new 类名() {};
- 访问
a. 外部类访问内部类:
静态内部类:通过完整的类名直接访问静态内部类的静态成员;
实例内部类:通过内部类的实例去访问内部类的成员;
局部内部类:不能访问;
匿名内部类:不能访问; b. 内部类访问外部类:
静态内部类:直接访问外部类的静态成员;
实例内部类:可以直接访问外部类的所有成员;
如果实例内部类B与外部类A包含同名的成员,那么在类B中, this.v表示类B的成员,
A.this.v表示类A的成员。
局部内部类:可以直接访问外部类的所有成员, 访问所在方法中的final类型的参数和变量;
匿名内部类:可以直接访问外部类的所有成员, 访问所在方法中的final类型的参数和变量;
//成员内部类,静态内部类
StaticInnerTest.class
StaticInnerTest$MaxMin.class
//局部内部类
LocalInnerTest.class
LocalInnerTest$1MaxMin.class
//匿名内部类
AnonymousInnerTest.class
AnonymousInnerTest$1.class
内部类的使用:
图形化界面中组件的监听事件工厂模式,在内部类只有在该外围类有意义,出了该外围类就没有意义了, 就可以将该类定义成内部类。
原文链接:https://www.cnblogs.com/chlinlearn/p/11227762.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 国外程序员整理的Java资源大全(全部是干货) 2020-06-12
- 2020年深圳中国平安各部门Java中级面试真题合集(附答案) 2020-06-11
- 2020年java就业前景 2020-06-11
- 04.Java基础语法 2020-06-11
- Java--反射(框架设计的灵魂)案例 2020-06-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash