В следующем коде super.type
значение this.type
.
// http://education.oracle.com/pls/web_prod-plq-dad/db_pages.getpage?page_id=303&p_certName=SQ1Z0_803
class Feline {
public String type = "f ";
public void hh(){ System.out.print("FFFFF ");}
}
public class Cougar extends Feline {
public void hh(){
super.hh();
this.type = "c ";
System.out.print("CCCCC "+this.type + super.type);
}
public static void main(String[] args) { new Cougar().hh(); }
}
Как я могу получить значение super.type
в классе потомков?
ТИА.
Если я изменю класс Cougar
на
public class Cougar extends Feline {
public String type = "c "; // <-- shadow Feline type.
public void hh() {
super.hh();
// this.type = "c ";
System.out.print("CCCCC " + this.type + super.type);
}
}
Затем я получаю вывод, который вы, похоже, ожидаете от
FFFFF CCCCC c f
Вместо вывода, который производит ваш код (который был)
FFFFF CCCCC c c
Это не способ OO делать что-то, потому что Cougar
- Feline
. Поведение, которое вы видите (изменения стоимости в суперклассе), связано с этими отношениями. Наконец, чтобы сохранить значения разными, вам нужно будет Feline
тип Feline
как указано выше.
public String type = "f "
существует в вашем суперклассе. Таким образом, он наследуется для вашего дочернего класса. Когда вы вызываете this.type = "c"
То, что он делает, изменяется значение переменной типа, которое существует в суперклассе. Таким образом, результат, который вы получаете, является правильным.
Вы просто создаете один экземпляр Cougar, в начале, поле типа "f", однако, перед тем, как вы напечатаете super.type, вы присвоили ему значение "c".
Вы можете понять это с помощью следующего кода:
class Feline {
public String type = "f ";
public void hh(){ System.out.print(type);}
}
public class Cougar extends Feline {
public void hh(){
super.hh();
this.type = "c ";
System.out.print(this.type + super.type);
}
public static void main(String[] args) { new Cougar().hh(); }
}
How can i get the value of super.type in the descendant class ?
проблема:
this.type = "c "; //this.type will return the super.type
Вы уже ссылаетесь на значение вашего super.type
на "c "
таким образом печатая "c"
решение:
Вам нужно создать переменную type
в классе Cougar
чтобы изменить область действия this.type
.
Я не понимаю, что вы имеете в виду. Если вы действительно хотите различать тип, вы должны объявить тип в Cougar:
public class Cougar extends Feline {
public String type = "c ";
...
}
вы переопределили значение типа в классе Cougar. Делая это:
this.type = "c ";
Если вы хотите иметь разницу между super.type и this.type, добавьте поле с типом имени в Cougar тоже.
public class Cougar extends Feline {
public String type = ""; //add this
public void hh(){
super.hh();
this.type = "c ";
System.out.print("CCCCC "+this.type + super.type);
}
public static void main(String[] args) { new Cougar().hh(); }
}
Feline
, вы переопределяете значениеtype
, присваиваяc
Если вы создаете его в подклассе, вы получите значение Stringsuper.type
значения, используяsuper.type
.