java 中 Graphics2D g2=(Graphics2D)g这句我怎么理解不了

Python08

java 中 Graphics2D g2=(Graphics2D)g这句我怎么理解不了,第1张

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一样的~

抱歉、我也不知道这样理解对不~~~反正这个东西搞昏了我好多次了~!

多看书、多找资料!

这是jDK1.5之后出现的增强循环用法。

首先,你肯定有个balls对象的集合类(有可能是 balls[]数组 也有可能是List ArrayList的对象 名字叫balls。这要根据你的具体代码)

其次,你这个balls对象里面放了很多个Ball类的对象 (Ball类是你自己定义的类)

for (Ball b : balls) 表示定义一个名字叫b得Ball类对象,循环遍历一遍balls,每次代表balls里面的Ball类的一个对象,每次都执行 g2.fill(b.getShape())方法。

也就是说,用b代表balls里面的所有Ball类对象,用Ball类里面每个对象都执行一次 .getShape()方法。也就是循环遍历了一次

更多关于增强循环的用法,可以去百度搜索一下,有很多例子

======================

JDK最新版本是1.7 。 一般JDK1.5之后(包括1.5)和1.5之前的版本差别很大,jdk1.5里面除了增加了增强循环,还增加了泛型等概念...