What is displayed when the following is executed? class Parent{
private void method1(){
System.out.println("Parent's method1()");
}
public void method2()
{
System.out.println("Parent's method2()");
method1();
}
} class Child extends Parent{
public void method1(){
System.out.println("Child's method1()");
} public static void main(String args[]){ Parent p = new Child();
p.method2();
}} Choices:a. Compile time error b. Run time errorc. prints : Parent's method2() Parent's method1()d. prints : Parent's method2() Child's method1() 答案是C但是我们把题改一下,
class Parent{
private void method1(){
System.out.println("Parent's method1()");
}
public void method2()
{
System.out.println("Parent's method2()");
method1();
}
} class Child extends Parent{
public void method1(){
System.out.println("Child's method1()");
} public static void main(String args[]){ Child p = new Child();//改变了这里 p.method2();
}} 应该选什么? 也是C!我们再改一下:
class Parent{
public void method1(){ //change here
System.out.println("Parent's method1()");
}
public void method2()
{
System.out.println("Parent's method2()");
method1();
}
} class Child extends Parent{
public void method1(){
System.out.println("Child's method1()");
} public static void main(String args[]){ Parent p = new Child();
p.method2();
}} 这次终于是答案D了,我们再改
:
class Parent{
public void method1(){ //change here
System.out.println("Parent's method1()");
}
public void method2()
{
System.out.println("Parent's method2()");
method1();
}
} class Child extends Parent{
public void method1(){
System.out.println("Child's method1()");
} public static void main(String args[]){ Child p = new Child();//change here
p.method2();
}} 也是答案D,我这里是运行过的结果,可是不理解为什么,那个高手跳出来解释一下?参考贴:
http://community.csdn.net/Expert/topic/3490/3490386.xml?temp=.3488581
private void method1(){
System.out.println("Parent's method1()");
}
public void method2()
{
System.out.println("Parent's method2()");
method1();
}
} class Child extends Parent{
public void method1(){
System.out.println("Child's method1()");
} public static void main(String args[]){ Parent p = new Child();
p.method2();
}} Choices:a. Compile time error b. Run time errorc. prints : Parent's method2() Parent's method1()d. prints : Parent's method2() Child's method1() 答案是C但是我们把题改一下,
class Parent{
private void method1(){
System.out.println("Parent's method1()");
}
public void method2()
{
System.out.println("Parent's method2()");
method1();
}
} class Child extends Parent{
public void method1(){
System.out.println("Child's method1()");
} public static void main(String args[]){ Child p = new Child();//改变了这里 p.method2();
}} 应该选什么? 也是C!我们再改一下:
class Parent{
public void method1(){ //change here
System.out.println("Parent's method1()");
}
public void method2()
{
System.out.println("Parent's method2()");
method1();
}
} class Child extends Parent{
public void method1(){
System.out.println("Child's method1()");
} public static void main(String args[]){ Parent p = new Child();
p.method2();
}} 这次终于是答案D了,我们再改
:
class Parent{
public void method1(){ //change here
System.out.println("Parent's method1()");
}
public void method2()
{
System.out.println("Parent's method2()");
method1();
}
} class Child extends Parent{
public void method1(){
System.out.println("Child's method1()");
} public static void main(String args[]){ Child p = new Child();//change here
p.method2();
}} 也是答案D,我这里是运行过的结果,可是不理解为什么,那个高手跳出来解释一下?参考贴:
http://community.csdn.net/Expert/topic/3490/3490386.xml?temp=.3488581
解决方案 »
- java使用布局管理器后容器内组件的大小还可以改变吗?
- 如何用PC机给另一台PC上的Android模拟器发送文件?
- toString请教
- 面试题:如何对ArraySet进行排序,TreeSet有什么特点
- 考scjp用多少时间
- Log4j用JdbcAppender碰到的问题
- 简单的循环。。if
- main函数中的参数args[]???
- 如何用jdbc连接Access数据库(用可读写的模式)
- 一道传智播客的线程部分的作业题,自己做不好,求指导
- 我新学Java,老师出了两道程序填空题目,望好心人帮忙给个答案,谢谢
- 3des加密:Given final block not properly padded
怎么结果有两行?
c. prints : Parent's method2() Parent's method1()
没有调用method1()的语句嘛
不过可以参考Thinking In Java的相关章节,那里写得相当清楚
好久不见了。
请将“编译期method2中对method1的引用就被inline成那个private的方法” 再解释一下?我是这么理解的:对于
class Parent{
private void method1(){
System.out.println("Parent's method1()");
}
public void method2()
{
System.out.println("Parent's method2()");
method1();
}
}
在被继承时,可被继承的方法public void method2()其实已经是:
public void method2()
{
System.out.println("Parent's method2()");
System.out.println("Parent's method1()");
}一会反编译看看。
public void method2()
{
System.out.println("Parent's method2()");
System.out.println("Parent's method1()");
}这样因为Child继承自Parent,所以对于这个public的method1,由于没有显式的继承(重写),自然也就隐含的继承下来一份拷贝啦。
1.由于父类里的方法是private的,故在子类中写的方法,则不能对父类的进行覆盖.又由于在父类中,只能掉用自己的方法,或是在子类中被重写的方法。但是由于父类中的方法是私有的,所以子类中定义的method1()是自己扩展出来的方法,所以对父类来说是不可见的,故父类掉用的就是自己的method1方法。2.同理3.由于父类中的方法是公有的,所以在父类中掉用方法它会首先去考虑掉用被子类重写的父类方法。4.同理。以下是我个人总结的编译器执行顺序:
1.进入主类.
2.先把所有的类的成员变量置上初值(引用类型的为null 基本类型的为0 bool类型的为false)
3.从public class 里面找是否有静态成员变量的初始化,如果有静态成员变量的初始化则先执行静态成员变量的初始化。
4.如果静态成员变量,初始化的是对象的,话那么则掉用实例化该对象的类。进入类体里首先看该类里有没有静态成员变量初始化,如果有则先掉用,然后是普通成员变量初始化。
5.最后才是构造方法。
注意静态的成员变量只能初始化一次!
详细信息可参见Tingking in java