日期:2014-05-20  浏览次数:20752 次

新手在线请教小问题,关于继承和抽象类
1、关于继承的问题:子类继承了父类得所有方法和变量,那么子类就可以随便使用这些类得,但是有几个疑惑。
在GregorianCalendar类中,他继承了Calendar中的变量和方法:
但是在写程序的时候: 
GregorianCalendar d = new GregorianCalendar();
int today = d.get(Calendar.DAY_OF_MONTH);//而不是 int today = d.get(DAY_OF_MONTH)
因为我个人觉得 GregorianCalendar 已经继承了Calendar 中的所有变量了,而且DAY_OF_MONTH是public static final int 这个类型,子类可以使用,如果你给我的解释是因为该类是Calendar 中的变量,GregorianCalendar 虽然继承了该类的变量,但是在内存中GregorianCalendar 的对象实际上是拥有了Calendar 得一个对象,那么调用的时候就要采用这种方法,但是在调用get()函数的时候为什么没有采用Calendar 的对象调用get()而是采用GregorianCalendar 对象调用该函数?

2、关于抽象的问题,马士兵的视频上面说过,abstract类是抽象的类,不能创建对象,但是在如下程序中Graphics 是个抽象类,为什么他还能做为参数使用 public void paint(Graphics g)

import java.awt.*;

class SubPanel extends Panel{
public void paint(Graphics g){
g.drawString("this is a drawing test!",20,20);
g.drawLine(30,60,100,120);
g.draw3DRect(60,50,70,30,false);
}
}

public class AWTDrawing2 {
  private Frame f = new Frame(" Hello Out There!");
  private SubPanel p = new SubPanel();
public void launchFrame() {
f.add(p);
f.setSize(170,170);
f.setBackground( new Color(89,145,145));
f.setVisible( true); 
}
public static void main( String args[]) {
AWTDrawing2 guiWindow = new AWTDrawing2();
guiWindow.launchFrame();
  }
}

------解决方案--------------------
1
DAY_OF_MONTH是static的,没有继承一说,该属性属于类级别的,通过类名来访问

2
Grapihc是抽象的,但是awt/swing框架内部会返回Graphic的实际对象实例
你可以做个简单的测试
public void paint(Graphics g){
System.out.println(g.getClass()); //来查看一下Graphic具体是什么对象的实例
g.drawString("this is a drawing test!",20,20); 
g.drawLine(30,60,100,120);
g.draw3DRect(60,50,70,30,false);


------解决方案--------------------
java.lang.Object
java.awt.Component
java.awt.Container
java.awt.Panel
Container 这个里面有paint方法的
该方法将 paint 转发给任意一个此容器子组件的轻量级组件