问题程序如下
class A{
  double n;//隐藏的成员变量
  int m;
//  private int k;
  
  void f(){
    System.out.printf("子类将继承这个方法,n=%f,m=%d\n",n,m);
  }
  void g(){
    System.out.printf("你好,n=%f\n",n,m);
  }
}
class B extends A{
  int n =12;
//  private int k;
  void g(){//重写的方法
    System.out.printf("我重写的方法,n=%d,m=%d\n",n,m);
//    System.out.println(k);
    }
  void cry(){
    System.out.printf("我是子类新增的方法,n=%d,m=%d\n",n,m);
    }
}
public class UpConvertExample{
  public static void main(String[] args){
    A a = new B();
//    a.k = 99;
    a.n = 0.618;
    a.m = 200;
    a.f();
    a.g();    
    B b =(B)a;
    b.n = 555;
    b.cry();
    }
}
对于对象的创建过程,我现在的理解程度为 A a = new A(); 其中a为引用类似指针,new A()则是类中的构造函数,为其成员变量分配存储空间,并在执行构造函数的时候会自动将其成员变量进行初始化(这里不知道理解有没有问题)。
但当我遇到上转型的引用时,A a = new B(); 
1)其创建的对象,到底分配的是哪个类里的成员变量的空间?如何分配的?
2)在 A a; a = new A(); a = new B(),A a 中A是什么含意?在这两处应用是否相同?
3)作程序时,发现上转型对象不能对父类private成员变量和方法调用,但老师说是可以的,对否?

解决方案 »

  1.   

    (1)对象当然是B类的对象,只是基类的引用(a)可以引用到子类的对象。这是语法允许的,更是实现多态的关键;
    (2)A a; a = new A(); 是先定义一个变量(引用)a,没有初始化,之后是新建一个A类对象并让a引用它。而a = new B()是新建一个B类对象并让a引用它。
    (3)不仅仅是向上转型之后,不管转型不转型,外部的任何东西都不能调用一个类(不管是子类还是父类)的private方法。你可能想糊涂了,private方法只能从自己类的方法内部自己用,不能从外部以a.f();的形式调用,这一个跟转型没有任何关系。
      

  2.   


    但在第二个问题中我仍然有些不明白,
    究竟 A a = new A(); 与 B a = new A()会有什么区别?
      

  3.   

    B a = new A()?
    这太危险了。
      

  4.   

    哦,不是危险,是编译根本通不过的。
    你可以:
    A a = new A();
    B b = (B)a;
    但太危险。运行时会有ClassCastException。
    父类引用可以引用子类对象,反之不可。
      

  5.   

    换句话说,是抛开这个程序,A a = new A();    B a = new A();
    中的A  B 是什么意思?应该怎么理解?从理论上说......谢谢!!!
      

  6.   

    前面的A和B就是类型名,而后面夹在new和括号之间的类型名就表示创建一个对象的实例,这不是基本语法吗?
      

  7.   

    new xx()是分配存储空间等等,这个我知道。
    但是引用的不同类型之间有什么区别?谢谢!!
      

  8.   

    不同类型的引用之间的区别由那种引用的类型决定啊。
    比如说在你的程序中,B有个cry方法,所以B型的引用x上就可以调用x.cry,而A型的引用x上就不可以调用cry,不管对象的实际类型是什么。
      

  9.   

    在 new xx();中,使分配对应的成员变量的存储空间,并用 a 这个引用,指向其成员变量的地址,但对 前面的A、B,类类型,就不知道应该如何理解了。
      

  10.   

    Java里的引用就是个变量名,变量总得有个类型吧。——至少在Java,C,C++,C#,Pascal等强类型的语言中是这样。
    Basic,Perl那种弱类型的语言中则未必。
      

  11.   

    A和B就像“int i”,“double d”中的int,double分别指明了i和d的类型一样,A指定了变量(引用)a的类型。
      

  12.   

    class Dog{}
    class FlyingDog{
     wing w; // 属性:有翅膀
     fly(); // 行为:会飞
    }Dog dog = new Dog(); // 一条狗,可能会飞也可能不会飞
    FlyingDog fdog = new FlyingDog(); // 一条会飞的狗
    Dog dog = new FlyingDog(); // 本来是一条会飞的狗,可惜被埋没了才华
    FlyingDog fdog = (FlyingDog)new Dog(); // 要是正好这条狗会飞,那真是狗尽其才,否则的话...
      

  13.   

    FlyingDog fdog = (FlyingDog)new Dog();//要是正好这条狗会飞,那真是狗尽其才,否则的话...
    --
    修正:
    FlyingDog fdog = (FlyingDog)dog;//要是正好这条狗会飞,那真是狗尽其才,否则参考下文
    FlyingDog fdog = (FlyingDog)new Dog();//不会飞的狗硬让它飞,也是飞不起来的...