java语法的问题,谢谢!

来源:百度知道 编辑:UC知道 时间:2024/06/23 09:04:54
class a{
int x=0;
a(){f(1);}
public void f(int i){x=x+1;}
public void g(){System.out.println(x);}}

class b extends a{
b(){f(2);}
public void f(int i){x=x+2*i;}}

public class c{
public static void m(a c){
c.f(6);
c.g();}
public static void main(String args []){
m(new b());}}
小弟编写以上程序。有一下几个问题,望高手指教:
1.静态方法m的参数是a的引用,这时c.f(6)和c.g()中的f g是不是a类中的f g啊?(静态方法和对象的引用绑定)。
2.那么主方法中的参数改成了b的实例后,没有声明是谁的引用,m中的方法体f和g是如何确定的?是a中的还是b中的?到底是怎么回事??
3.new b()后,是先调用构造方法么?是不是过程为“先调用a的构造方法,把x变为1,然后再调用b的构造方法把x变为4”么?
请高手指教这个程序!只有5分了,不好意思!

1.是的.
2.如果没有指定引用是谁的都有可能,但是当你调用f和g时是需要你指明是谁的事例的,因为f的方法已经被重写了,需要用哪个方法就事例成哪个方法的事例就可以了.
3.new操作符就是调用构造器,在b构造器的首行默认的调用父类的构造器,把来自于父类的变量得到初始化,然后在调用自己构造器中的方法.

1 在没有对m方法传参数之前,编译器不知道该调用子类还是父类的方法,只有在运行时才能确定,和静态不静态没关系
2 注方法中的参数改成b的实例,就是声明c是b实例的引用
3 对