注册 登录
编程论坛 J2EE论坛

会java,有OOP思想的人进来看!请版主置顶

yangwudong 发布于 2006-05-19 16:07, 4552 次点击
1. String abc = new String("123");
请问,以上语句,在内存中一个创建了几个对象!
List def = new ArrayList();
请问,以上语句,又创建了几个对象呢?
2. java中,所有的类,都有一个最大的特点,每个类都有,你现在写一个,它一定也有!
3. null是一个什么东西呢?

如果你能够正确的答对以上的问题,恭喜你,你可以从java的学习中,晋升到去学习servlet和jsp了!但是,java的海洋是无限大的,希望大家出去傲气,平心静气的去学习java和OOP的思想!
57 回复
#2
疯子java2006-05-19 16:11

很好
现在的很多人都存在这样的思想
我也是的
呵呵

#3
快乐让让2006-05-20 08:49
我晕了, 我刚学
String abc = new String("123");
这里是不是只创建了一个对象啊?
对象abc 初值为:"123"
#4
快乐让让2006-05-20 08:51
类的最大特点是什么呢?
我只明白书上写的类的特点。。。至于你提的特点我还没能找出来,我写了好几个类,都没发现,基本和书上提的特点是一样的。。
#5
快乐让让2006-05-20 08:51
null是什么东西,我们还没学!!
#6
yangwudong2006-05-20 16:18
哈哈,年轻啊!刚学是吧?加油啊!希望你有一个好的前途,你说的好像都不对,不过,这些都是需要经验才能明白的问题,加油啊!
#7
yangwudong2006-05-20 16:20
对了,我会在近期公布答案的
,如果有等不及的,可以跟我发信息要,我会告诉大家的!
#8
可可℃乐2006-05-21 11:24
1:String abc = new String("123");
这一句创建了一个字符串对象 传递参数123
List def = new ArrayList();
这一句创建一个数组对象.
2:每个类都有面向对象的特点,也就是OOP.
3: NULL就是空值的意思
#9
可可℃乐2006-05-21 11:26
大哥我说地对吗,我学地很菜 就这么点理解.错地地方指出啊
#10
可可℃乐2006-05-21 11:26
大哥我说地对吗,我学地很菜 就这么点理解.错地地方指出啊
#11
yangwudong2006-05-21 14:00
还是不对啊!加油,我给你发答案!
#12
iyuohz2006-05-21 16:29
1. String abc = new String("123");
new String("123") 这句话创建了一个String对象
String abc 这句话 声明了一个String的引用
List def = new ArrayList();
new ArrayList() 创建ArrayList对象
List def 声明了一个List型引用

2. java中,所有的类,都有一个最大的特点,每个类都有,你现在写一个,它一定也有!
呵呵,Object的子类

3. null是一个什么东西呢?
引用啥都没指向的时候,说它指向null

明白这些,离面向对象好像还很远呢...
#13
yangwudong2006-05-22 09:03
楼上的,你虽然挺不错,但是就答对了一个半,年轻人,不要会点基础的就狂,你答对的是最简单的那些,第二个可以说答的不错,第一个那个后面的小问题,会点java的一般都会,至于最后一个题,null的,你看清楚了问题再回答!第一个题目的地方,你答对的也只是初级水平的概念性的东西,慢慢学习吧!
#14
ada5186182006-05-22 11:37

纯属个人见解,不对之处,请不要见怪!
1,String abc = new String("123");
这里创建了一个对象,同时把对象abc指向字符串"123"的地址!也就是说对象abc引用了字符串"123"!(好象可以这么说的吧!)
而List def = new ArrayList();
一样创建了一个对象def,但是没用指明对象def的引用!
2,JAVA中Object类是顶层类,我们所编写的所有类都是它的子类,都是继承于它,都拥有它的特点!
3,NULL是什么东西?那我可真的不知道!我只到它是当我们在编程中,不知道要把对象初始化为对什么引用的时候,就可以用NULL,表示空引用!

楼主,什么时候公布答案呀!?

#15
Murray2006-05-22 21:23

1、String abc = new String("123");
=>String abc;
abc = new String("123");
public String(String value)
2个对象,一个是"123"的,一个是指向"123"的引用对象abc;
List def = new ArrayList();
欲构造ArrayList类的一个对象,def继承了List接口

2、都是Object的子类

3、null应该是表示缺省对象吧

