黑马程序员技术交流社区

标题: 对象的上转型 [打印本页]

作者: 史龙贤    时间: 2012-9-27 01:15
标题: 对象的上转型
对象的上转型有什么作用呢?为啥要这样强制转换呢?
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();
}
}
疑问:看不出上转型对象有什么作用?
作者: 唐学松    时间: 2012-9-27 09:17
父类对象引用子类对象就体现了多态!比如我们先定义Person(人类),然后定义Students(学生类)继承Person(人类),然后你下面可以写Person p=new Students()。使用多态用父类对象引用子类对象便于修改!
作者: 王得新    时间: 2012-9-27 09:26
下面是楼主的部分代码:


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();
}



作者: 夏天    时间: 2012-9-27 09:40
本帖最后由 夏诗瑶 于 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();
  }
}
}

作者: 夏天    时间: 2012-9-27 09:42
王得新 发表于 2012-9-27 09:26
下面是楼主的部分代码:

你只说到了 向上转型和向下转型能用哪些方法,并没有说到好处啊。。。
作者: 程振    时间: 2012-9-27 10:45
对于泛型,如果不适应类型参数,你就可以利用类或者接口的类型上转来实现,但是有一定局限性。
假如A的父类,B和C是A的子类,D是其它类,对于方法public void upCast(A a);
可以传递参数可以是A,B和C,D不能。

适应泛型也可以实现,public void upCast(T<? extends A> a);




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2