凯发app官方网站-凯发k8官网下载客户端中心 | | 凯发app官方网站-凯发k8官网下载客户端中心
  • 博客访问: 217427
  • 博文数量: 93
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 542
  • 用 户 组: 普通用户
  • 注册时间: 2014-12-09 16:59
文章分类

(93)

  • (5)
  • (5)
  • (18)
  • (5)
  • (15)
  • (1)
  • (1)
  • (14)
  • (13)
  • (10)
  • (6)
文章存档

(27)

(66)

我的朋友
相关博文
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·

分类: java

2015-08-03 00:21:35

 

java和c 声明一个对象有什么不同-凯发app官方网站

分类:   1038人阅读 (0)  
java:
a a = new a();
为a对象创建了一个实例,但在内存中开辟了两块空间:一块空间在堆区,存放new a()这个对象;另一块空间在堆栈,也就是栈,存放a,a的值为new a()这个对象的内存地址。因为java在jvm中运行,所以a 描述的内存地址不一定是这个对象真实内存的地址。

object o; // 这是声明一个引用,它的类型是object,他的值为null,还没有指向任何对象,该引用放在内存的栈区域中。

o = new object(); // new object()句,实例化了一个对象,就是在堆中申请了一块连续空间用来存放该对象。
= // 运算符,将引向o指向了对象。也就是说将栈中表示引用o的内存地址的内容改写成了object对象在堆中的地址。

c :
c 如果直接定义类,如classa a; a 存在栈上(也意味着复制了对象a在栈中),如果classa a = new classa就存在堆中。

初学java时,在很长一段时间里,总觉得基本概念很模糊。后来才知道,在许多java书中,把对象和对象的引用混为一谈。

如果分不清对象与对象引用,那实在没法很好地理解下面的面向对象技术,把自己的一点认识写下来,或许能让初学java的朋友们少走一点弯路。        

 

为便于说明,我们先定义一个简单的类:      

class student

{

int name;

int age;

int sex;

}

有了这个类(模板),就可以用它来创建对象:student stu1 = new student();

通常把这条语句的动作称之为创建一个对象,其实,它包含了四个动作。

1)右边的"new student",是以student类为模板,在堆空间里创建一个student类的对象(也简称为student对象)。

2)末尾的()意味着,在对象创建后,立即调用student类的构造函数,对刚生成的对象进行初始化。

构造函数是肯定有的。如果你没写,java会给你补上一个默认的构造函数。

3)左边的"student stu1"创建了一个student类引用变量。所谓student类引用,就是以后可以用来指向某个

student对象的对象引用,它指向的是某个student对象的内存地址(有点c语言中指针的味道)。

4)"="操作符使对象引用指向刚创建的那个student对象。

    我们可以把这条语句拆成两部分:student stu1; stu1 = new student();效果是一样的。

这样写,就比较清楚了,有两个实体:一是对象引用变量(stu1),在sun公司的实现中,对象的引用是一个句柄,其中包含一对指针:一个指针指向该对象的方法表,一个指向该对象的数据;另一个是对象本身(就是new出来的那个对象)。

在堆空间里创建的实体,与在数据段以及栈空间里创建的实体不同。尽管它们也是确确实实存在的实体,但是,我们看不见,也摸不着。不仅如此,我们仔细研究一下第二句,想想刚刚创建的student对象叫什么名字?

有人说,它叫"student"。不对,"student"是类(对象的创建模板)的名字。一个student类可以据此创建出无数个对象,这些对象不可能全叫"student"。对象连名都没有,没法直接访问它。我们只能通过对象引用来间接访问对象。

 

    为了形象地说明对象、对象引用及它们之间的关系,可以做一个或许不很妥当的比喻:

    对象好比是一只没有线的风筝,引用变量是一根线,可以用来系风筝。如果只执行了第一条语句,还没执行第二条,此时创建的引用变量stu1还没指向任何一个对象,它的值是null,引用变量可以指向某个对象,或者为null。这时stu1是一根线,一根还没有系上任何一个风筝的线。

    执行了第二句后,一只新风筝做出来了,并被系在stu1这根线上。我们抓住这根线,就等于抓住了那只风筝。

    再来一句:student stu2;就又做了一根线,还没系上风筝。如果再加一句:stu2=stu1;系上风筝了。

    这里,发生了复制行为。但是,要说明的是,对象本身并没有被复制,被复制的只是对象引用。

    结果是,stu2也指向了stu1所指向的对象,也就是两根线系的是同一只风筝。

    如果用下句再创建一个对象:stu2=new student();则引用变量stu2改指向第二个对象。

