A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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);
                }
}

8 个回复

倒序浏览
你没调用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);//
                }
}


评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
子类有方法复写了父类的方法的话,父类没办法调用子类的方法的,

所以public A()
                {
                        initAttrs();//这句在子类有覆盖方法的时候不会调用父类的那个 initAttrs()方法,也调用不了子类的 initAttrs()方法,所以这句执行了也没效果。
                }
所以你的子类方法得子类调用, 就入楼上所说,加  b.initAttrs();  s的值才会改变。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
没有调用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);//
                }
}



评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
你在new B的时候实际上调用的是父类的构造方法,B类中的initAttrs()
没有得到调用!

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
你声明了一个B类的对象,但是你没有引用B类中的任何的方法,除非B类中的方法定义成static类型的,这样系统在加载类的时候就会将相应的Static方法加载到内存中,所以你应该显示的调用B类中的initAttrs() 方法,将initAttrs() 方法加载到内存中
回复 使用道具 举报
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();就可以了。
回复 使用道具 举报
B类中的initAttrs() 就没有得到调用!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马