各位老铁们,大家好,今天由我来为大家分享深入解析Java内部类:成员、静态、方法与匿名内部类,以及的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!
二、为什么需要内部类
典型的情况是内部类继承某个类或者实现某个接口,内部类的代码操作创建其他外部类的对象。因此,您可以将内部类视为提供某种进入其封闭类的窗口。
使用内部类最有吸引力的原因是:
每个内部类都可以独立地继承一个(接口的)实现,因此外部类是否继承了(接口的)实现,对内部类没有影响。如果没有内部类提供的从多个具体或抽象类继承的能力,一些设计和编程问题将难以解决。从这个角度来看,内部类使多重继承的解决方案变得完整。接口解决了部分问题,而内部类有效地实现了“多重继承”。
三、静态内部类(静态嵌套类)
在类内部定义的静态类是静态内部类。也称为顶级嵌套类。
类外部{
静态类内部{}
}
类测试{
公共静态无效主(字符串[] args){
Outer.Inner n=new Outer.Inner();
}
}1.静态内部类可以访问外部类的所有静态变量和方法,甚至是私有的。
2、静态内部类与一般类一致,可以定义静态变量、方法、构造函数等。
3、其他类如果使用静态内部类,则需要使用“外部类.静态内部类”方法,如下所示:
Out.Inner 内部=new Out.Inner();inner.print();
4、Java集合类HashMap内部有一个静态内部类Entry。 Entry是HashMap存储元素的抽象。
HashMap内部维护了Entry数组来存储元素,但是Entry对用户是透明的。像这样和外部
如果类密切相关并且不依赖于外部类实例,则可以使用静态内部类。
static的含义是内部类可以像其他静态成员一样被访问而无需外部类对象。静态嵌套类只能访问外部类的静态成员和方法。
四、成员内部类
在类内部定义的非静态类是成员内部类。成员内部类不能定义静态方法和变量(被final修饰的除外)。这是因为成员内部类是非静态的。类初始化时,首先初始化静态成员。如果成员内部类允许定义静态变量,那么成员内部类的静态变量的初始化顺序是不明确的。
类外层{
类内部{}
}编译上面的代码会生成两个文件:Outer.class和Outer$Inner.class。
五、局部内部类(方法内部类)
方法中定义的类是本地类。如果一个类仅在某个方法中使用,请考虑使用本地类。
类外层{
公共无效doSomething(){
最终int a=10;
类内部{
公共无效seeOuter(){
System.out.println(a);
}
}
内部in=new Inner();
in.seeOuter();
}
公共静态无效主(字符串[] args){
外部out=new Outer();
out.doSomething();
}
}1.方法内部类只能在定义该内部类的方法内实例化,不能在该方法外实例化。
2、方法内部类对象不能使用内部类所在方法的非final局部变量。
由于方法的局部变量位于堆栈上,因此它们仅在方法的生命周期内存在。当一个方法结束时,它的堆栈结构被删除,局部变量成为历史。但方法结束后,方法内创建的内部类对象可能仍然存在于堆中!例如,如果对它的引用传递给其他代码并存储在成员变量中。因为不能保证局部变量的生命周期与方法的内部类对象的生命周期一样长,所以内部类对象不能使用它们。
六、匿名内部类
匿名内部类是没有名称的内部类。当程序中使用匿名内部类时,通常会在定义匿名内部类的地方直接创建该类的对象。匿名内部类的声明格式如下:
新的父名称(){
.//内部类的定义
}对于匿名内部类,我们必须继承一个父类或者实现一个接口。当然,我们只能继承一个父类或者实现一个接口。同时它没有class关键字,因为匿名内部类直接使用new来生成对象的引用。
1、什么情况下需要使用匿名内部类?如果满足下面的一些条件,使用匿名内部类是比较合适的:仅使用该类的一个实例。类在定义后立即使用。类非常小(SUN 建议少于4 行代码)。命名类并不会让你的代码更容易理解。2、在使用匿名内部类时,要记住以下几个原则:匿名内部类不能有构造函数。匿名内部类不能定义任何静态成员或静态方法。匿名内部类不能是公共的、受保护的、私有的或静态的。只能创建一个匿名内部类的实例。匿名内部类必须在new后面,用于隐式实现接口或实现类。因为匿名内部类是局部内部类,所以对局部内部类的所有限制都适用于它们。继承匿名内部类
公共课汽车{
公共无效驱动器(){
System.out.println("开车!");
}
公共静态无效主(字符串[] args){
汽车汽车=新车(){
公共无效驱动器(){
System.out.println("驾驶另一辆车!");
}
};
汽车.驾驶();
}
}
结果输出:驾驶另一辆车! Car引用变量并不是指Car对象,而是指Car匿名子类的对象。接口风格的匿名内部类。
接口车辆{
公共无效驱动器();
}
类测试{
公共静态无效主(字符串[] args){
车辆v=新车辆(){
公共无效驱动器(){
System.out.println("开车!");
}
};
v.drive();
}
}
上面的代码很奇怪,好像是实例化一个接口。事实并非如此,接口风格的匿名内部类是实现接口的匿名类。并且只能实现一个接口。参数化匿名内部类。
类酒吧{
无效doStuff(Foo f){
f.foo();
}
}
接口Foo{
无效foo();
}
类测试{
静态无效去(){
酒吧b=新酒吧();
b.doStuff(new Foo(){
公共无效foo(){
System.out.println("foofy");
}
});
关于深入解析Java内部类:成员、静态、方法与匿名内部类,的介绍到此结束,希望对大家有所帮助。
【深入解析Java内部类:成员、静态、方法与匿名内部类】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
终于开始学习Java了,内类这个概念还挺难懂的样子。
有8位网友表示赞同!
之前总觉得Java代码看着有点复杂,现在知道是因为这些内类的关系。
有11位网友表示赞同!
成员内部类和静态嵌套类的区别我一直弄混,这篇文章正好来梳理一下。
有10位网友表示赞同!
匿名内部类的使用场景还挺具体的,需要慢慢理解每个地方的作用。
有11位网友表示赞同!
这个标题包含的Java内容真丰富!希望讲解详细一点儿。
有9位网友表示赞同!
想学习一下高级的Java知识,内类是必学啊。
有5位网友表示赞同!
看这标题就知道这次的内容要深入一些了,很期待。
有9位网友表示赞同!
以前没接触过这些类型的内类,现在看来还是很有用的工具。
有10位网友表示赞同!
Java程序员都是怎么掌握这些知识的?学习资料少吗?
有9位网友表示赞同!
需要好好复习下Java的基础语法才能理解这个内容吧?
有19位网友表示赞同!
这篇文章写的很全面,包含了所有类型的内类,很实用。
有20位网友表示赞同!
我觉得静态嵌套类的使用场景比较明确,比较好理解。
有8位网友表示赞同!
想要成为优秀的Java程序员,内类一定要学会啊!
有9位网友表示赞同!
这个文章标题很吸引人,期待能看得到详细的讲解内容。
有9位网友表示赞同!
学习这些Java知识需要多少时间?有人分享一下经验吗?
有7位网友表示赞同!
成员内部类的访问权限有点难度,希望解释清楚。
有13位网友表示赞同!
匿名内部类看起来比较神秘,但我感觉很有用的样子。
有18位网友表示赞同!