呵呵,准备学J2EE了,看看又没资格。

#16
yangwudong2006-05-22 23:13

楼上的说的基本不错了,但是还是有点问题,这个帖子发了才几天啊!大家都答答看看吧!我准备这个星期的星期五发答案,到时候大家可以来看!

#17
iyuohz2006-05-23 08:55
以下是引用yangwudong在2006-5-22 9:03:00的发言:
楼上的,你虽然挺不错,但是就答对了一个半,年轻人,不要会点基础的就狂,你答对的是最简单的那些,第二个可以说答的不错,第一个那个后面的小问题,会点java的一般都会,至于最后一个题,null的,你看清楚了问题再回答!第一个题目的地方,你答对的也只是初级水平的概念性的东西,慢慢学习吧!

老大,我才学java没几天,而且这也不是说有啥狂的成分在里面,主要是你帖子名迷惑人,面向对象的话,多多少少也应该谈到些设计模式,连模式的边都没粘,就能开始servlet和jsp了?

List def = new ArrayList();
new ArrayList() 创建ArrayList对象
List def 声明了一个List型引用

也许是我没说明白: list应该说是集合类的接口,ArrayList 这个类是实现了这个接口的类
所以 new ArrayList() 它创建了ArrayList的对象
而 List def 声明了一个List 接口型的引用, 用来指向 那个ArrayList对象,这里面体现的是多态

不大明白,null是东西???啥东西???lz,你心中的答案是啥呢???空引用???

[此贴子已经被作者于2006-5-23 8:56:54编辑过]

#18
openclosed2006-05-23 10:22
都说第二条说的不对 我就我知道的作一下补充吧

List def = new ArrayList();
是实例化一个arraylist类 def (arraylist他是一个集合类,按照非同步线成实现的)
list是 arraylist类的一个接口
arraylist 和 vector都是为了实现list接口的类 都要执行这个接口而已 list也相当于 arraylist
vector的父类的道理
只不过 arraylist是按照非同步机制实现 效率高安全度低
vector是按照同步机制实现 效率低安全度高
#19
yangwudong2006-05-23 16:06
回复

我已经说过了,List的那个,基本学过java的都会,那个String的,你答的不好,再看看吧!至于null的那个,你看的有点局限!往开里想!再说了,不用设计模式就不能做servlet和jsp了吗?

#20
yangwudong2006-05-23 16:07
我再强调一下,第二个那个List是因为和第一个有区别,所以才列出来的,不是说那个多么的难,大家基本上都答的很好!
#21
可可℃乐2006-05-23 16:53

List def =new ArrayList();
这一句是不是说地 :定义了一个List 的一个对象 def ,可是却分配了一个ArrayList对象的内存空间.
def 是一个对象,new ArrayList()也是一个对象.
我真的快要死拉.学了好久了。这些问题还是搞不明白...

#22
yangwudong2006-05-23 17:06
你会C吗?
List def =new ArrayList();
def是在java中叫做引用,楼上的兄弟已经说过了,他就好比C中的指针,他里面存放的是一个地址,这个地址就是对象所在的地址(内存的地址)。
new ArrayList()是指的创建一个新的ArrayList的对象,java会在内存当中开辟一块内存去放他。
整个的这一句话的解释就是,创建一个默认的ArrayList的对象,然后把这个对象的地址赋给def(对象的引用),这样解释应该是挺形象的了,但是,也有不少地方的解释是创建一个ArrayList对象,然后将对象的引用--def和他关联起来!
这是第一题的第二个小题的答案!应该比较标准了吧!如果有问题,请大家提出来,谢谢!
另外,我决定今天下午公布答案了,因为可能周末的一段时间会有点事情,不能准时发答案了,所以,决定今天公布!
#23
yangwudong2006-05-23 17:21
公布答案啦!
String abc = new String("123");
这个地方应该是创建了三个对象,大家不要急,应该多试验一下,就知道了!
首先,大家都只到,"123"是一个对象,我就不用说了(注:只是一个临时对象,很快就会被java垃圾回收的)。
其次,new String()这又是创建了一个对象!这个大家应该也都知道!
最后,也就是最有难度的一个地方!String和别的类是不一样的!他的那个“abc”,不是叫做对象的引用,他也是一个对象,大家一定都没有注意过吧!你可以是一下:
String a = "123";
String b = a;
b = b + "1";
System.out.println("a: " + a);
System.out.println("b: " + b);
然后,你可以同理去试验一下其他的类!
#24
yangwudong2006-05-23 17:23
所有的类都是继承于Object这个类,因为,我们写的所有的类,最终都要生成对象这个实际的东西,所以,都是继承于Object这个类,很多人都知道答案了,但是,没有仔细的想过!
#25
yangwudong2006-05-23 17:24
最后一个题了,null,很多人都说这是一个空引用,这样的说法不太对,引用?存的是地址吗?他是一个确切的对象,如同你们写的"123"一样,也是一个对象!
#26
yangwudong2006-05-23 17:26
我的问题的回答完了,如果大家有什么不同的意见或着要给我说我那个地方说错了,大家可以一起讨论!我希望我发的这个帖子能够对大家有点帮助!
#27
yangwudong2006-05-23 17:27
对了,版主是不是应该给我加点经验了啊?我发了这么多东西了!怎么还是一个小小的游民啊!等级太低了啊!
#28
可可℃乐2006-05-23 17:29
我不会C,只学了JAVA,还很不好.
呵呵 大哥QQ留下行不,我想跟大哥好好学学...
#29
疯子java2006-05-23 18:11

