上面的代码为什么不能为下面这个样子: m_TextView.setText(String("输入内容:") + s);这个要结合m_TextView.setText和String吧, m_TextView.setText带一个参数的只有连个重载函数,一个是int型的字符串id,一个是CharSequence类型 final void setText(int resid) final void setText(CharSequence text) Sets the string value of the TextView. String("输入内容:") + s 先生成一个String对象,在执行setText,或许可以 String str = String("输入内容:") + s;String对象本身是不可变的,执行+操作会生成一个新的String对象。 关于String与new String对象的区别楼主可以参考一下==与equals()的区别 http://blog.csdn.net/ameyume/archive/2010/08/16/5815756.aspx其他就不明白了,期待高人
m_TextView.setText(String("输入内容:") + s);
ANS:字符串不需要强转。但这个样子又可以:
m_TextView.setText(new String("输入内容:") + s);
ANS:new String会放回一个String的对象,setText函数的参数就是CharSequence类型,它是一个interface,String类implements这个接口。String类不是有如下的构造函数吗?
String(char[] data)
ANS:有,但是如果你以为你这么写可以,那就成C++了,再说了,C++的string也不需要强转的。你什么时候见过CString("hello"),MFC里这种写法?
记得java里面的对象都是new的,或者是别人给的(引用类型,比如findViewById),那么String这个对象为什么可以不new,还有其它和String一样神奇的类吗(int之类不用说,就我所知,Integer类似的类也是不需要new的)?
ANS:java的String和C++里的CString很像,只不过java里没指针而已,其实也是地址,只不过没有指针那样的写法。Integer类还有Float,Boolean等,是JAVA自己做的装箱,封装了一些方法而已,具体的也要看JDK。
m_TextView.setText(String("输入内容:") + s);这个要结合m_TextView.setText和String吧,
m_TextView.setText带一个参数的只有连个重载函数,一个是int型的字符串id,一个是CharSequence类型
final void setText(int resid)
final void setText(CharSequence text)
Sets the string value of the TextView. String("输入内容:") + s
先生成一个String对象,在执行setText,或许可以
String str = String("输入内容:") + s;String对象本身是不可变的,执行+操作会生成一个新的String对象。
关于String与new String对象的区别楼主可以参考一下==与equals()的区别
http://blog.csdn.net/ameyume/archive/2010/08/16/5815756.aspx其他就不明白了,期待高人
m_TextView.setText(String("输入内容:") + s) ;String("输入内容:") 这句的意思是括号里的内容强制转换成String类型的, 但""中的内容就是铁打的String类型, 所以跟本不用强转, 再说了, 你用一个 字符串 + 任何对象或变量, 那么这个 (字符串 + 任何对象或变量) 这整个就一定是String类型, 所以 与String(char[] data) 一点关系都没有,
m_TextView.setText((String) "输入内容:" + s);才是强转,这是没问题的。String("输入内容:");并不是强转,而是生成一个匿名对象。疑问是,为什么
new String("输入内容:")行而String("输入内容:")不行,就我的理解,他们除了分配位置不同之外,语法上并没有区别。在c++的世界里,CString("hello")是非常合法的写法。dinjay可以试试,比如
AfxMessageBox(CString(_T("hello")));
new String("输入内容:");
你们说它的对象名是什么?问题的疑点是,new String("输入内容:");和String("输入内容:");区别在哪里(分配位置上的区别就不说了,我说的是语法上的)?
new String("输入内容:");
你们说它的对象名是什么?返回的是String的对象。问题的疑点是,new String("输入内容:");和String("输入内容:");区别在哪里(分配位置上的区别就不说了,我说的是语法上的)?
m_TextView.setText(String("输入内容:") + s);这样的语法没问题,可以用。至于你说的区别,就是在堆和栈的问题。一个是栈常量,一个是堆上数据。在c++的世界里,CString("hello")是非常合法的写法。dinjay可以试试,比如
AfxMessageBox(CString(_T("hello")));
你会这么写么?100个人中估计没有人这么写。
{
...
AfxMessageBox(CString("1234:") + pText);
}上面的实例中,你觉得要怎样写呢?
"1234:" + pText
这种写法大家都知道是不行的,这在c++里面不具备语义。上面我写的是最为优美的写法,当然还有其它的,比如:
CString str = "1234:";
str += pText;
等等。说到匿名对象,我觉得大家的理解还是有问题,
new String("输入内容:");
返回的是一个匿名对象,而并不是返回String,String是类名,不是对象名,比如:
String String = new String("输入内容:");
这才是返回了String,可异这显然通不过编译。匿名对象应用很广泛,在java里面也是,比如
m_EditText.addTextChangedListener(new TextWatcher() {
...
});这里就是一个典型的匿名对象,它的类型的TextWatcher,但没有名字,匿名对象有一个典型特点就是,不能多次的调用,比如上面new的那个TextWatcher,在本Activity里面,是永远不可能再调用了(只能被回调,那是因为回调者保存了匿名对象,所以在调用者那边,这个匿名对象不再是匿名对象了),因为没有名字,大多数编程语言中,名字意味着地址,而类名只是给编译器看的罢了。
这就写就是不行,我在顶楼已经说了,正是因为这个不行,我才来发贴的。
包括下面的也不行:
String str = String("输入内容:");楼上的可以试试。
注:我是在eclipse3.6.1里面开发android应用而遇到这个问题的,我想只要都是java,不同的环境应该不影响吧?