锁定老帖子 主题:java继承容易犯的错误
精华帖 (0) :: 良好帖 (1) :: 新手帖 (4) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2008-04-08
public abstract class A { int i=1; public void printI() { System.out.println("i="+i); } } public class B extneds A{ int i=2; public static void main(String[] args) { B b=new B(); b.printI(); } } 那么,控制台打出来的i的值是多少? 呵呵,如果一下功夫就能说出正确结果1,那么,下面部分就不需要往下看了。 1、类的继承知识点 (1)java不支持多重继承,也就是说子类至多只能有一个父类 (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法 (3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承 (4)子类中定义的成员方法,并且这个成员方法的名字,返回类型,及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承。 2、答案是2者如是说 子类B中的变量i和父类A中的变量i重名, 那么子类B中的变量i将会覆盖掉父类中的同名变量i. 则访问父类中的变量时jvm会把子类cast到父类.所以,打印出的结果应该是“i=2”; 3、歧义的产生 歧义的产生最关键的地方是子类B中的变量i将会覆盖掉父类中的同名变量i的覆盖两个字。这里,我觉得这两个字容易误导。应该改为屏蔽或隐藏。因为在这里父类的成员变量是没有被改变。 4、jvm的执行过程 (1)子类B 的构造方法被调用,实例化一个B对象,B对象的成员被初始化 (2)jvm隐含的调用父类的构造方法,实例化一个A对象,A对象的成员被初始化。 (3)由于A对象的printI()未被屏蔽,所以调用的A对象的printI()函数。 那么,在这里A的成员函数当然是访问自己的成员变量了。 5、super关键字 super关键字在java中的作用是使被屏蔽的成员变量或者成员方法或变为可见,或者说用来引用被屏蔽的成员变量和成员成员方法。super是用在子类中,目的是访问直接父类中被屏蔽的成员。上面的代码也可以这样写: public abstract class A { int i=1; public void printI() { System.out.println("i="+i); } } public class B extends A{ public int i=2; public void printI(){ super.printI(); } public static void main(String[] args){ B b= new B(); b.printI(); } } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-04-08
mfcai 写道 在网上看见一个关于java继承的问题,觉得这是很多初学java应该注意的问题。
public abstract class A { int i=1; public void printI() { System.out.println("i="+i); } } public class B extneds A{ int i=2; public static void main(String[] args) { B b=new B(); b.printI(); } } 那么,控制台打出来的i的值是多少? 呵呵,如果一下功夫就能说出正确结果2,那么,下面部分就不需要往下看了。 1、类的继承知识点 (1)java不支持多重继承,也就是说子类至多只能有一个父类 (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法 (3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承 (4)子类中定义的成员方法,并且这个成员方法的名字,返回类型,及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承。 2、答案是1者如是说 子类B中的变量i和父类A中的变量i重名, 那么子类B中的变量i将会覆盖掉父类中的同名变量i. 则访问父类中的变量时jvm会把子类cast到父类.所以,打印出的结果应该是“i=1”; 3、歧义的产生 歧义的产生最关键的地方是子类B中的变量i将会覆盖掉父类中的同名变量i的覆盖两个字。这里,我觉得这两个字容易误导。应该改为屏蔽或 隐藏。因为在这里父类的成员变量是没有被改变。 4、jvm的执行过程 (1)子类B 的构造方法被调用,实例化一个B对象,B对象的成员被初始化 (2)jvm隐含的调用父类的构造方法,实例化一个A对象,A对象的成员被初始化。 (3)由于A对象的printI()未被屏蔽,所以调用的A对象的printI()函数。 那么,在这里A的成员函数当然是访问自己的成员变量了。 5、super关键字 super关键字在java中的作用是使被屏蔽的成员变量或者成员方法或变为可见,或者说用来引用被屏蔽的成员变量和成员成员方法。super是用在子类中,目的是访问直接父类中被屏蔽的成员。上面的代码也可以这样写: public abstract class A { int i=1; public void printI() { System.out.println("i="+i); } } public class B extends A{ public int i=2; public void printI(){ super.printI(); } public static void main(String[] args){ B b= new B(); b.printI(); } } 改一下应该会更清楚 public abstract class A { private int i=1; public void printI() { System.out.println("i="+i); } } |
|
返回顶楼 | |
发表时间:2008-04-09
lsk 写道 mfcai 写道 在网上看见一个关于java继承的问题,觉得这是很多初学java应该注意的问题。
public abstract class A { int i=1; public void printI() { System.out.println("i="+i); } } public class B extneds A{ int i=2; public static void main(String[] args) { B b=new B(); b.printI(); } } 那么,控制台打出来的i的值是多少? 呵呵,如果一下功夫就能说出正确结果2,那么,下面部分就不需要往下看了。 1、类的继承知识点 (1)java不支持多重继承,也就是说子类至多只能有一个父类 (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法 (3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承 (4)子类中定义的成员方法,并且这个成员方法的名字,返回类型,及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承。 2、答案是1者如是说 子类B中的变量i和父类A中的变量i重名, 那么子类B中的变量i将会覆盖掉父类中的同名变量i. 则访问父类中的变量时jvm会把子类cast到父类.所以,打印出的结果应该是“i=1”; 3、歧义的产生 歧义的产生最关键的地方是子类B中的变量i将会覆盖掉父类中的同名变量i的覆盖两个字。这里,我觉得这两个字容易误导。应该改为屏蔽或 隐藏。因为在这里父类的成员变量是没有被改变。 4、jvm的执行过程 (1)子类B 的构造方法被调用,实例化一个B对象,B对象的成员被初始化 (2)jvm隐含的调用父类的构造方法,实例化一个A对象,A对象的成员被初始化。 (3)由于A对象的printI()未被屏蔽,所以调用的A对象的printI()函数。 那么,在这里A的成员函数当然是访问自己的成员变量了。 5、super关键字 super关键字在java中的作用是使被屏蔽的成员变量或者成员方法或变为可见,或者说用来引用被屏蔽的成员变量和成员成员方法。super是用在子类中,目的是访问直接父类中被屏蔽的成员。上面的代码也可以这样写: public abstract class A { int i=1; public void printI() { System.out.println("i="+i); } } public class B extends A{ public int i=2; public void printI(){ super.printI(); } public static void main(String[] args){ B b= new B(); b.printI(); } } 改一下应该会更清楚 public abstract class A { private int i=1; public void printI() { System.out.println("i="+i); } } 请注意,如果在父类A中将成员变量定义为private,则不符合我所说的第二条: 子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法。 子类无法继承父类的成员变量,自然不会产生歧义了。那么这个问题也就没有讨论的必要了 |
|
返回顶楼 | |
发表时间:2008-04-09
after my test and find the result is i = 1;
do not like what you describe i = 2; |
|
返回顶楼 | |
发表时间:2008-04-09
试了一下,确实是输出i=1 hoho~~~~
|
|
返回顶楼 | |
发表时间:2008-04-09
兄弟,对不住了.答案确实是1 .我写错了.呵呵
|
|
返回顶楼 | |
发表时间:2008-04-09
典型面试陷阱题,
这种题是先父后子,无构加空, 因为子类无此函数, 所以用的时候,穿过父类的黑发,的子类的手!!! 这种题变化开来,是一些,父类构造函数中,也打一些信息, 子类也打一些, 这样,再是麻烦!! 这不是JAVA编程易出的错, 而是JAVA 面试套套而已。 |
|
返回顶楼 | |
发表时间:2008-04-09
dearmite 写道 典型面试陷阱题,
这种题是先父后子,无构加空, 因为子类无此函数, 所以用的时候,穿过父类的黑发,的子类的手!!! 这种题变化开来,是一些,父类构造函数中,也打一些信息, 子类也打一些, 这样,再是麻烦!! 这不是JAVA编程易出的错, 而是JAVA 面试套套而已。 果然是写程序出身的 |
|
返回顶楼 | |
发表时间:2008-04-09
mfcai 写道 (4)子类中定义的成员方法,并且这个成员方法的名字,返回类型,及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承 改成这样试试看 public abstract class A { int i = 1; public void printI() { System.out.println("i=" + i); } } class B extends A { @Override public void printI() { System.out.println("i="+(++i)); } public static void main(String[] args) { B b = new B(); A a = new B(); a.printI(); b.printI(); } } |
|
返回顶楼 | |
发表时间:2008-04-09
Members of a class that are declared private are not inherited by subclasses
of that class. Only members of a class that are declared protected or public are inherited by subclasses declared in a package other than the one in which the class is declared. |
|
返回顶楼 | |