----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
在黑马论坛中遇到一些比较有趣的题目,涉及到各种知识点。现在进行一下简要的归纳,加深自己对相关知识点的认识。更重要的是通过解决这些问题,总结出类似问题的解决经验。
问题1:
第一个问题:private Temp temp ;这个要怎么理解呢?
第二个问题:具体解释下实现过程。
观察如下程序的输出结果—— 本程序没有任何实际意义,只是为了加强this的理解。
class Demo
{
private Temp temp ;
public Demo()
{
this.temp = new Temp(this) ;
this.temp.fun() ;
}
public void print()
{
System.out.println("Hello World!!!") ;
}
}
class Temp
{
private Demo demo ;
public Temp(Demo demo)
{
this.demo = demo ;
}
public void fun()
{
this.demo.print() ;
}
}
public class ThisDemo
{
public static void main(String args[])
{
Demo d = new Demo() ;
}
}
解答:
1.在demo中定义temp对象,方便与调用temp中的方法,并且在demo的构造方法中实例temp对象,就是为了保证在demo中会有temp对象,以免忘记初始化temp对象,这是一个小技巧,在开发中会用到。
2.两个类中互相持有对方对象的引用,Demo d = new Demo();创建demo对象,temp先入栈,demo的引用后入栈,然后demo构造方法开始执行,在demo的构造方法中先执行temp的构造方法开始执行,然后在回到demo中的构造方法
package quiz;
public class ThisDemo {
public static void main(String[] args) {
Demo d = new Demo();
System.out.println(d);//得知和(3)中的对象是同一个
}
}
class Demo {
private Temp temp;
public Demo() {
System.out.println("demo构造方法");//(1)
this.temp = new Temp(this);
System.out.println(this.temp);//(4)demo中的temp
this.temp.fun();
}
public void print() {
System.out.println("Hello World!!!");//(5)Demo中的temp先调用fun()方法,但是fun()中有调用Demo的print方法。
}
}
class Temp {
private Demo demo;
public Temp(Demo demo) {
System.out.println("temp构造方法");//(2)
this.demo = demo;
System.out.println(this.demo);//(3)temp中的demo
}
public void fun() {
this.demo.print();
}
}
打印结果为:demo构造方法
temp构造方法
quiz.Demo@527c6768
quiz.Temp@65690726
Hello World!!!
quiz.Demo@527c6768
结论:当对程序的执行顺序有疑惑时,在程序的关键位置打印一下就可以轻易的了解代码的执行顺序。
问题二:
son类 继承father类 ,father类继承grandfather类son能调用grandfather指定的有参的构造函数吗?
对于这个问题的解答,如果理解了为什么父类的构造函数先于子类执行,可以采用已有的知识推导出相应的结论是不难的。可见考虑问题时,如果你真正的理解了问题的关键,那么与之相关的问题就都容易想明白了。
问题三:
awt构建图形化界面的时候,有讲到构件Compent,它分Container容器和其他的,说容器是一特殊组件,可添加其他组件,那继承它的面板,窗口,对话框等也都算容器?也都可以随意添加其他组件,包括同级容器?
面板,窗口,对话框等都算容器。JDK中对Cotainer()构造方法的描述,public Container()构造一个新的 Container。可以直接扩展 Container,但在这种情况下是轻量级的,并且它必须被位于本机组件树中更高处的某一个父容器包含。(比如说 Frame)。
另外对于Container()的几个重载的add的()方法都有提示这是一个适用于addImpl(java.awt.Component, java.lang.Object, int) 的便捷方法,addImpl()方法抛出的异常描述为
IllegalArgumentException - 如果 index 无效;如果 comp 是此容器的子容器,则有效范围是 [-1, getComponentCount()-1];如果组件不是此容器的子容器,则有效范围是 [-1, getComponentCount()]
IllegalArgumentException - 如果 comp 是此容器的祖先容器
IllegalArgumentException - 如果向容器添加一个窗口
NullPointerException - 如果 comp 为 null
也就是说至少向组件中添加窗口是不行,不过可以添加其它满足要求的组件。
虽然回答的不是很好,很有针对性,但是通过查找相应的api,将问题转换成权威的资料也不失为解答相关问题的方式之一。
小结:我们在学习编程中遇到的一些问题是在所难免的,可能我们也不知道如何解决这些疑惑,但是许多问题都有相同性,总结一些小规律,相信对你的解惑之路会有较大的帮助的。
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------