黑马程序员技术交流社区

标题: 想问下各位大神,这个程序为什么结果是null? [打印本页]

作者: 陈泉泉    时间: 2012-4-19 21:44
标题: 想问下各位大神,这个程序为什么结果是null?
class A
{
                public A()
                {
                        initAttrs();
                }

                public void initAttrs()
                {
                        System.out.println("initAttrs in A");
                }
}
class B extends A
{
                public String s = null;

                public B()
                {
                        super();
                }

                public void initAttrs()
                {
                        s = "aaa";
                }
}

public class C
{

                public static void main(String[] args)
                {
                        B b = new B();
                        System.out.println(b.s);
                }
}
作者: 常万    时间: 2012-4-19 21:49
你没调用initAttrs() 方法,s肯定没有改变啊。
应该这样写
class A
{
                public A()
                {
                        initAttrs();
                }

                public void initAttrs()
                {
                        System.out.println("initAttrs in A");
                }
}
class B extends A
{
                public String s = null;

                public B()
                {
                        super();
                }

                public void initAttrs()
                {
                        s = "aaa";
                }
}

public class C
{

                public static void main(String[] args)
                {
                        B b = new B();
                        b.initAttrs();                        
                       System.out.println(b.s);//
                }
}



作者: 岳民喜    时间: 2012-4-19 22:05
子类有方法复写了父类的方法的话,父类没办法调用子类的方法的,

所以public A()
                {
                        initAttrs();//这句在子类有覆盖方法的时候不会调用父类的那个 initAttrs()方法,也调用不了子类的 initAttrs()方法,所以这句执行了也没效果。
                }
所以你的子类方法得子类调用, 就入楼上所说,加  b.initAttrs();  s的值才会改变。
作者: 光sail    时间: 2012-4-19 22:11
没有调用b对象的nitAttrs 方法,所以s值等于原来定义的值为null;若想s = "aaa";c类应该这样写
public class C
{

                public static void main(String[] args)
                {
                        B b = new B();
                        b.initAttrs();                        
                       System.out.println(b.s);//
                }
}




作者: 黑马-刘昌文    时间: 2012-4-19 23:01
你在new B的时候实际上调用的是父类的构造方法,B类中的initAttrs()
没有得到调用!
作者: 张超超    时间: 2012-4-20 10:24
你声明了一个B类的对象,但是你没有引用B类中的任何的方法,除非B类中的方法定义成static类型的,这样系统在加载类的时候就会将相应的Static方法加载到内存中,所以你应该显示的调用B类中的initAttrs() 方法,将initAttrs() 方法加载到内存中

作者: 韩新凯    时间: 2012-4-20 10:37
1.B类继承A,继承了A类里面的方法initAttrs()。然后B重写了A类的initAttrs()方法。
2.你生成B类的对象b,运行的时候调用B类的空参数构造方法。并没有调用过B类的initAttrs()方法,s的值就没有发生变化。
3.在主函数输出b.s的时候,b.s调用的s是B类中定义的s=null。所以输出的值是null。
4.在主函数中添加b.initAttrs();就可以了。
作者: 孙魁星    时间: 2012-4-20 16:42
B类中的initAttrs() 就没有得到调用!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2