java的强制类型转换问题
部分代码如下:publicvoidactionPerformed(ActionEvente){System.out.println((e.getSource())inst...
部分代码如下:
public void actionPerformed(ActionEvent e)
{
System.out.println((e.getSource()) instanceof JButton);
//Object btn=e.getSource();//ok
JButton btn=(JButton)e.getSource();//ok
if(btn==button1)
JOptionPane.showMessageDialog(null,"响应按钮1的单击事件");
else
if(btn==button2)
JOptionPane.showMessageDialog(null,"响应按钮2的单击事件");
else
JOptionPane.showMessageDialog(null,"响应按钮3的单击事件");
}
在以上代码中Object btn=e.getSource();正确,JButton btn=(JButton)e.getSource();//ok也正确,为什么需要强制类型转换呢,有什么作用,写成JButton btn=e.getSource();//为什么错误啊?首先谢谢你的回答啦? 展开
public void actionPerformed(ActionEvent e)
{
System.out.println((e.getSource()) instanceof JButton);
//Object btn=e.getSource();//ok
JButton btn=(JButton)e.getSource();//ok
if(btn==button1)
JOptionPane.showMessageDialog(null,"响应按钮1的单击事件");
else
if(btn==button2)
JOptionPane.showMessageDialog(null,"响应按钮2的单击事件");
else
JOptionPane.showMessageDialog(null,"响应按钮3的单击事件");
}
在以上代码中Object btn=e.getSource();正确,JButton btn=(JButton)e.getSource();//ok也正确,为什么需要强制类型转换呢,有什么作用,写成JButton btn=e.getSource();//为什么错误啊?首先谢谢你的回答啦? 展开
展开全部
因为object是一切类的父类,你将子类转换为父类,由于内存中子类对象的空间内包含父类的一切属性和方法,那么当你调用这些属性和方法的时候一定不会出问题。所以不需要强制转换。
但如果将父类转换为子类。这是很可能的。因为如果A有子类B和C。B子类有D。那么如果创建C对象声明为A是很正常的。但是如果将这个对象转换为B。JVM会认为你声明的与内存中的可能有冲突。那么这个风险就要由程序员来承担,这个时候就需要强转了。其实强转就是一个风险从JVM转移到程序员的过程。表名程序员知道并且承担了这个风险。因为一旦你创建B声明A。强转为C。调用C特有的方法时程序是会出错的。那么这个风险转移给了程序员承担。如果创建D,声明A。强转为B虚拟机他是不知道这个其实是没有风险的,所以也要程序员的承担。总体来说就是当你需要将父类转换为子类时需要强转。
但如果将父类转换为子类。这是很可能的。因为如果A有子类B和C。B子类有D。那么如果创建C对象声明为A是很正常的。但是如果将这个对象转换为B。JVM会认为你声明的与内存中的可能有冲突。那么这个风险就要由程序员来承担,这个时候就需要强转了。其实强转就是一个风险从JVM转移到程序员的过程。表名程序员知道并且承担了这个风险。因为一旦你创建B声明A。强转为C。调用C特有的方法时程序是会出错的。那么这个风险转移给了程序员承担。如果创建D,声明A。强转为B虚拟机他是不知道这个其实是没有风险的,所以也要程序员的承担。总体来说就是当你需要将父类转换为子类时需要强转。
展开全部
1 如果e.getSource()==button1为true时,那么必定e.getSource()和button1指向同一个对象。这和对象的引用声明的是什么类型无关。
2 e.getSource()声明的返回类型为Object,所以不经过类型强制转换, 则你只能用一个声明为Object的引用去指向它的返回结果。(因为e.getSource可不只是能返回你的JButton啊)
就好比说,e.getSource()声明的是返回”中国人“ 所以你不能说它就一定是X省市的人,所以要求写成 X省市人 xxx = (X省市人)get中国人(); 如果get中国人()返回的不是X省市的人,那么就会抛出类型转换异常。
因为java要求你的这个类型转换要进行”显示转换“。
补充一点,这就是”强类型“的语言的特点,”弱类型“的语言则没有这些限制。比如javascript
2 e.getSource()声明的返回类型为Object,所以不经过类型强制转换, 则你只能用一个声明为Object的引用去指向它的返回结果。(因为e.getSource可不只是能返回你的JButton啊)
就好比说,e.getSource()声明的是返回”中国人“ 所以你不能说它就一定是X省市的人,所以要求写成 X省市人 xxx = (X省市人)get中国人(); 如果get中国人()返回的不是X省市的人,那么就会抛出类型转换异常。
因为java要求你的这个类型转换要进行”显示转换“。
补充一点,这就是”强类型“的语言的特点,”弱类型“的语言则没有这些限制。比如javascript
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
JButton btn=e.getSource();没执行时不知道e.getSource()是什么类型,只有执行了才知道。
JButton btn=e.getSource();如果e.getSource()正好是JButton类型那就行
所以要有
if(e.getSource() instanceof JButton){
JButton btn=(JButton)e.getSource();
}判断一下再转
JButton btn=e.getSource();如果e.getSource()正好是JButton类型那就行
所以要有
if(e.getSource() instanceof JButton){
JButton btn=(JButton)e.getSource();
}判断一下再转
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
Object是所有类的父类,所以不用强转,而你e.getSource();返回的是个object类型,你却用Object的子类JButton btn进行接收,所以肯定要转的。 父类引用接收子类对象不用转换,子类引用接收父类对象是要转换的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2011-12-15
展开全部
JButton btn=e.getSource();
左边是JButton 右边是Object,当然会出错
左边是JButton 右边是Object,当然会出错
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询