关于Java 匿名内部类的疑问!

来源:百度知道 编辑:UC知道 时间:2024/06/25 04:12:35
我想问一下,匿名内部类到底 是说的谁匿名啊!
interface Useing{
public void kk()
}
class Usein
{
Useing a=new Useing(){
public void kk()
{
System.out.println("这是一个接口类型的匿名内部类")
}
};
void print(){
a.kk();
}
}
class text
{
public static void main(String args[])
{
Usein b=new Usein();
b.print();
}
}
因为Usein是一个接口,不能进行实例化。 所以创建了一个匿名类,实现接口中的抽象方法!
1、匿名类说的到底是 谁匿名??
2、堆栈结构中, 栈是先进后出的,那么堆呢??因为 方法的局部变量位于栈上,对象位于堆上! 所以内部类对象不能使用 局部变量!
请用你自己的话给我 说一下堆和栈的详细情况!
(谢绝复制)

1.使用接口创建出来的而非使用类实现接口出来的就是匿名类了。
因为接口是无法new的,而使用接口new对象实际是就是产生了一个没有进行命名的类,而这种类就叫做匿名类了。
interface Abc{
public void fn();
}
class Test{
void fn(){
//这里的new Abc()就是一个匿名类,由接口直接产生,而未通过class XXX implements Abc得到
new Abc(){
public void fn(){}
}
}
}

2.不太清楚你问的东西大概什么意思?说一下我的理解
一个类定义完毕,如果JAVA虚拟机加载了这个类,那么它会将所有的static修饰的成员(变量和方法)加载入栈内存,这一部分内存只有一种时候才会被释放,就是JVM退出的时候。
如果使用该类定义了一个对象,也就是new出来的东西,那么会在堆内存中创建一块内存地址,用于存放这个对象,当该对象被释放掉时(JVM不退出,仅仅是回收了这一块内存),被占用内存将清空。
至于内部类的问题,本人认为内部类实际上就是在一个类中定义了一种新的数据类型,当这种数据类型没有被使用时,JVM不会加载它,换句话说,内部类也是一种类,不使用就不加载,只不过它的格式特殊一些而已,单从JAVA编译后的形态来看,内部类独立成一个.class文件,只不过类名是:外部类名$内部类名.class。所以内部类操作时和普通类是一样的,完全满足普通类的各种加载释放原理。
引用LZ的原话“方法的局部变量位于栈上”这句话我不能苟同,本人认为局部变量是在堆内存中的。

匿名类的问题,xianyiqingling 答复是正确的。

关于堆栈的问题,变量和对象的分布问题。
全部对象都是全局对象,都是从全局堆分配的。
局部变量的引用可能是在栈里?搞不清楚。

但内部类对象是可以引用final局部变量的,这意味着,该变量的对象引用是不会更改的,就不会对程序的执行逻辑带来不可预测的影响。由于对象都在全局堆里,所以final