java 中 Graphics2D g2=(Graphics2D)g这句我怎么理解不了
发布网友
发布时间:2022-04-23 00:11
我来回答
共3个回答
热心网友
时间:2023-06-23 23:36
public void paintComponent(Graphics g)没有实例化!只是一个局部引用变量g,他的类型是 Graphics (父类的)
Graphics2D g2=(Graphics2d)g;应该是Graphics2D g2=(Graphics2D)g;
不要小看大小写!
这句话是这样执行的!
Graphics2D g2;创建Graphics2D 的引用!
能不能转换
1、检查 转换之间是否具有继承关系!
由于Graphics Graphics2D 具有继承关系,这一步通过!
2、Graphics2D 和(Graphics2D )是不是一样的类型!
肯定再次通过!
到这里就可以编译通过
3、检查 Graphics g 是否被实例化(这里是抽象类当然不能)
假如这里不是抽象的,如果父类被父类的构造器实例化,那么
运行出现异常!如果是被子类的构造器实例化的,那么执行也正确!
4、并不是你说的“继承中向下转型应该不能转吧”
关键是看它指向的是什么!
可以理解子类拥有的永远要大于或等于父类的,这样说明白不?
不懂再问!
建议你看《Java编程思想》也就是《Think in java》搜索下,PDF、CHM格式的很多!
补充:
理解一下引用类型!就像C 语言中的结构体一样!
VLabel a=(VLabel)new JLabel();//已经分配了空间!
可以分解成这样!
j=new JLabel();//
VLabel a=(VLabel)j;
实质上可以理解 j a 就是2个指针,(结构体指针)指针也有类型,比如int ……
你现在是去放大 指针j指向的内存单元~~我们怎么去分配新增加的内存单元?我们拿什么去添充新增加的内存单元?
Graphics2D g2=(Graphics2D)g
而这样只是在放大结构体!就像在结构体里面加一条
char c;一样的~
抱歉、我也不知道这样理解对不~~~反正这个东西搞昏了我好多次了~!
多看书、多找资料!
热心网友
时间:2023-06-23 23:37
我也不懂了
主要在于这个:public void paintComponent(Graphics g)
Graphics是一个抽象类,不可能直接产生实例,但传入的参数必须是一个实例。这里的g事实上不属于Graphics类,而是其某个子类的一个实例。这个子类就是sun.java2d.SunGraphics2D,代码中看不出来,是通过JVM传入的,具体过程我也不是很清楚。
可以在程序中加入代码:System.out.println(g.getClass().getName());便可以看到g具体是哪个类对象的实例。如果需要了解绘图过程,则只能参考SunGraphics2D的代码.
参考资料:ovix
热心网友
时间:2023-06-23 23:37
Graphics2D g2=(Graphics2D)g是正确的呀~
这里的g是方法中的参数(即Graphics g),而楼主也知道,Graphics2D是Graphics的子类,所以这是上到下的类型转换,所以要强行转换~~