1.5中, 象这样的语句怎么编译不过了? StringBuffer buf = new StringBuffer();
buf.append("fffff");
buf.append("test").append("asdfasdfasf"); 提示: the AbstractStringBuffer is not visible !但是1.4肯定是可以的
buf.append("fffff");
buf.append("test").append("asdfasdfasf"); 提示: the AbstractStringBuffer is not visible !但是1.4肯定是可以的
但我先编译的方式是在Eclipse里面, 其他的都编译没问题, 有点奇怪
看看源代码是怎么写的。
public synchronized StringBuffer append(String str) {
if (str == null) {
str = String.valueOf(str);
} int len = str.length();
int newcount = count + len;
if (newcount > value.length)
expandCapacity(newcount);
str.getChars(0, len, value, count);
count = newcount;
return this;
}增加之后将this返回,意味着 xxx.append("xxx").append()是不会错的(而且这也是设计者的用途)。
再看看构造函数。
public StringBuffer() {
this(16);
} public StringBuffer(int length) {
value = new char[length];
shared = false;
}
这意味即使new 一个空的stringbuffer也没有问题。排除了这些 ,那看看他的继承树。
public final class StringBuffer
implements java.io.Serializable, CharSequence
它的直接上司是object
根本没有 AbstractStringBuffer 这个 东西 。
所以可以肯定你用的不是jdk中的stringbuffer,
请检查你的代码。
将这样改了之后应该不会报错了吧?
java.lang.StringBuffer buf = new java.lang.StringBuffer();
另外, Eclipse提示出错的位置在 buf.append("test").append("asdfasdfasf");
此句上, 如果改成
buf.append("test"); buf.append("asdfasdfasf"); 就没问题, 如果改用JDK1.4也可以, 我的 java version "1.5.0_04"
Eclipse 是 Version: 2.1.0谢谢!
eclipse版本这么低能支持1。5?
又快又好用,耗内存还小
{
public static void main(String []args)
{
StringBuffer buf = new StringBuffer();
buf.append("fffff");
buf.append("test").append("asdfasdfasf");
System.out.println(buf.toString());
}
}结果是:ffffftestasdfasdfasf这个程序没问题,我在Eclipse里试了,前面的就是,我用的也是1.5.04,但Eclipse 是3.1
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
{
..... public synchronized StringBuffer append(String str) {
super.append(str);
return this;
}}AbstractStringBuffer的定义是:abstract class AbstractStringBuilder implements Appendable, CharSequence {
}越来越奇怪了...
doc下不了,在线的doc没有更新。
http://java.sun.com/j2se/1.5.0/docs/api/index.html
里面的 stringbuffer 还没有长大成 1.5的。
那也没有关系可是有些迷惑。
代码分析还是如下。
只不过是加了一层而已。
大致的看了一下源代码,似乎是把空间申请修改部分封装到 AbstractStringBuilder。
AbstractStringBuilder中有一个这样的方法。
public AbstractStringBuilder append(String str) {
if (str == null) str = "null";
int len = str.length();
if (len == 0) return this;
int newCount = count + len;
if (newCount > value.length)
expandCapacity(newCount);
str.getChars(0, len, value, count);
count = newCount;
return this;
}在 StringBuffer.java中如斯用:
public synchronized StringBuffer append(String str) {
super.append(str);
return this;
}
还是返回 this指针,按理来说是效果和1.4是一样的。
这个地方让人郁闷。 同名同参数不同返回类型的函数,编译居然能通过。
有悖于编程习惯,会让人误以为可以用 同名同参数不同返回类型的函数覆盖父类的方法 。
作了下测试:
/////////
public abstract class T1
{
public T1 a(int i)
{
i++;
return null;
}
}
/////////
/////////
public class Test extends T1
{
public Object a(int i)
//public T1 a(int i) //将该行注释掉即编译就通过了
{
return null;
}
}/////////
后来想了想,推测是编译器自动作了向上的类型转化。才不报错。
( :< 在c++里也有这种情况。)
不知道这又将是sun要鼓吹的新的编程否?我很不喜欢这种风格,破坏了美感。楼主的问题在 1.5 中没有出现。理论上也不可能出现的。我觉的还是楼主的编译环境有问题。也许某些class的版本过老?
有一个 方法可以测试。运用反射机制。在有问题的编译环境下查看该类。
如果有空的话再贴出代码吧 。今天到此先。
buf.append("test");
buf.append("asdfasdfasf");
这种情况下编译能通过,是吗?加上一句
Class sbClass = buf.getClass();
System.out.println("SuperClass: " + sbClass.getSuperclass().getName());
看看结果是什么?
buf.append("asdfasdfasf");
这种方式可以编译的,
下面程序输出是:
class: java.lang.StringBuffer
SuperClass: java.lang.AbstractStringBuilder
ffffftestasdfasdfasf
public class Hello { public static void main(String[] args) throws Exception { // java 1.5 buf ???
StringBuffer buf = new StringBuffer();
buf.append("fffff");
//buf.append("test").append("asdfasdfasf"); // this cannot compile in Eclipse
buf.append("test");buf.append("asdfasdfasf"); // this can compile
Class sbClass = buf.getClass();
System.out.println("class: " + sbClass.getName());
System.out.println("SuperClass: " + sbClass.getSuperclass().getName());
System.out.println(buf.toString());
}
}
这是拷贝的还是笔误阿? (AbstractStringBuffer)
难道它们不在同一个包下面?
Class sbClass = (buf.append("test2")).getClass();
System.out.println("class: " + sbClass.getName());
这样构造看看,也许会有惊喜,呵呵