呵呵
又来要经验了呀
不过答对的人确实不多的哈

哈哈哈
我也是一样的


连答都不敢答哟

#30
iyuohz2006-05-23 21:26
以下是引用yangwudong在2006-5-23 17:21:00的发言:
公布答案啦!
String abc = new String("123");
这个地方应该是创建了三个对象,大家不要急,应该多试验一下,就知道了!
首先,大家都只到,"123"是一个对象,我就不用说了(注:只是一个临时对象,很快就会被java垃圾回收的)。
其次,new String()这又是创建了一个对象!这个大家应该也都知道!
最后,也就是最有难度的一个地方!String和别的类是不一样的!他的那个“abc”,不是叫做对象的引用,他也是一个对象,大家一定都没有注意过吧!你可以是一下:
String a = "123";
String b = a;
b = b + "1";
System.out.println("a: " + a);
System.out.println("b: " + b);
然后,你可以同理去试验一下其他的类!

这段代码 ...我觉得有问题
在java里,因为String 属于较常用的东西,所以 它有两种.
一个是 new String() 另一种是 直接 ="acc" 这样的(为了运行起来速度快)
这两种,的区别 主要在于 存放的位置
acc 这个存放到了 类似 常量池(有的好像称为 字符串 池里,而且 这个里面的 字符串是没有重复的)
所以 , String a="123", 这样 是把 "123" 放到了 字符串池里,
String b=a 是说,让b也去 指向 字符串池里的 "123" 这个字符串
之后 字符串 b=b+"1" ,因为 字符串池里 没有相同的字符串,所以 会在里面新生成一个 字符串"1231",
这个时候 b 指向了这个新生成的字符串"1231",

而String abc = new String("123"); 这个就不一样了,
它是把"123" 这个放到堆里,它和放到常量池里的"123",意义不一样

所以 String abc = new String("123"); 应该就是一个引用.一个对象

在String这个类里,由于equals用来比较字符串的内容,那么用==来比较 引用

String a="123";
String b="123";
if(a==b){...你要输出的内容}
如果输出,就表示 a和b指向了相同的对象,也就是 字符串池里有个"123"字符串

同样的 可以试试
String c=new String("123");
String d=new String("123");
再去通过==去比较一下它们的引用

[此贴子已经被作者于2006-5-23 21:30:12编辑过]

#31
疯子java2006-05-24 08:57

同意楼上意见

#32
yangwudong2006-05-24 10:49
确实啊!长知识了啊!讨论了一下真好!谢谢!
#33
Murray2006-05-24 15:42
以下是引用iyuohz在2006-5-23 21:26:00的发言:

这段代码 ...我觉得有问题
在java里,因为String 属于较常用的东西,所以 它有两种.
一个是 new String() 另一种是 直接 ="acc" 这样的(为了运行起来速度快)
这两种,的区别 主要在于 存放的位置
acc 这个存放到了 类似 常量池(有的好像称为 字符串 池里,而且 这个里面的 字符串是没有重复的)
所以 , String a="123", 这样 是把 "123" 放到了 字符串池里,
String b=a 是说,让b也去 指向 字符串池里的 "123" 这个字符串
之后 字符串 b=b+"1" ,因为 字符串池里 没有相同的字符串,所以 会在里面新生成一个 字符串"1231",
这个时候 b 指向了这个新生成的字符串"1231",

