出力は10ですか?

9666 ワード

package cn.galc.test;

class Base
{
    private int i =2;
    public Base()
    {
        System.out.println(this.i);
        this.display();
        System.out.println(this.getClass());
    }
    public void display()
    {
        System.out.println(i);
    }
}

class Derived extends Base
{
    private int i =22;
    public Derived()
    {
        i=222;
    }
    public void display()
    {
        System.out.println(i);
    }
}
public class Test {
    public static void main(String args[]) {     
        new Derived();
    }
}

20class cn.galc.test.Derived
回答:
変数のコンパイル時のタイプと実行時のタイプが異なる場合、その変数によって参照されるオブジェクトのインスタンス変数にアクセスすると、そのインスタンス変数の値は、宣言された変数のタイプによって決定されます.
しかし、この変数によって参照された変数のインスタンスメソッドが呼び出されると、このメソッドの動作は実際に陰陽のオブジェクトによって決定されます.
したがって、プログラムがthisにアクセスすると.iの場合、Baseクラスで定義iインスタンス変数、すなわち出力2にアクセスする.しかし、これを実行します.display()コードの場合,実際にDerivedオブジェクトの挙動,すなわちDerivedオブジェクトのiインスタンス変数,すなわち0を出力する.
 
package cn.galc.test;

class Animal
{
    private String desc;
    public Animal()
    {
        this.desc = getDesc(); //2
    }
    public String getDesc()
    {
        return "Animal";
    }
    public String toString()
    {
        return desc;
    }
}

class Wolf extends Animal
{
    private String name;
    private double weight;
    public Wolf(String name, double weight)
    {
        this.name = name;  //3
        this.weight = weight;
    }
    
    @Override
    public String getDesc()
    {
        return "Wolf[name=" +name + ",weight=" +weight +"]";
    }
}

public class Test {
    public static void main(String args[]) {     
         System.out.println(new Wolf("huitailang", 32.1)); //1
    }
}

Wolf[name=null,weight=0.0]
回答:
親overrideサブクラスメソッドのため、親クラスが呼び出されます.ただし、親の//3では実行されていません.
 
package cn.galc.test;
class Base
{
    int count =2;
    public void display()
    {
        System.out.println(this.count);
    }
}
class Derived extends Base
{
    int count = 20;
    @Override
    public void display()
    {
        System.out.println(this.count);
    } 
}

public class Test {
    public static void main(String args[]) {     
         Base b = new Base();
         System.out.println(b.count);  //2
         b.display(); //2
         Derived d = new Derived();
         System.out.println(d.count); //20
         d.display(); //20
         
         Base bd = new Derived();
         System.out.println(bd.count); //20
         bd.display(); //20
         
         Base b2d = d;
         System.out.println(b2d.count); //20
    }
}

 
2 2 20 20 2  20 2
これらの変数によってメソッドを呼び出すと、メソッドの動作は常に実際のタイプを炒める動作を表す.しかし、これらの変数によってオブジェクトを指すインスタンス変数にアクセスすると、これらのインスタンス変数の値は常にこれらの変数を宣言するために使用されるタイプの動作を示します.このようにjava継承は,メンバー変数とメソッドを処理する際に異なる.