教程上说java中的数据类型除了基本数据类型外都是引用数据类型,它表示变量的存储点而不是变量本身。
  那我有下面: 
  class A
  {
      A()
    {
    }
  
  }
  
  在主函数中:
 [code=Java] public static void main()
 {
   A a=new A();
 }
 怎既然变量是引用数据类型,引用变量表示变量的地址  那就应该把a理解成对象的地址啊(java中称为引用)?? 可是怎么都用“.”操作符号。如果把a就是理解成基类的实例化对象的话, 把子类赋值给基类的对象那应该发生截断。可是做了一个试验却也没有截断,这个到底应该怎么理解啊??class shape                     //基类
{
protected String name;
protected double area,perimeter;
public shape()
{
name="";
area=perimeter=0;
}

}
 
class Rectangle extends shape              //子类
{
protected double length,width;
public Rectangle(double _length, double _width)
{
name = "Rectangle";
length=_length;
width=_width;
}
public void computeArea()
{
area=length*width;
}
public void computeperimeter()
{
perimeter=2*(width+length);
}
public void display()
{
System.out.println("********* super **********");
// }

}public class sample1 
{
 
 public static void main(String args[])
 {
 shape s=new shape();  // 把子类的实现复制被基类 应该会截断啊  s不应该有diaplay的实现 
 s.diaplay();

 
}}
 结果为:********* super **********
 
 主函数中,shape s=new shape();    这个应该怎么理解?? 谢谢!!!

解决方案 »

  1.   

    不好意思写错了   应该是shape s=new Rectangle (); 
      

  2.   

    那也不对,s引用也看不到diaplay()方法,需要向上转型才能看到!
    Rectangle r = (Rectangle )s
      

  3.   

    你定义的s 不可能拥有display的方法的 你上面的代码编译通不过的!
      

  4.   

    楼主你用shape s=new Rectangle (); 
    那么你是无法用s.diaplay()的,因为这个方法只存在于子类,
    这样编译的时候都无法从父(基)类引用中找到这个方法想要调用只能在父(基)类里面创建一个同名的方法,调用的时候会根据多态调用子类的方法
      

  5.   

    谢谢!
    shape s=new Rectangle (); 
    中的应该怎么看待呢? 是看成基类的对象还是子类的对象,谢谢!! 
    C++中一般都是定义基类的指针,这样比较好理解,java中就糊涂了. 
      

  6.   

    你可以把Java的引用理解为C++的指针,jvm内部也的确是用指针实现的。
      

  7.   

    abstract class Shape
    {
    protected String type;
    protected double area, perim;
    public abstract void computeArea();
    public abstract void computePerim();
    public String Show()
    {
    return type+":\n\tArea="+area+"\n\tPerim="+perim;
    }

    }class Rectangle extends Shape
    {
    protected double width, height;
    public Rectangle(double _width, double _height)
    {
       type = "Rectangle";
       width = _width;
       height = _height;
    }
    public void computeArea()
    {
    area = width * height;
    }
    public void computePerim()
    {
    perim = 2* (width + height);
    }
    public String Show()
    {
    return type+":\n\tArea="+area+"\n\tPerim="+perim;
    }
    }class Circle extends Shape
    {
    protected double radius;
    public Circle(double _radius)
    {
         type = "Circle"; 
    radius=_radius;
    }
    public void computeArea()
    {
    area = radius * radius*3.14159;
    }
    public void computePerim()
    {
    perim = 2* 3.14159*radius;
    }
    public String Show()
    {
    return type+":\n\tArea="+area+"\n\tPerim="+perim;
    }
    }public class DuoTai
    {
        public static void main(String args[])
        {
         Shape Shapes[]={new Rectangle(2,4),new Circle(3)};
         for(int i=0; i<Shapes.length; i++)
         {
         Shapes[i].computeArea();
         Shapes[i].computePerim();
         System.out.println(Shapes[i].Show());
         }
        }
        
        
    }执行的结果是:
    Rectangle:
    Area=8.0
    Perim=12.0
    Circle:
    Area=28.27431
    Perim=18.849539999999998
    Shapes[i]本身没有实现方法  确仍然可以调用子类的方法   感觉就是基类对象可以调用子类的方法。 
      

  8.   

    恩 谢谢  我就是想迷糊 Java中的对象变量 我感觉Java对象变量又是变量又是指向变量的指针,直接晕倒了~~~
     class A
    {
    }class B extends A
    {
    }A a = new B();        //这行a表示对象a 还是指向a 的指针
    B b = (B)a;          //是表示a的指针强制赋给指向对象b的指针吗? 还是把对象a强制赋值给对象b???到底是表示对象还是表示指向变量的指针???
      

  9.   


    呵呵  谢谢  你的意思就是说  所有非基本变量都是表示指向该变量的指针  比如: A a = new a(); a 表示对象的指针.
      

  10.   

    是的 ,不过java中启了个名字叫“引用”而已。像C++ ,B b;就定义了一个对象。A a = b;的时候会发生对象slice的现象,这时候是对栈里的b对象进行的处理。对java而言,建立对象必须通过new(除了语言直接支持的String类外),只允许将对象创建在堆上(从java语义角度可以这么讲)。B b;只是个声明而已,必须通过
    B b = new B();建立对象。A a = b;不过是引用类型的变化(根C++比较的话,是指针的类型转换,不涉及到对象数据的处理。
      

  11.   

    呵呵 谢谢  这么说java中除了基本数据类型  其他数据变量都被保护起来了  我们只能得到它的指针(引用)
    通过指针访问该数据变量  是这样的吗?
    比如: C++ 中 A a; a就表示对象本身,我们就可以操作该变量。  而java中A a; a只表示指向对象的指针,我们只能通过该指针操作对象本身,而不能直接操作对象本身。 
    是这样的吗???
      

  12.   


    class 命名的时候 要遵循规范 首字母要大写class  shape 显然不规范  改为class Shape  
      

  13.   

    Java中 非基本数据类型 都是在 内存堆中创建,对象的引用当然是保存 对象的地址,而不是对象本身举例说明:你现在有台电视机,现在你在自己的房间内走动,同时你又要控制电视机,那你怎么办?方法有两个1. 抱着电视在自己手上(存储对象本身)2. 随身携带一个电视机的遥控器(存储兑现的引用--电视机遥控器)显然方法1 是费力不讨好的
      

  14.   

    别太迷信了。在可能的情况下,jvm会尽量将对象分配在栈里而不是堆中,避免分配和回收时带来的性能损失(比如要进行垃圾回收相关的管理),照这个比方看,jvm开发人员情何以堪?
      

  15.   

    似乎java语言编写的程序中所有的变量名都称为指针比较恰当些,而我们在调用对象的时候是通过指针去调用的,当然 指针也分为两种,一种是对象指针,就是引用,他存储的是一个对象实例的首偏移地址,第二种是值指针,他存储的是操作数,不过如果将所有的东西都当作对象的话,这种值指针(就是基本数据类型)似乎就不是符合对象的特性了——我觉得对象的特性还是在于引用。
      

  16.   

    [color=#FF0000]你知道java的几大特性吗:
    其中有一个叫“多态”的特性~~
    刚刚你就是对多态的理解不足。你知道吗。java中的接口的定义,面向接口的编程就是运用了多态的特性。
    楼上的那位兄弟说的很对,你可以好好看一下java中的堆和栈的理解和定义。我们所运用的框架,特别是spring框架中大都运用到了接口这个定义,所以你要好好的看下那个多态。
    [/color]