是我.上次也回复过你的帖子.
我觉得这两个,怎么说呢,他们之间虽然有关系,但并不是一个并列的概念啊。extend是继承,upcasting是向上转型。
我还是拿我上次这个程序作解释吧!
class Circle extends Shape{
 public void method(){
  System.out.println("circle");
 }
}
class Square extends Shape{
 public void method(){
  System.out.println("square");
 }
}
class Triangle extends Shape{
 public void method(){
  System.out.println("triangle");
 }
}
public class Shape{
  public void method() {
    System.out.println("Shape");
  }
  public static void main(String arg[]){
    Shape c=new Circle();
    Shape s=new Square();
    Shape t=new Triangle();  c.method();
  s.method();
  t.method();
 }
整个继承(extends)你总明白吧!
而upcast发生在main中的以下三句话
Shape c=new Circle();
Shape s=new Square();
Shape t=new Triangle();
很明显new出的是三个不同的实例,但是他们都可以向上转型(upcast)成Shape,这是因为他们都继承自Shape。
而java的优点就在于虽然c s t 这三个变量都是Shape类型,但是当调用method()方法是,并不是输出"Shape",而是java会自动判断他们的实际类型,并准确无误的调用到相应的method(),输出"Circle","Squre"或者"Triangle"。
不知道我这么说你是不是明白?有问题我们可以继续交流。

解决方案 »

  1.   

    先谢谢你的热心。我想知道的问题不是一个关键性的问题:upcast到底有什么用,使用意义有多大?为什么大家都说synthesize比extend好?只有当用到upcast的时候才选择extend?因为我以前针对extend做过实验性的练习程序,发现几个class(在同一个编辑单元中)无论是否具有继承关系,通过在一个class(如A class)内创建另一个class(如B class)的object都可以达到调用这个class(B class)里的method(而B class中的method是系统默认的类型protected)。而extend也同样,所以我总觉得upcast如同鸡肋:既然无论两个class是否是extend nexus都可以通过创建object来达到调用目标class.method(),使用upcast也只不过是减少工作量而已,并且减少的工作量也不一定很大(因为upcast工作的重点,自我感觉不是在调用上,而是重新编写新的class;调用只是依样画葫芦而已)。还有一点,在think in java里是这样说upcast的“我们认为多形性是一种至关重要的技术,它允许程序员“将发生改变的东西同没有发生改变的东西区分开”。”我却没有体会到。
      

  2.   

    synchronize
    这个是同步的关键字。用来解决JAVA中的线程同步的问题。extends
    JAVA的关键字。 A extends B  ,A,B都是类。upcast 
    不是JAVA关键字。指的是:使用基类 变量引用派生类对象。
      

  3.   

    upcast其实不是一个关键字,只是一种用法:
    shape s = new circle();
    s.rotate();
    为什么要upcast呢?一个是为了动态绑定。如果你有一个需要:
    shape[] s ;
    s[1] = new Circle();
    s[2] = new rect();
    假如现在你需要依次调用他们的一个方法,那么你可以s.rotate();
    如果你不能够用upcast呢?你就不能够使用数组来保存他们的reference了。
    还有可能你不明确自己需要使用的东西是什么,那么使用基类的指针(upcast)就非常方便了。这样会避免程序中的硬编码,它是程序灵活性的大敌,而且是完全可以通过良好的涉及屏蔽掉的。类似的东东你可以考虑到涉及模式和OO中的一般规律:
    使用接口优先于类:就是尽量使程序能够不依赖于具体的实现。比较常见的模式就是Factory;
    而extends呢,仅仅使声明了对象之间的关系,是继承的关系。
    上面就会有
    circle extends shape
    rect extends shape
    其语义就是:is a
     circle 是一种shape
     rect 是一种shape
      

  4.   

    通过在一个class(如A class)内创建另一个class(如B class)的object都可以达到调用这个class(B class)里的method(而B class中的method是系统默认的类型protected)。
    你的这个东东呢,涉及到另外的一个题目:
    inner class
    inner class就像类中的一个变量一样。当然他也可以使用类内部的所有变量了。与此相关的还有就是关于类之间的可见性,java中的访问控制符的问题。
    慢慢讲了。