A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郭炜 中级黑马   /  2012-3-12 03:52  /  1360 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

谁能写出如下代码的输出?并说明为什么。
public class Test {
public static void main(String[] args) {
Animal x = new Tiger();
System.out.println("(1)x.news is " + x.news);
System.out.println("(2)((Tiger)x).news is " + ((Tiger)x).news);
System.out.println("(3)x.smile() is " + x.smile());
System.out.println("(4)((Tiger)x).smile() is " + ((Tiger)x).smile());
System.out.println("(5)x.getNews() is " + x.getNews());
System.out.println("(5)x.getMessage() is " + x.getMessage());
}
}
class Animal {
public String news = "Animal's news";
public String message = "Animal's message";
public static String smile() {
return "smile from Animal";
}
public String getNews() {
return news;
}
public String getMessage() {
return message;
}
}
class Tiger extends Animal {
public String news = "Tiger's news";
public String message = "Tiger's message";
public static String smile() {
return "smile from Tiger";
}
public String getNews() {
return news;
}
}

5 个回复

倒序浏览
这是输出结果:
(1)x.news is Animal's news
(2)((Tiger)x).news is Tiger's news
(3)x.smile() is smile from Animal
(4)((Tiger)x).smile() is smile from Tiger
(5)x.getNews() is Tiger's news
(5)x.getMessage() is Animal's message
下边有注释:
public class a {
public static void main(String[] args) {
Animal x = new Tiger();                                                                        //实例化一个Tiger
System.out.println("(1)x.news is " +this. x.news);                                //调用Animal的news
System.out.println("(2)((Tiger)x).news is " + ((Tiger)x).news);              //调用Tiger的news
System.out.println("(3)x.smile() is " + this.x.smile());                             //调用Animal的smile()
System.out.println("(4)((Tiger)x).smile() is " + ((Tiger)x).smile());          //调用Tiger的smile()
System.out.println("(5)x.getNews() is " + x.getNews());                        //调用Tiger的getNews(),因为Tiger继承了Animal中的所有方法,并且覆写所以调用的是Tiger的getNews()
System.out.println("(5)x.getMessage() is " + x.getMessage());//调用Animal的getMessage() 因为Tiger继承了Animal中的所有方法,但是没有覆写getMessage()所以调用Animal getMessage()
}
}
class Animal {
public String news = "Animal's news";                                              //声明news变量
public String message = "Animal's message";                                     //声明message变量
public static String smile() {
return "smile from Animal";
}
public String getNews() {                                                                   //getNews()方法
return news;
}
public String getMessage() {                                                             //getMessage()方法
return message;
}
}
class Tiger extends Animal {
public String news = "Tiger's news";                                                  //声明news变量
public String message = "Tiger's message";                                  //声明message变量


public static String smile() {
return "smile from Tiger";                                                               //smile() 方法
}
public String getNews() {
return news;                                                                                   //覆写getNews()方法
}
}
回复 使用道具 举报
这是多太的调用这的知识,你要你要理解了静态和多台(上下转型)写出这个结果不难,我明天写,手机不好搞
回复 使用道具 举报
嗯 是属于多态方面的,这个应该是属于向下类型转换的、即将父类型转化为子类型的。
回复 使用道具 举报
1"Animal's news"         
2"Tiger's news"
3"smile from Animal"  !!!!
4"smile from Tiger"
5"Tiger's news"
6 "Animal's message"典型的多态问题,把父类对象引用边指向 子类实例化对象。 本身就是多态的体现所以没有强制向回转型的情况都是调用父类的即1,3,5 强制转型的情况如2 4
另外关于方法覆盖了的话就调用覆盖的方法如6
回复 使用道具 举报
  1.                 Animal x = new Tiger();
  2.                 System.out.println("(1)x.news is " + x.news);
  3.                 //引用父类成员变量news
  4.                 System.out.println("(2)((Tiger)x).news is " + ((Tiger)x).news);
  5.                 //因为强转了,所以引用子类成员变量news
  6.                 System.out.println("(3)x.smile() is " + x.smile());
  7.                 //父类是静态的没有被复写,所以调用了父类的smile方法
  8.                 System.out.println("(4)((Tiger)x).smile() is " + ((Tiger)x).smile());
  9.                 //应为强转了,所以调用了子类的smile方法
  10.                 System.out.println("(5)x.getNews() is " + x.getNews());
  11.                 //子类复写了该方法,所以调用了子类的getNews方法
  12.                 System.out.println("(5)x.getMessage() is " + x.getMessage());
  13.                 //子类没有复写,调用父类的getMessage方法。
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马