而String abc = new String("123"); 这个就不一样了,
它是把"123" 这个放到堆里,它和放到常量池里的"123",意义不一样

所以 String abc = new String("123"); 应该就是一个引用.一个对象

在String这个类里,由于equals用来比较字符串的内容,那么用==来比较 引用

String a="123";
String b="123";
if(a==b){...你要输出的内容}
如果输出,就表示 a和b指向了相同的对象,也就是 字符串池里有个"123"字符串

同样的 可以试试
String c=new String("123");
String d=new String("123");
再去通过==去比较一下它们的引用


呵呵,觉得还是这位兄弟说得更准确一点
唉,答的还是不是很准确唉。。。

#34
Murray2006-05-24 15:44
呵呵,光靠这三个题目也不能看出主要问题,不的确能体现大家的知识的完整性
#35
疯子java2006-05-24 16:44

话是这么说
但是也不能反映现在的人有点浮躁哟

呵呵
有哪个继续出题大家讨论哈
这样才象个论坛嘛

不然就全部都是问问题的人了

#36
yangwudong2006-05-25 09:06
是啊是啊!我来学习了啊!^_^
#37
羊爱上了狼2006-05-25 18:42

大家去看看论坛里的文章,栈与堆的思考,就会明白第一个问题了!!object是所有类的父类,

#38
羊爱上了狼2006-05-25 18:54
>??????
#39
dreame2006-05-28 22:28
十二分同意楼上的看法
在网上看到一段String解释的不错的
摘录如下


String str=”kvill”;
String str=new String (“kvill”);的区别:

  在这里,我们不谈堆,也不谈栈,只先简单引入常量池这个简单的概念。

  常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的
一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。

  看例1:

String s0=”kvill”;
String s1=”kvill”;
String s2=”kv” + “ill”;
System.out.println( s0==s1 );
System.out.println( s0==s2 );
  结果为:

true
true
  首先,我们要知道Java会确保一个字符串常量只有一个拷贝。

  因为例子中的s0和s1中的”kvill”都是字符串常量,它们在编译期就被确定了,所以
s0==s1为true;而”kv”和”ill”也都是字符串常量,当一个字符串由多个字符串常量连
接而成时,它自己肯定也是字符串常量,所以s2也同样在编译期就被解析为一个字符串常
量,所以s2也是常量池中”kvill”的一个引用。

  所以我们得出s0==s1==s2;

  用new String() 创建的字符串不是常量,不能在编译期就确定,所以new String()
创建的字符串不放入常量池中,它们有自己的地址空间。

  看例2:

String s0=”kvill”;
String s1=new String(”kvill”);
String s2=”kv” + new String(“ill”);
System.out.println( s0==s1 );
System.out.println( s0==s2 );
System.out.println( s1==s2 );
  结果为:

false
false
false
  例2中s0还是常量池中”kvill”的应用,s1因为无法在编译期确定,所以是运行时创
建的新对象”kvill”的引用,s2因为有后半部分new String(“ill”)所以也无法在编译
期确定,所以也是一个新创建对象”kvill”的应用;明白了这些也就知道为何得出此结果
了。



String.intern():

  再补充介绍一点:存在于.class文件中的常量池,在运行期被JVM装载,并且可以扩充
。String的intern()方法就是扩充常量池的一个方法;当一个String实例str调用intern(
)方法时,Java查找常量池中是否有相同Unicode的字符串常量,如果有,则返回其的引用
,如果没有,则在常量池中增加一个Unicode等于str的字符串并返回它的引用;看例3就清
楚了

  例3:

String s0= “kvill”;
String s1=new String(”kvill”);
String s2=new String(“kvill”);
System.out.println( s0==s1 );
System.out.println( “**********” );
s1.intern();
s2=s2.intern(); //把常量池中“kvill”的引用赋给s2
System.out.println( s0==s1);
System.out.println( s0==s1.intern() );
System.out.println( s0==s2 );
  结果为:

false
**********
false //虽然执行了s1.intern(),但它的返回值没有赋给s1
true //说明s1.intern()返回的是常量池中”kvill”的引用
true
  最后我再破除一个错误的理解:

  有人说,“使用String.intern()方法则可以将一个String类的保存到一个全局Strin
