从另一个类访问私有变量?

时间:2013-11-24 03:48:48

标签: java

我不知道我的代码有什么问题。我想在我的info()方法中显示b(10)的值,但是当我运行此代码时,b的值为0.为什么会发生这种情况?

class Alpha {
    public int a = 5;
    public void info() {
        System.out.println("a = " + a);
        Beta3 betaku;
        betaku = new Beta3();
        System.out.println("b = " + betaku.perolehB());
        System.out.println("Dipanggil pada " + this.getClass().getName());
        System.out.println("----------");
    }
}

这是主要课程:

class Beta3 extends Alpha { 
private int b;
public  void isiB(int b){
    this.b=b;
    }
public int perolehB(){
    return b;
    }

public static void main(String[] args) { 
Beta3 varobjBeta;
varobjBeta = new Beta3();
varobjBeta.isiB(10); 
varobjBeta.info(); 

Alpha varobjAlpha; 
varobjAlpha = new Alpha(); 
varobjAlpha.info(); 
} 
} 

6 个答案:

答案 0 :(得分:0)

制作main()方法的第4行beta_ku.info();。您对.info的其他来电无法正常工作,因为您尚未拨打isiB并且他们默认为0。

答案 1 :(得分:0)

每次编写新Beta3时,都会创建一个Beta3类型的新对象,并带有一对新属性。如果你想要在前一个对象中设置的属性值,只需将该对象的引用传递给方法并从中获取值。

答案 2 :(得分:0)

那是因为你要求Beta3实例的值,它永远不会初始化它的值,Java会自动将int初始化为0(由于某种原因)

beta_ku应正确打印10,但varobjBeta未设置其b值。

答案 3 :(得分:0)

Beta3info的调用中Alpha的实例未设置b值。因此,它在实例化时初始化为0

这种情况发生的真正原因是由于initial values的建立方式,根据JLS:

  

每个类变量,实例变量或数组组件在创建时都使用默认值进行初始化。 ...

...通常,这意味着所有基元都被初始化为某种形式的零,并且所有对象都被初始化为null

你怎么能绕过这个?您可以手动创建Beta3的实例并将其传递给Alpha的实例,或者只使用Beta3打印自己的info

如果您致电beta_ku,请注意info可以正常工作 - 对于该实例,b已定义为10

答案 4 :(得分:0)

在你写的信息方法中,这将永远不会奏效:

Beta3 betaku;
betaku = new Beta3();
System.out.println("b = " + betaku.perolehB());

并且将永远显示0(因为b未在betaku实例中初始化,因此默认值为0),您应该删除该行,并以某种方式传递b值,或覆盖info方法在Beta3班。

class Beta3 extends Alpha
{
   //Another code 

   public void info()
   {
       // super.info(); if you wanna show the a value too
       System.out.println("b=" + this.b);
   }

   //Some other code
}   

或者如果您需要从Alpha类访问该值:

class Alpha
{
    public void info(Beta3 aux)
    {
        this.info();
        aux.info();
    }
}  

然后在main中你可以做这样的事情:

public static void main(String[] args) 
{ 
       Beta3 varobjBeta;
       varobjBeta = new Beta3();
       varobjBeta.isiB(10); 


      Alpha varobjAlpha; 
      varobjAlpha = new Alpha(); 
      varobjAlpha.info(varobjBeta); 
}   

答案 5 :(得分:0)

betake = new Beta3();

当您实例化betake时,只需将默认值分配给类Beta3的属性。此处Beta3类的属性为b

下面是按类型列出的类变量的默认值表:

    Type                     default
--------------------------------------------------------
   boolean                     false
   int                          0
   float                       0.0
   char                       /u0000
   reference type              null

因此,您的课程Beta3 bint,因此它的默认值为0。您需要调用isiB(int b)将目标值设置为b,或者您必须编写参数化的con结构来设置b的值,即。

public Beta3(int bb){
  this.b= bb;
}

修改

    Beta3 betaku;
    betake = new Beta3();
    betake.isiB(10);
    System.out.println("b = " + betaku.perolehB());

希望它有所帮助。