สนับสนุนโดย

วันศุกร์ที่ 7 ธันวาคม พ.ศ. 2561

เจาะลึกกับ super ให้มากขึ้น

ตัวอย่างของบลอกก่อนหน้าเราได้เรียนไปแล้วว่า super ใช้อ้างอิงหาสมาชิกของคลาสแม่ แต่มันยังมีอึกเงื่อนไขหนึ่ง ที่ผมยังไม่ได้พูดถึง นั่นคือ มันจะวิ่งหาได้เพียงชั้นเดียว

เช่นว่า ถ้าเรามี x อยู่สัก 3 ชั้น มันจะมองหาได้เพียงชั้นแรกเท่านั้น



class A { int x = 1; }
class B extends A { int x = 2; }
class C extends B {
  void print() {
    System.out.println("x = " + super.x); // จะได้ค่า 2
  }
}

ทีนี้เลยเกิดคำถามว่า ถ้าเราอยากอ้างอิงไปหา int x ของคลาส A ล่ะจะไปยังไง ในจุดนี้เราใช้ การ casting เช่น ((A) this).x ได้ครับ เพื่อวิ่งไปอีกระดับนึง แต่ต้องแน่ใจว่า ตรงนั้นมี x ให้เราเรียกได้

โค้ดตัวอย่าง
package myPackage;

public class SuperAdvanced extends B2 {
    public static void main(String[] args) {
        SuperAdvanced s = new SuperAdvanced();
        s.print();
    }
    
    void print() {
        int x = ((B1) this).x;
        System.out.println(x);
    }
}

class B1 {
    int x = 1;
}

class B2 extends B1 {
    int x = 2;
}

ผลการทำงาน
1

ไม่มีความคิดเห็น:

แสดงความคิดเห็น