-
求!哪位大大帮忙看看为什么是空指针异常?5
两个接口InterfaceA, InterfaceB:
public interface InterfaceA {
void methodA();
}
public interface InterfaceB {
void methodB();
}
两个类A,B分别实现此两个接口:
public class A implements InterfaceA {
public void methodA() {
System.out.println("A implements InterfaceA");}
}
public class B implements InterfaceB {
public void methodB() {System.out.println("B implements InterfaceB");}
}
父类Super中,两个接口作为实例变量
public class Super {
public InterfaceA a;
public InterfaceB b;
public void useMethodA() {
try{
a.methodA();
} catch (Exception ex){
System.out.println(ex.getMessage());
}
}
public void useMethodB(){
try{
b.methodB();
} catch (Exception ex){
System.out.println(ex.getMessage());
}
}
}
子类Son继承父类,(问题来乐!这时候public InterfaceA a = new A();可以成立的?new一个A的对象 然后直接可以赋给类型为InterfaceA的对象?)
public class Son extends Super {
public InterfaceA a = new A();
public InterfaceB b = new B();
}
写一个TestDrive, 编译成功,并正常调用了实现了接口的方法!
public class TestDrive {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Son s = new Son();
s.useMethodA();
s.useMethodB();
}
}
控制台输出:
null
null
问题补充:meng22623 写道public class Son extends Super {
public InterfaceA a = new A();
public InterfaceB b = new B();
}
这里你声明的a和b与父类的a和b根本没有关系。子类的a和b是自己特有的,你根本没有引父类的a和b。
就像feige1008这位兄台说的,
public class Son extends Super {
a = new A();
b = new B();
}
改成这样就可以了。
明白了!这里重新声明了一次~ 这样子类的useMethod方法就无法找到相关的实例变量,而成为空指针。
问题补充:AngelAndAngel 写道呵呵,我明白lz的意思了,我copy了一下你的代码,看了一下,我一开始也迷惑了。因为我开始觉得不应该是null,而是打印出那几个语句。我最初是这么想的:
Son既然是继承Super,并且也有两个
InterfaceA a
InterfaceB b
那么应该来说是继承并重写了父类的属性,也就是说a,b都应该是初始化了的,所以在调用的时候应该不会为null。
其实不是这样的,Son继承了Super,所以继承了Super的属性和方法,而这个时候呢,方法并没有重写,还是沿用了父类Super的,那么父类方法里面所有的元素都保持父类自己的特色,根本不会下放到子类,而父类的a,b都没有实例化,所以出现了null。
原因找到了,子类我重新声明了一次变量,因此方法useMethodA和useMethodB用到的a和b并没有初始化,因此用useMethod的时候,无法读取a和b的变量。
如果我不声明a,b
直接用 a = new A(); b = new B();
就可以了,而不用重写那两个方法,因为方法已经从父类继承下来了,只要有相关的变量就可以了。
问题补充:AngelAndAngel 写道lz,其实你明白的 只是一个浅显的表象。按道理说,子类的属性跟父类的肯定有关系的(怎么会没关系呢),只是说在这里你子类方法没有重写,所以看不出有关系,而这个误区才刚刚解释了你的现象而已。
你仔细看一下我的回答。
我明白你的意思,但我的目的是想方法在父类就已经写好了,子类不用再重写。
因此我是希望将父类声明的a,b在子类实例化,然后在父类进行运算。但问题就出在,我子类的两个实例变量重新声明了,因此useMethod里用到的变量a,b并没有进行初始化。^^
2011年8月30日 01:34
6个答案 按时间排序 按投票排序
-
采纳的答案
public class Son extends Super {
public InterfaceA a = new A();
public InterfaceB b = new B();
}
这里你声明的a和b与父类的a和b根本没有关系。子类的a和b是自己特有的,你根本没有引父类的a和b。
就像feige1008这位兄台说的,
public class Son extends Super {
a = new A();
b = new B();
}
改成这样就可以了。2011年8月30日 10:25
-
lz,其实你明白的 只是一个浅显的表象。按道理说,子类的属性跟父类的肯定有关系的(怎么会没关系呢),只是说在这里你子类方法没有重写,所以看不出有关系,而这个误区才刚刚解释了你的现象而已。
你仔细看一下我的回答。2011年8月30日 12:50
-
public class Son extends Super {
public InterfaceA a = new A();
public InterfaceB b = new B();
}
此类变成
public class Son extends Super {
a = new A();
b = new B();
}
就好了。2011年8月30日 09:34
-
呵呵,我明白lz的意思了,我copy了一下你的代码,看了一下,我一开始也迷惑了。因为我开始觉得不应该是null,而是打印出那几个语句。我最初是这么想的:
Son既然是继承Super,并且也有两个
InterfaceA a
InterfaceB b
那么应该来说是继承并重写了父类的属性,也就是说a,b都应该是初始化了的,所以在调用的时候应该不会为null。
其实不是这样的,Son继承了Super,所以继承了Super的属性和方法,而这个时候呢,方法并没有重写,还是沿用了父类Super的,那么父类方法里面所有的元素都保持父类自己的特色,根本不会下放到子类,而父类的a,b都没有实例化,所以出现了null。2011年8月30日 09:20
-
引用问题来乐!这时候public InterfaceA a = new A();可以成立的?new一个A的对象 然后直接可以赋给类型为InterfaceA的对象?
只要A实现了实现了InterfaceA 接口就可以这么赋值,自动上转型,就好比
Object str = new String();或List list = new ArrayList()一个样
引用控制台输出:
null
null
不会输出null的吧
public class Son extends Super {
public InterfaceA a = new A();
public InterfaceB b = new B();
}
Super类声明了两个字段a和b,并初始化为默认值null,子类Son又声明了两个字段a和b
Super类中useMethodA和useMethodB使用的还是Super类声明的a和b,因为没有初始化,会NullPointerException
如果要在子类初始化父类声明的对象,这样就可以了:
public class Son extends Super {
a = new A();
b = new B();
}2011年8月30日 07:44
相关推荐
曾经看过有的.h文件将NULL定义为0L,为什么? 答案与分析: 这是一个关于空指针宏定义的问题。指针在C语言中是经常使用的,有时需要将一个指针置为空指针,例如在指针变量初始化的时候。 C语言中的空指针和Pascal...
下面小编就为大家带来一篇浅谈java异常处理之空指针异常。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
NULL 博文链接:https://myeden.iteye.com/blog/760798
CS里用图片做园角导航,发现a hover:的图片位置不对!请各位能帮忙看看!
今天小编就为大家分享一篇关于实例化JFileChooser对象报空指针异常问题的解决办法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
自动拆装箱与NPE有代码:编译,反编译:现在的IDE还是比较智能的:所以还是多看看IDE给出的提示吧,当然了,最重要的还是自己先了解什么样的代码可能产生怎样的错
为什么这些问题如此频繁地出现? 5.15 有没有什么简单点儿的办法理解所有这些与空指针有关的东西呢? 5.16 考虑到有关空指针的所有这些困惑,要求它们的内部表示都必须为0不是更简单吗? 5.17 说真的,真有...
为什么这些问题如此频繁地出现? 60 5.15 有没有什么简单点儿的办法理解所有这些与空指针有关的东西呢? 60 5.16 考虑到有关空指针的所有这些困惑,要求它们的内部表示都必须为0不是更简单吗? 60 5.17 说真的...
自己写的哦!!!!呵呵还有待改进 大家可以看看 就剩下一个单曲循环了,谁会,可以共享一下呀!吼吼~~~
里面是有关的3个文件,大家看看
为什么这些问题如此频繁地出现? 5.15 有没有什么简单点儿的办法理解所有这些与空指针有关的东西呢? 5.16 考虑到有关空指针的所有这些困惑,要求它们的内部表示都必须为0不是更简单吗? 5.17 说真的,真有机器用非...
面试对每个找工作的人都是异常重要,到底该注意那些问题呢?看看hr的劝告就知道了。
鼠标指针,漂亮的鼠标指针.大家试试.可用于微软xp\win7.
常量指针和指针常量的区分,如果有人需要,可以下载看看,如果有误,请帮忙改正!谢谢!
之前给弹出的AlertDialog中的控件设置监听时,老是报空指针异常,之所以报空指针异常,是因为我findViewById写的有问题,因为我们需要给弹出框中的控件设置监听,直接用findViewById是找不到弹出框中的控件的,需要...
看看上面三个表达式分别是什么意思? C):这很容易,fun3 是函数名,p1,p2 是参数,其类型为char *型,函数的返回值为char *类型。 B):也很简单,与C)表达式相比,唯一不同的就是函数的返回值类型为char**,是个...
关于指针的使用,比较晕指针的可以看看,让你从此不再害怕指针
为什么这些问题如此经常地出现? o 6.12 我很困惑。我就是不能理解这些空指针一类的东西。 o 6.13 考虑到有关空指针的所有这些困惑, 难道把要求它们内部表达都必须为 0 不是更简单吗? o 6.14 说真的, 真有机器用...