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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

请问,下面这个代码输出是a还是b,为什么?
  1. public class Demo2 {   
  2.                   
  3.              public static void main(String[] args){
  4.                  B b=new B();
  5.                  b.bb();
  6.              }
  7.         }
  8.         class A{
  9.         private String  a="a";
  10.              public void visit(){
  11.             System.out.println(this.a);
  12.                  System.out.println(this.getClass());
  13.              }
  14.         }
  15.         class B extends A{
  16.               private String a = "b";
  17.                       public void visit(){
  18.                               System.out.println(this.a);
  19.                            System.out.println(this.getClass());
  20.                        }  
  21.               public void bb(){
  22.                  visit();
  23.              }   
  24.         }   
复制代码

5 个回复

正序浏览
回复 使用道具 举报
tzslk 发表于 2017-2-28 10:41
我在eclipse运行输出是a

我在jdk里面复制了你的代码,运行的是b,醉了
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
Mr_Maty 发表于 2017-2-27 23:59
首先可以告诉你,输出的是b,你写的虽然不代码比较复杂,但是可以简化为如下形式
class Demo
{

我在eclipse运行输出是a
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
首先可以告诉你,输出的是b,你写的虽然不代码比较复杂,但是可以简化为如下形式
class Demo
{
        public static void main(String[] args)
        {
                String s1 = "a";
                String s1 = "b";
                System.out.println(s1);
        }
}
我以简化后的代码给你解释下
1.首先,"a"是一个String类型的对象,该对象的引用赋值给了String类类型的变量s1,如果此时打印s1,结果是a,这个确定无疑.
2.其次执行了s1 = "b"的操作,将"b"赋值给了String s1的引用,其实你可以理解为这个赋值操作的底层操作是return new String(b),没错,你没有看错,String每次的赋值操作都是返回了一个重新的String对象,而不是对原有String对象的改变
3.自己去百度下不可变对象和不可变对象引用的区别
4.匿了

回复 使用道具 举报
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马