教程上说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(); 这个应该怎么理解?? 谢谢!!!
Rectangle r = (Rectangle )s
那么你是无法用s.diaplay()的,因为这个方法只存在于子类,
这样编译的时候都无法从父(基)类引用中找到这个方法想要调用只能在父(基)类里面创建一个同名的方法,调用的时候会根据多态调用子类的方法
shape s=new Rectangle ();
中的应该怎么看待呢? 是看成基类的对象还是子类的对象,谢谢!!
C++中一般都是定义基类的指针,这样比较好理解,java中就糊涂了.
{
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]本身没有实现方法 确仍然可以调用子类的方法 感觉就是基类对象可以调用子类的方法。
class A
{
}class B extends A
{
}A a = new B(); //这行a表示对象a 还是指向a 的指针
B b = (B)a; //是表示a的指针强制赋给指向对象b的指针吗? 还是把对象a强制赋值给对象b???到底是表示对象还是表示指向变量的指针???
呵呵 谢谢 你的意思就是说 所有非基本变量都是表示指向该变量的指针 比如: A a = new a(); a 表示对象的指针.
B b = new B();建立对象。A a = b;不过是引用类型的变化(根C++比较的话,是指针的类型转换,不涉及到对象数据的处理。
通过指针访问该数据变量 是这样的吗?
比如: C++ 中 A a; a就表示对象本身,我们就可以操作该变量。 而java中A a; a只表示指向对象的指针,我们只能通过该指针操作对象本身,而不能直接操作对象本身。
是这样的吗???
class 命名的时候 要遵循规范 首字母要大写class shape 显然不规范 改为class Shape
其中有一个叫“多态”的特性~~
刚刚你就是对多态的理解不足。你知道吗。java中的接口的定义,面向接口的编程就是运用了多态的特性。
楼上的那位兄弟说的很对,你可以好好看一下java中的堆和栈的理解和定义。我们所运用的框架,特别是spring框架中大都运用到了接口这个定义,所以你要好好的看下那个多态。[/color]