p.method2(); 是调用parents类的method2()
parents的method2()中又调用了method1() 这个method1()是parents中的private Child中的method1()并不能改变它
parents的method2()中又调用了method1() 这个method1()是parents中的private Child中的method1()并不能改变它
调试欢乐多
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()");
}
选d的原因是:
对于函数重载(overload),究竟是执行父类的函数还是子类的函数是由程序运行期间决定的。在运行期间Parent p = new Child();语句构造了一个Child类的实例,所以,调用p.method2();时一定是到Child类中去找method2()方法,但是在Child类中又没有定义method2()方法,所以只能调用父类Parent类中的method2()方法。打印出来Parent's method2()
在Parent的method2()方法中又调用了method1()方法,这个是比较让人糊涂的,实际上
public void method2()
{
System.out.println("Parent's method2()");
method1();
} 在编译的时候会被解释成
public void method2()
{
System.out.println("Parent's method2()");
this.method1();
}
注意到多了一个this,用于指代当前实例,当前实例就是
Parent p = new Child();所构造出来的Child的实例,尽管是在Parent类中被调用,他也一定是Child的实例,所以this.method1()调用的就是Child类中的method1()方法了。所以会打印Child's method1() ,答案选d
A是B的父类
A a=new B();
有以下几个特点:
1。a不能操作B新增成员和方法
2。a可以操作子类继承或者重写的成员和方法
class Parent{
private void method1(){
System.out.println("Parent's method1()");
}
public void method2()
{
System.out.println("Parent's method2()");
method1();//调用父类方法1
}
} 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();//子类中没有该方法的重写,呵呵,就是继承了父类的方法,调用父类方法2
}
呵呵,楼主结帐^_^
private void method1(){// change private to public
System.out.println("Parent's method1()");
}
then the answer is D, not C'
why?
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
Parent p = new Child();
和Child p = new Child();应该是一摸一样的
编译时声明有什么关系,甚至可以
Object o=new Child();
但是它是private时 child不能重写里面的method1() 所以是c
而private method1时,会是c?
这是因为method1()是重写父类的,偶没错^_^
楼主给分^_^