黑马程序员_编程新手遇到问题怎么办?

----------- 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指定的有参的构造函数吗?

不可以的,我们在子类中的构造方法使用super()语句来调用父类中的构造方法,是因为父类中没有无参构造方法,也就是编译器要先构造父类在构造子类,同样的爷爷类是先于父类初始化的,所以编译器会从爷爷类开始逐步向下进行初始化,你现在要在孙子类中直接调用爷爷类中的构造方法,编译器先构造出父类,但是父类中不存在爷爷类中的构造函数,所以不可以。

对于这个问题的解答,如果理解了为什么父类的构造函数先于子类执行,可以采用已有的知识推导出相应的结论是不难的。可见考虑问题时,如果你真正的理解了问题的关键,那么与之相关的问题就都容易想明白了。


问题三:

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学习型技术博客、期待与您交流! ------------

你可能感兴趣的:(j2se基础,编程小问题)