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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 史龙贤 黑马帝   /  2012-9-27 01:15  /  1990 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

对象的上转型有什么作用呢?为啥要这样强制转换呢?
class A
{
  double n;
  int m;
  void f()
  {
   System.out.print("子类继承方法f()");
  }
void g()
{
   System.out.printf("你好");
}
}

class B extends A
{
  int n =12;
void g()
{
   System.out.printf("子类重写方法g()");
}
void cry()
{
   System.out.printf("子类新增的方法");
}
}
public Demo
{
public static void main()
{
A a;
a=new B();
a.n=0.618
a.m=200;
a.f();
a.g();
B b=(B)a;
b.n=555;
b.cry();
}
}
疑问:看不出上转型对象有什么作用?

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

6 个回复

正序浏览
对于泛型,如果不适应类型参数,你就可以利用类或者接口的类型上转来实现,但是有一定局限性。
假如A的父类,B和C是A的子类,D是其它类,对于方法public void upCast(A a);
可以传递参数可以是A,B和C,D不能。

适应泛型也可以实现,public void upCast(T<? extends A> a);
回复 使用道具 举报
王得新 发表于 2012-9-27 09:26
下面是楼主的部分代码:

你只说到了 向上转型和向下转型能用哪些方法,并没有说到好处啊。。。
回复 使用道具 举报
本帖最后由 夏诗瑶 于 2012-9-27 09:46 编辑

举个例子:
abstract class Animal {
abstract void eat();
}
class Dog extends Animal {
public void eat() {
  System.out.println("骨头");
}
public void lookHome() {
  System.out.println("看家");
}
}
class Cat extends Animal {
public void eat() {
  System.out.println("吃鱼");
}
public void catchMouse() {
  System.out.println("抓老鼠");
}
}
public class DuoTaiDemo {
public static void main(String[] args) {
  method(new Cat());//上面代码就不废话了,猫和狗都继承了动物,自己有自己的方法。
}
public static void method(Animal a) { //这边就是向上转型。不管你创建任何子类对象 就可以调用这个方法。而如果你的形参是猫或者狗,代码会很冗长复杂!!
                                                       所以
向上转型的好处1.提高功能的扩展性;2.可以使复杂问题简单化。
  a.eat();
  if (a instanceof Dog) {
   Dog d = (Dog) a;
   d.lookHome();
  } else if (a instanceof Cat) {
   Cat c = (Cat) a;
   c.catchMouse();
  }
}
}
回复 使用道具 举报
下面是楼主的部分代码:


public static void main()
{
      A a;
      a=new B();//向上转型,举个毕老师的例子, byte a=10;  
                                                                             int b=a;//这里!a原来是byte类型的,赋给b以后,就成了int类型了,这说明a被提升了,这就是向上转型
                         //如果这里要问问什么要用 向上转型,其实这里是多太的运用啊,是“父类的引用(A    a),指向子类的对象(new    B())”
      a.n=0.618
      a.m=200;
      a.f();
      a.g();
      B b=(B)a;//向下转型,看这里!a这个对象可以调用n、m、f()、g()等成员,但是a不可以调用cry()这个方法,怎么办????向下转型呗
                    //再举个毕老师在视频中说的例子,有一个Animal类,(假设里面有sleep()、eat()等方法),Cat继承了这个类(这时Cat就有了sleep()、eat()等方
                     法了),我们再在Cat类中再加个catchMouse()这个方法,下面这样:
                         Animal  mimi=new Cat();
                          mimi.sleep();
                          mimi.eat();//这两个方法都没问题,(但是不能这样:mimi.catchMouse())可是你能叫动物去抓老鼠吗?
                         Cat mimi2=(Cat)mimi;//这里,你就可以mimi2.catchMouse();这时它是Cat类型的引用了,你就可以说,mimi2去给我抓老鼠去!
      b.n=555;
      b.cry();
}


回复 使用道具 举报
父类对象引用子类对象就体现了多态!比如我们先定义Person(人类),然后定义Students(学生类)继承Person(人类),然后你下面可以写Person p=new Students()。使用多态用父类对象引用子类对象便于修改!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马