this可以调用本类中对象的属性和方法,而super可以调用父类中对象的属性和方法,可以简化代码,对象用this或者super替代。关于类和对象的关系,有一点不得不提,在一个类中只能使用一个对象,如果创建并使用多个类会导致“空指针异常”。当你需要在A类中调用B类的属性和方法时,需要把B类的对象传给A类。接下来我们通过一个例子来展示这个过程:
这里我们关注前两个类,第一个类中写窗体的代码,第二个类中写监听器的代码。我们需要在第二个类中用到第一个类的画笔。
DrawMouse mouse = new DrawMouse();
mouse.setGr(g);
在A类中创建了B类的对象,即可调用B类中的setGr函数。
private Graphics gr;
public void setGr(Graphics g) {
gr = g;
}
B类创建一个A类的对象,来接收A类的对象,接下来即可调用A类的方法。
private Graphics g; public void setGr(Graphics g) { this.g = g; }
此处也可以创建一个同名的对象,使用我们上面提到的this在下方赋对象时来替代gr,表明是使用此类对象的g。当需要多次调用时会发现this可以大大简化代码。
至于super的使用,我们再举一个例子。如下:
public class DrawFrame extends JPanel
这里写了一个DrawFrame类,继承JPanel类。
public void paint(Graphics g) { super.paint(g); for(int i=0;i<arrayShape.length;i++) { Shape shape=arrayShape[i]; if(shape!= null) shape.drawShape(g); else break; } }
这个paint的方法是重写于JPanel的一个方法,super.paint(g);这个方法是调用原先的画板组件的绘制方法,super则指的是JPanel,它下方的代码是我们手动增加进去的,实现一些画板的恢复功能。关于画板的恢复,我们会在后面的博客中提到。
顺便一提,在添加鼠标监听器时也可以用到this的方法。即,给画板添加监听器。
//给窗体添加鼠标监听器方法 this.addMouseListener(mouse); this.addMouseMotionListener(mouse);