2015-10-15 3 views
1

У меня есть эта задача, и я не могу понять, как ее решить: «Измените все три x-переменных, связанных с классом C».Изменить переменные экземпляра суперкласса из подкласса

class A { 
    public int x; 
} 

class B extends A { 
    public int x; 
} 

class C extends B { 
    public int x; 

    public void test() { 
     //There are two ways to put x in C from the method test(): 
     x = 10; 
     this.x = 20; 

     //There are to ways to put x in B from the method test(): 
     ---- //Let's call this Bx1 for good measure. 
     ---- //Bx2 

     //There is one way to put x in A from the method test(); 
     ---- //Ax1 
    } 
} 

Чтобы проверить, я создал это:

public class test { 
    public static void main(String[] args) 
    { 
     C c1=new C(); 
     c1.test(); 
     System.out.println(c1.x); 

     B b1=new B(); 
     System.out.println(b1.x); 

     A a1=new A(); 
     System.out.println(a1.x); 
    } 
} 

Что дает 20, 0, 0.

Теперь я понял, что я мог бы написать Bx1 так:

super.x=10; 

Это изменило бы x в B, но я не мог понять как назвать это в моем test.java.

Как вы получаете Bx1, Bx2, Ax1, и как вы называете их для теста?

+0

Связанный: http://stackoverflow.com/questions/427756/overriding-a-super-class-instance-variables –

+0

@RahulTripathi я предполагаю, что он знает, что он не переопределяет их, так как он говорит об изменении всех трех членов 'x'. – SomeJavaGuy

+1

«Bx1, Bx2» - нет двух x в B. Но самое главное, если вы не столкнулись с крайним краем (о чем я не могу думать) - вы не должны так поступать. В большинстве случаев необходимость вмешательства в переменную класса родителя подразумевает плохой дизайн. – alfasin

ответ

4

Вы можете доступ к версиям суперкласса из x с использованием суперкласса ссылки типа:

System.out.println("A's x is " + ((A)this).x); 

Это поможет A#x.

Но в целом, это очень Плохая идея затенять членов публичного экземпляра суперкласса.

Пример: (live copy on IDEOne)

class Example 
{ 
    public static void main (String[] args) throws java.lang.Exception 
    { 
     new C().test(); 
    } 
} 

class A { 
    public int x = 1; 
} 

class B extends A { 
    public int x = 2; 
} 

class C extends B { 
    public int x = 3; 

    public void test() { 
     //There are two ways to put x in C from the method test(): 
     System.out.println("(Before) A.x = " + ((A)this).x); 
     System.out.println("(Before) B.x = " + ((B)this).x); 
     System.out.println("(Before) C.x = " + this.x); 
     ((A)this).x = 4; 
     System.out.println("(After) A.x = " + ((A)this).x); 
     System.out.println("(After) B.x = " + ((B)this).x); 
     System.out.println("(After) C.x = " + this.x); 
    } 
} 

Выход:

 
(Before) A.x = 1 
(Before) B.x = 2 
(Before) C.x = 3 
(After) A.x = 4 
(After) B.x = 2 
(After) C.x = 3 
+0

Есть ли более чем 2 способа изменить B.x? Кроме того: super.x = 5; ((B) this) .x = 5; – CookieJarJar

+0

@CookieJarJar: Это единственные, о которых я могу думать, кроме (очевидно), если 'B' имеет некоторый метод мутатора или сеттера. –

+0

А, ок. Текст задачи просто сказал, что последний, 'A', был трудным, поэтому я предположил, что это не то же самое, что один из' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '. – CookieJarJar

0

это как ваш метод тестирования может выглядеть

void test() { 
    this.x = 30; 
    A a = this; 
    a.x = 10; 
    B b = this; 
    b.x = 20; 
} 

подмигнули Важно отметить, что вы обращаетесь к переменной типа класса th при этом вы определили, так что в этом случае вы получили бы доступ, x от A и x от B, определяя переменную из-за ключевого слова this.

0

Используя методы получения и установки

класса А {

public int x; 

}

класс В Расширяет {

public int x; 

public void setAx(int x) { 
    super.x = x; 
} 
public int getAx() { 
    return super.x; 
} 

}

класс C расширяет B {

public int x; 

public void test() { 

    x = 10; 
    this.x = 20; 

} 
public void setBx(int x){ 
    super.x = x; 
} 
public int getBx() { 
    return super.x; 
} 

public static void main(String[] args) 
{ 
    C c1= new C(); 
    c1.x = 1; 
    c1.setAx(2); 
    c1.setBx(3); 

    System.out.println(c1.getAx()+"/"+c1.getBx()+"/"+c1.x); 
} 

}

Смежные вопросы