有两个疑惑:

1. Dimension和Toolkit都是类,为什么这段代码可以不用new?

2. 为什么写成Dimension di=Toolkit.getScreenSize();这样提示不能从静态上下文中引用非静态方法,但是加上getDefaultToolkit()这个方法其实也是静态类型的啊?

手掌心
浏览 338回答 2
2回答

江户川乱折腾

不需要用new是因为getScreenSize实例方法内部已经根据屏幕的尺寸new好了一个Dimension类的对象,只需要返回这个对象就行了。前面已经提到了getScreenSize是一个实例方法,更准确地讲它是类Toolkit的一个实例方法,所以必须通过一个Toolkit类的对象才能调用这个方法。而getDefaultToolkit是类Toolkit的一个静态方法(所以通过类名.方法名的形式调用),这个方法会返回一个类Toolkit的对象,再通过这个返回的对象就可以调用getScreenSize了。所以,不能通过Toolkit.getScreenSize来调用getScreenSize方法,因为它不是静态方法需要通过一个类Toolkit的实例来调用,而静态方法getDefaultToolkit就可以返回一个类Toolkit的实例。

绝地无双

首先,Dimension di=Toolkit.getDefaultToolkit().getScreenSize();这个引用方法是正确的引用方法。你的疑问有三个.第一,为什么可以不用new,因为在得到一个实体对象除了new外,也可以通过方法返回一个实体对象。在上面那条语句里就是getScreenSize()这个方法,至于getScreenSize()方法里是怎么创建Dimension 对象的,你不需要关心,这就是封装的一种。第二,为什么Toolkit.getScreenSize();不能直接引用,因为这个方法不是静态方法这个方法必须使用一个实体类去引用,而getDefaultToolkit()方法才是一个静态方法,他可以通过类名+方法名直接引用,作用就是返回一个Toolkit的实体类。之后就可以用这个实体类去调用非静态方法了。分解一下代码你就能看明白了。第三,为什么一个抽象类可以直接被引用。抽象对象和接口是可以被引用和实例化的,只是不能通过new自己来进行实例化,首先这点要弄清楚。抽象类和接口,可以通过方法,或者new他的非抽象子类来进行实例化,之后使用方法就和普通类是一样的了。而调用静态方法只需要类名或者接口名就可以了,在java8里还增加了default关键字来定义默认方法体,接口也可以有自己的方法体了。
打开App,查看更多内容
随时随地看视频慕课网APP