Java中關於變量的幾種狀況

Java中關於變量的幾種狀況

一、繼承時變量的引用關係

class Animals {  
    int age = 10;  
    void enjoy() {  
        System.out.println("Animals enjoy!");  
    }  
      
}  
  
class Dogg extends Animals {  
    int age = 20;  
    int weight;  
    void enjoy() {  
        System.out.println("Dog enjoy!");  
    }  
}  
  
public class Test {  
    public static void main(String[] args) {  
        Animals a = new Animals();  
        a.enjoy();  
        System.out.println(a.age);  
          
        Dogg d = new Dogg();  
        d.enjoy();  
        System.out.println(d.age);  
          
        Animals d1 = new  Dogg();  
        d1.enjoy();       
        System.out.println(d1.age);  
        Dogg s = (Dogg)d1;  
        System.out.println(s.age);  
          
    }  
  
}

因而可知,父類和子類的變量是同時存在的,即便是同名。
子類中看到的是子類的變量,父類中看到的是父類中的變量。
它們互相隱藏,而同名的方法則是實實在在的覆蓋(重寫)。java

如Animals d1 = new Dogg();
d1便是一個Animals的對象,也是一個Dogg的對象,
那麼調用方法時,是根據對象的實際類型調用的,
實際類型是Dogg,因此永遠調用子類的方法。this

而訪問成員變量就不一樣了,它是Animals時,訪問的是父類的成員變量,
轉型爲Dogg的話,訪問的就是子類的成員變量了。code

二、Java中的傳值調用

public class CallByValue {
    Customer c1 = new Customer("張三");
    some(c1);
    System.out.println(c1.name);//結果是李四
    
    Customer c2 = new Customer("趙六");
    other(c2);
    System.out.println(c2.name);//結果是趙六

    static void some(Customer c){
        c.name = "李四";
    }
    static void other(Customer c){
        c = new Customer("王五");//創建新對象指定給c參考,本來參考的對象會被清除
    }
}
class Customer{
    
    String name;
    public Customer(String name) {
        this.name = name;
    }
}

Java中只有傳值調用,在some方法中,c和c1參考的是同一對象,即c.name修改的是同一對象的變量。
在調用other()方法時,c和c2參考的是同一對象,在c = new Customer("王五")這一句就是要求創建新對象,並指定給c參考,即c和c2變成了兩個不一樣的對象。對象

相關文章
相關標籤/搜索