从以上叙述再推演下去,我们可以获得以下结论:

(1)一个对象引用可以指向0个或1个对象(一根线可以不系风筝,也可以系一个风筝),而且可以改指;

(2)一个对象可以有n个引用指向它(可以有n条线系同一个风筝)。

如果有下面语句:stu1=stu2;

    按上面的推断,stu1也指向了第二个对象。这个没问题。问题是第一个对象呢?没有一条线系住它,它飞了。

很多书里说,它被java的垃圾回收机制回收了,这不确切,准确地说,它已成为java垃圾回收机制的处理对象。

至于什么时候真正被回收,那要看垃圾回收机制的心情了。由此看来,new student();该语句应该不合法吧,

至少是没用的吧?不对,它是合法的,而且可用的。譬如,如果我们仅仅为了打印而生成一个对象,

就不需要用引用变量来系住它。最常见的就是打印字符串:system.out.println("i am java!");

字符串对象"i am java!"在打印后即被丢弃,有人把这种对象称之为临时对象。

为什么c 中的类不能定义自身类的对象,而java可以?

 (2007-10-22 16:39:13)
标签:  分类: 
在c 的类定义中,是不能够在类中定义自身类的对象的,但是可以定义自身类的指针对象和引用。
class a
{
public:
 a ()
 {
  cout<<"constructor method."<  };
 a aa;
};
 
void main()
{
 a aaaaa;
}
以上代码编译提示错误,a' : uses 'a', which is being defined。
如果把a换成*a就可以了。
 
而java就可以在类中定义自身类的对象。
class a{
  public a aa;
 }
 
这样的代码可以顺利编译,但是如果在定义的时候创建了对象实例,则也会编译失败的。
class a{
  public a aa = new a();
 }
提示错误:
exception in thread "main" java.lang.stackoverflowerror
 at test1$abc.(test1.java:4)
很明显,堆栈溢出了。
为什么呢?其实以上问题的本质是一致的,就是是创建对象实例的时机问题。
在c 中,在定义对象的时候就创建了对象的实例,即分配了对象的内存空间。在java中,只有调用new的方法才能创建对象的实例,在内存中分配对象的空间。所以,如果在定义的时候就定义自身类的对象,就会导致递归创建对象的现象,创建了对象aa,因为aa是一个a类的实例,那么aa中还有一个aa对象,还要创建一个aa对象,为其分配内存…………,这样就会导致递归创建对象,结果就是内存被消耗殆尽。当然,这样的设计本身也不合理。
在java中,对象只有在new时才能创建对象实例,所以类中可以定义自身类的对象。如果把上例修改成令一个类的实例,则不会有任何问题。
class a{
  public bb = new b();
 }
这样的代码是可以编译并运行的。

c语言中一个指针占用多少字节?(编译环境vc6.0)
#include
void main()
{
char *p;
int *q;
printf("ptr addr:%d,%d\n",sizeof(p),sizeof(q));
}

run:4,4;

解释如下:
     指针其实就是地址, 与它所指的基类型无关, 更与c语言无关, 只与机器有关;
      如果你的机器是16位寻址的, 那指针就是16位的, 如果是32位寻址的, 指针也是32位的.;
     较特殊的是老式的x86, 它是16位的机器, 但采用了分段寻址, 所以指针是两个16位合起来的(但与真正的32位又不同),两个16位(一个是段, 一个是偏移值). 只有在段内寻址, 才可能用16位, 即两个字节
     所以c语言中一个指针占用多少字节要看一下你的c编译器是在什么平台下运行的.    可以讨论一下,sizeof 关键字的用法还是挺奇妙的哦!.
阅读(1141) | 评论(0) | 转发(0) |
0

上一篇:

下一篇:

给主人留下些什么吧!~~
")); function link(t){ var href= $(t).attr('href'); href ="?url=" encodeuricomponent(location.href); $(t).attr('href',href); //setcookie("returnouturl", location.href, 60, "/"); }
网站地图