import java.awt.*;
import java.awt.event.*;public class MyFrame {
public static void main(String[] args) {
new Frame1();
}
}
class Frame1 extends Frame {
Frame1() {
class AASD extends WindowAdapter {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
addWindowListener(new AASD());
setSize( 350, 200 );
setVisible( true );
}
}================================================================
问题1:
在MyFrame 的 main 中:new Frame1();
获取了一个对象。却没有任何引用。可是它不会被System.gc()回收啊!这又是为什么呢?------------
问题2:
D:\MyJava>javac MyFrame.java
MyFrame.java:21: addWindowListener(java.awt.event.WindowListener) in java.awt.Window cannot be applied to (WindowAdapter)
addWindowListener(new AASD());
^
说不能在这里应用; AASD能做向上转型啊。为什么不对呢?
我为此专门做了测试却能正常运行,代码如下:
interface Contents { // can't use public modifer;
int values();
}
abstract class CC {
int v(){return 1;}
}
class DD {
int e(){return 55;}
}public class Parcel6 { public static Contents dest() {
return new Contents() {
private int i = 4;
public int values() {
return i;
}
};
} class AASC extends CC {
int v() {return 3;}
} public CC dd() {
return new AASC();
} public DD ee() {
return new DD() {
public int e() {
return 33;
}
};
} public static void main(String[] args) {
System.out.println(Parcel6.dest().values());
Parcel6 p6 = new Parcel6();
System.out.println(p6.dd().v());
System.out.println(p6.ee().e());
}
}
问题3:
帖子 http://community.csdn.net/Expert/topic/3977/3977241.xml?temp=.310589 中:
方法wi.super();是如何实象"获取 期望继承某个内部类的外部类的 引用"
import java.awt.event.*;public class MyFrame {
public static void main(String[] args) {
new Frame1();
}
}
class Frame1 extends Frame {
Frame1() {
class AASD extends WindowAdapter {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
addWindowListener(new AASD());
setSize( 350, 200 );
setVisible( true );
}
}================================================================
问题1:
在MyFrame 的 main 中:new Frame1();
获取了一个对象。却没有任何引用。可是它不会被System.gc()回收啊!这又是为什么呢?------------
问题2:
D:\MyJava>javac MyFrame.java
MyFrame.java:21: addWindowListener(java.awt.event.WindowListener) in java.awt.Window cannot be applied to (WindowAdapter)
addWindowListener(new AASD());
^
说不能在这里应用; AASD能做向上转型啊。为什么不对呢?
我为此专门做了测试却能正常运行,代码如下:
interface Contents { // can't use public modifer;
int values();
}
abstract class CC {
int v(){return 1;}
}
class DD {
int e(){return 55;}
}public class Parcel6 { public static Contents dest() {
return new Contents() {
private int i = 4;
public int values() {
return i;
}
};
} class AASC extends CC {
int v() {return 3;}
} public CC dd() {
return new AASC();
} public DD ee() {
return new DD() {
public int e() {
return 33;
}
};
} public static void main(String[] args) {
System.out.println(Parcel6.dest().values());
Parcel6 p6 = new Parcel6();
System.out.println(p6.dd().v());
System.out.println(p6.ee().e());
}
}
问题3:
帖子 http://community.csdn.net/Expert/topic/3977/3977241.xml?temp=.310589 中:
方法wi.super();是如何实象"获取 期望继承某个内部类的外部类的 引用"
解决方案 »
- JAVA取文件问题。附代码,请高手指点!!!!!!!!!!!!!!!!!!!!!!!!!!
- 谁用过FineReport,帮我
- 求助sql查询 sql拼的好的进来 谢谢咯
- 在Java开发中Applet的使用广泛吗?有那些应用呢?
- 什么是脚本语言,还有什么其他类型的语言?
- 求助大神们,为啥这个程序报异常呢……
- 如何设置JTABLE某一个单位格的TEXT的值
- 如何在JPane中放图片?(在线等待)
- 怎样用java application弹出一个窗口?在线等待!!
- java画十个矩形放在一个大矩形内,这十个矩形不能重叠,不能越界,该如何实现
- 实现了Runnable接口就可以用start方法启动,这句话对嘛?
- 一个基础问题想请问各位大大!!
2.WindowAdapter这是个接口还是abstract class 啊,查一下啊,好像看过要是继承的话,必须要实现所有方法。
3.我去看看先
不过你说的也有道理。假如该对象正在使用中。是释放不掉的。
WindowAdapter 是一个 abstract class ;方法我都已经实象了。
如果没有完全实象的话会有其他错误提示的呀。(并会指出未实象的方法)
public class MyFrame {
public static void main(String[] args) {
new Frame1(0);
System.gc();
new Frame1(1);
System.gc();
new Frame1(2);
System.gc();
}
}class Frame1 {
int i=0;
Frame1(int ii) {
i = ii;
System.out.println("Frame1("+i+");");
}
public void finalize() {
System.out.println("finalized("+i+");");
}
}
System.out: _____________________
D:\MyJava>javac MyFrame.javaD:\MyJava>java MyFrame
Frame1(0);
finalized(0);
Frame1(1);
finalized(1);
Frame1(2);
finalized(2);
--------------------------------
re 问题2
我这里确实会出现上面的问题啊;就是提示出错:_____________
D:\MyJava>javac MyFrame.java
MyFrame.java:21: addWindowListener(java.awt.event.WindowListener) in java.awt.Window cannot be applied to (WindowAdapter)
addWindowListener(new AASD());
^
能告诉我您的编译环境么 ? 我就是jdk1.5的;
--------------------------------
re 问题3
呵呵。。这是我学习的一种习惯; 我就是要弄懂这个 为什么。
因为我认为:
如果只是记住它。那您只能在您所接触过的环境下面使用您所记得的方法;
也缺少了灵活应用它的思维;
这个好比是 我们学生时代学习理科时接触到的那些“公式”(我认为公式也是教条)。
我们一定要理解它的真正含义;方能做的“灵活运用”这四个字;
好比说为什么三角形的 面积=底X高/2; 我都会给它一个也能让人家理解说法。我认为这是一个非常好的习惯!
import java.awt.*;
import java.awt.event.*;public class MyFrame {
public static void main(String[] args) {
Frame1 f=new Frame1();
}
}
class Frame1 extends Frame {
Frame1() {
addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent e){setVisible(false);System.exit(0);}});
setSize( 350, 200 );
setVisible( true );
}
}
}
呵呵。。我就是故意改了一下。结果发现出错了。 现在找错在哪里
0_-!!
问题1:首先您的第二个实验强行启动了垃圾处理回收机制,这并不是一个被提倡的方法。System.gc()会强迫执行垃圾回收器,终结动作便会发生于所有对象之上。这才是导致您的多个对象被回收的原因。问题2:恭喜楼主已经解决问题3:我和敬佩楼主对技术细节的把控与追求,但是引用前人的话说 在学习C++时,最重要的事情就是集中关注概念,不要迷失在语言的技术细节中。...为此,对于程序设计和设计技术的理解远比对细节的理解更重要,而这种理解的根本是时间和实践。
—— C++之父 Bjarne Stroustrup我仔仔细细的看完了第三个问题的帖子的每一个回复,并且查阅了相关资料,在这个问题上,wi.super()的调用似乎更像是为了解决某一特殊问题的实现方案,就比如Serialize interface只是被用来告诉JVM,实现该接口的对象可以被安全的串行化,以及Cloneable接口同样是用来表示一个对象可以被安全的克隆一样。
我是一个JAVA初学者,也并不清楚楼主已经达到JAVA层次,但是如果您和我一样还是一个刚刚涉及语言设计细节的学者,给一个小小的建议,那就是请先将此问题做为一个约定俗成的规范加以调用,技术的细节在您确实需要了解他的内在时再去深究也不迟。@.@||~
突然间我注意到了下面的两个函数:setSize( 350, 200 );setVisible( true );
设想一下,假如new Frame1();了之后没有一个引用指向这个对象的话,那么上面的这两个函数将无法对这个new出来的实例做设定大小和是否可见的操作!(也就意味着一定有一个引用,指着它)
re 问题二:
其实我只是把一个无名类赋予了个名字(AASD)。却发现不能运行;但是在我的测试中。使用同样的方法对无名类赋予名字却是可行的。
sorry.我还没有解决;我这里运行的时候就是提示错误。内容如下:
D:\MyJava>javac MyFrame.java
MyFrame.java:21: addWindowListener(java.awt.event.WindowListener) in java.awt.Window cannot be applied to (WindowAdapter)
addWindowListener(new AASD());
^
您那里能通过吗?能告诉我您使用的开发环境么?re 问题三:
说来说去。就是我对super的疑惑;看下面的代码:
说明一下,tij中前面的介绍super的我都清楚。
用我前面所了解的super来对这个super做解释时发生的困难。
我也是Java初学者。class Super{} //注意这里是大写的Sclass WithInner {
class Inner extends Super {}
}public class InheritInner extends WithInner.Inner {
....
InheritInner(WithInner wi) {
wi.super()
}
WithInner wi = new WithInner();
InheritInner ii = new InheritInner(wi);
....
}
我认为这时:wi.super() 是调用类 Super 构造函数。
这与结果(初始化那个神秘reference)不符;对于问题3。我打算暂时不去追究这个"为什么"。或许目前的知识面太窄,理解比较难。
各位大哥们。知道的告诉我一声。如果觉得分少。可以提出来。几百分是给的起的。!
我想这种问题应该不是很难啊。只是我的知识范围窄。眼光短,看不出问题出在哪里。其实我只是把一个无名类赋予了个名字(AASD)。却发现不能运行;但我新做了个测试。使用同样的方法对无名类赋予名字却是可行的。问题代码如下:==============================
import java.awt.*;
import java.awt.event.*;public class MyFrame {
public static void main(String[] args) {
new Frame1();
}
}
class Frame1 extends Frame {
Frame1() {
//这样写是不行的。出错提示见下面:
class AASD extends WindowAdapter {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
addWindowListener(new AASD());
/**这样写就没事了能告诉我为什么吗 ?各位大哥!
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
*/
setSize( 350, 200 );
setVisible( true );
}
}错误提示如下:_____________________
D:\MyJava>javac MyFrame.java
MyFrame.java:21: addWindowListener(java.awt.event.WindowListener) in java.awt.Window cannot be applied to (WindowAdapter)
addWindowListener(new AASD());
^
没有被回收,说明还有引用指向他。
我想这里主要有嫌疑的地方就是 setVisbale 方法。我想这个方法执行的时候已经把这个frame的引用传递给了另外一个线程。另外那个线程持有这个引用。我们看到窗口你不关闭它是不会自己关闭的,可见存在另外一个线程。import java.awt.*;
import java.awt.event.*;public class Hello {
public static void main(String[] args) {
new Frame1();
}
}
class Frame1 extends Frame {
Frame1() {
class AASD extends WindowAdapter {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
addWindowListener(new AASD());
setSize( 350, 200 );
setVisible( true );
System.out.println("Ok");
}
}
为了试验,构造函数中加入一句。当输出 Ok 的时候,可见setVisible函数已经运行完毕。
我只能说感觉的到你说的大概意思。呵呵。
不过我认为您举的例子不能证明 已经有一个reference 指向 Frame1了。
println("Ok");在完成构造之前就打印出来的。所以。无论如何 ok都会显示的。我自己的电脑编译时就出错了。
========================================
D:\MyJava>cd tmpD:\MyJava\tmp>javac Hello.java
Hello.java:16: addWindowListener(java.awt.event.WindowListener) in java.awt.Window cannot be applied to (AASD)
addWindowListener(new AASD());
^
1 errorD:\MyJava\tmp>
公司里的就能通过编译。能正常执行。
用的都是同一个操作系统版本 java的开发环境也是相同的呀。