g表中,如果具有相同值的Unicode字符串已经在这个表中,那么该方法返回表中已有字符
串的地址,如果在表中没有相同值的字符串,则将自己的地址注册到表中“如果我把他说
的这个全局的String表理解为常量池的话,他的最后一句话,“如果在表中没有相同值的
字符串,则将自己的地址注册到表中”是错的:

  看例4:
String s1=new String("kvill");
String s2=s1.intern();
System.out.println( s1==s1.intern() );
System.out.println( s1+" "+s2 );
System.out.println( s2==s1.intern() );
  结果:

false
kvill kvill
true
  在这个类中我们没有声名一个”kvill”常量,所以A砍刂幸豢际敲挥小眐vill”的
,当我们调用s1.intern()后就在常量池中新添加了一个”kvill”常量,原来的不在常量
池中的”kvill”仍然存在,也就不是“将自己的地址注册到常量池中”了。

  s1==s1.intern()为false说明原来的“kvill”仍然存在;

  s2现在为常量池中“kvill”的地址,所以有s2==s1.intern()为true。

#40
Murray2006-06-01 12:31
呵呵,数据结构中包含的东西太多了
#41
快乐让让2006-06-09 09:39
啊哦,好久没来了,我说的竟然全部错了~~~~
我是刚入门,第二学期一上来就接触OOP思想,昨天开始学java的web开发,里面涉及到的东西我好多都没接触过,根本反映不过来,我是在北大青鸟学习的第二学期的学生,我想问问怎么样才能完全理解面象对象的思想呢?买知识~!JAVA真的很有挑战性,希望你们大家能够多帮助我~谢谢
#42
yangwudong2006-06-09 09:44
太多了,晕了!
#43
念月思灵2006-06-09 13:12
Java,好东东啊 ,慢慢 学习 ,好好 学习 !
#44
iyuohz2006-06-09 14:38
以下是引用快乐让让在2006-6-9 9:39:16的发言:
啊哦,好久没来了,我说的竟然全部错了~~~~
我是刚入门,第二学期一上来就接触OOP思想,昨天开始学java的web开发,里面涉及到的东西我好多都没接触过,根本反映不过来,我是在北大青鸟学习的第二学期的学生,我想问问怎么样才能完全理解面象对象的思想呢?买知识~!JAVA真的很有挑战性,希望你们大家能够多帮助我~谢谢

面向对象 你在不同时期,对它的了解,体会也不相同

举个例子来说吧,请你写一个类,描述一下 月亮

初学时,可能会 迫不及待的写
class Moon{// 里面放一大堆的属性,方法}

可是现在可能会考虑一下 月亮,这个类,可以实例化一大堆的对象吗?
自然而然的会用 单例模式,
class Moon
{
private static Moon amoon=new Moon();
private Moon(){}
public static Moon getInstance(){ return amoon;}
//这时对 属性 方法,反而看的不是那么强烈了
}

对于模式的概念如果没接触的话,可以多看看api,慢慢体会
象 io 里面,对输入,输出流的操作用的装饰模式

就连在j2ee里常用的mvc模式, swing里面的 组件 基本上用的都是它,
JTable DefaultTableModel,AbstractTableModel,
当对默认的jtable不满意,可以继承 AbstractTableModel,重写里面的方法,等等等...

面向对象主要是让你的代码有弹性,个人愚见,欢迎拍砖

#45
angus_yk2006-06-11 13:42
不懂还是,这个答案和前面说的有什么不同呢,声明了一个接口的话是不是也算一个对象呀!!!
#46
yangwudong2006-06-24 21:16
new List()出来的是对象吗?想想就知道了啊!
#47
快乐让让2006-07-17 22:02
不知道。。
#48
yangwudong2006-07-20 16:34
List是一个接口,去看看api吧!
#49
快乐让让2006-07-24 15:31

呵呵,谢谢iyuobz给的解释哈,但是还是不太明白,相信以后会明白的!

#50
ysol2006-07-27 03:48

广义 oop==数据类型(包括基本数据类型)
具体 oop==抽象数据类型

That's all

不懂Java,略懂C++ 个人愚见,欢迎拍砖

#51
神vLinux飘飘2006-07-27 08:46
砖呢?砖在那里?我要拍人啊~
12