例如:
Toolkit kit=Toolkit.getDefaultToolkit(); 
Dimension screenSize=kit.getScreenSize();
int screenWidth=screenSize.width;
int screenHeight=screenSize.height;
前两句无法理解呀,问题如下:1)Toolkit是一个抽象类,不能被实例化,那么使用getDefaultToolkit静态方法得到的kit变量是什么?
2)getScreenSize()方法是个抽象方法,怎么可以调用抽象类的抽象方法去得到后面的数据(屏幕的宽和高)?

解决方案 »

  1.   

    1)得到的是 Toolkit 的子类,
    2)上面得到的子类已经实现了该方法。
    具体子类是什么,楼主调试时可以看到。
      

  2.   

    LZ试着理解一下下面的代码public class Test {
        public static void main(String[] args) {
            A a = A.getDefaultA();
            System.out.println(a.getSomeValue());
        }
    }abstract class A {
        public static A getDefaultA() {
            return new B();
        }    public abstract Object getSomeValue();
    }class B extends A {
        public Object getSomeValue() {
            return "some value";
        }
    }
      

  3.   

    4楼的例子我懂,虽然A类是抽象类,但B类是实体类,所以可以,但我的例子中找不到实现Toolkit的实体子类。其实我想问的关键应该就是这点了。我把代码全写出来,大家帮我看看,谢谢了!
    import java.awt.*;
    import javax.swing.*;public class SizedFrameTest{
    public static void main(String[] args){
    EventQueue.invokeLater(new Runnable(){
    public void run(){
    SizedFrame frame=new SizedFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
    }
    });
    }
    }

    class SizedFrame extends JFrame{
    public SizedFrame(){
    Toolkit kit=Toolkit.getDefaultToolkit();  
    Dimension screenSize=kit.getScreenSize();
    int screenWidth=screenSize.width;
    int screenHeight=screenSize.height;
    setSize(screenWidth/2,screenHeight/2);
    }
    }
      

  4.   

    刚刚看了一下java.awt.Toolkit实现的源码,虽然不是太懂,但估计Toolkit.getDefaultToolkit方法得到了实类sun.awt.HeadlessToolkit(该实类是java.awt.Toolkit的子类)的实例,这样我就理解了,谢谢大家。
      

  5.   

    这个Tookit的实体是根据系统而改变的,为了跨平台,所以具体的实体并不提供给你用户直接使用,Lz自己看下javadoc的说明吧getDefaultToolkit
    public static Toolkit getDefaultToolkit()获取默认工具包。 
    如果名为 "java.awt.headless" 的系统属性被设置为 true,则使用 Toolkit 的 headless 实现。 如果不存在 "java.awt.headless" 或 "java.awt.headless" 被设置为 false,且存在名为 "awt.toolkit" 的系统属性,则该属性将被视为 Toolkit 子类的名称;否则将使用特定于平台的默认 Toolkit 实现。 还可以使用 Sun 引用实现中指定的属性 'assistive_technologies' 将其他类加载到 VM 中,该属性是在 'accessibility.properties' 文件的一个行中指定的。形式是 "assistive_technologies=...",其中 "..." 是以逗号分隔的、要加载的辅助技术类的列表。每个类都以给定的顺序加载,并且要使用 Class.forName(class).newInstance() 创建每个类的单独实例。此操作在创建 AWT 工具包之后进行。所有错误都通过 AWTError 异常来处理。 
    返回:
    默认工具包。 
    抛出: 
    AWTError - 如果不能找到工具包,或者不能访问或实例化工具包。
    然后LZ自己查看一下系统属性public class Test {
        public static void main(String[] args) {
            System.out.println(System.getProperties().getProperty("java.awt.headless"));
            System.out.println(System.getProperties().getProperty("awt.toolkit"));
        }
    }如果是windows平台,估计LZ能查到
    sun.awt.windows.WToolkit
    这个就是具体实现
    可以把jre路径下的lib下的rt.jar解压
    查看jre\lib\rt\sun\awt\windows路径,能找到WToolkit.class