Is String a class or data type or both?

时间:2017-12-18 08:09:29

标签: java c#

When we use [tableView registerNib:[UINib nibWithNibName:@"itemCell" bundle:nil] forCellReuseIdentifier:@"itemCell"]; Now is String X="apple"; variable or object? As we can use X hence it should be object only but to define an object we should use: X.Method But we did like String X= new String (); So how come String X = "apple"; is an object or even if it is variable then how can we use variable.method?

5 个答案:

答案 0 :(得分:2)

A Java String is simply a class - BUT as the JavaDoc documentation of String states: "..All string literals in Java programs, such as "abc", are implemented as instances of this class..."

So the language literal "abc" is another way of saying String.create("abc") if there would be such a method. The compiler itself manages these literals. So for example ("abc"=="abc") is true, but (new String("abc")==new String("abc")) is false. That's why, in Java, you always need to use equality operator to test x.equals(y)

See also What is the difference between "text" and new String("text")?

答案 1 :(得分:1)

虽然C#和Java在处理String的方式上有很大不同,但您在两种语言中的答案非常相似。

  

现在是X变量还是对象?

X在技术上是一个变量引用存储到String对象。它引用的字符串对象是字符串"apple"

  

那么为什么X是一个对象,或者即使它是可变的,那么我们如何使用variable.method呢?

某些东西是否是某个对象并不取决于您是如何创建它的。 ,你可以使用new String(...)创建一个字符串,它也是一个对象。使用字符串 literal 和调用字符串构造函数之间的区别在于,使用字符串文字将从字符串池中获取字符串,而不是创建全新的字符串。

您是否能够使用variable.method并不取决于它是否是某个对象。 "对象"的概念确实是由语言规范指定的。

在C#中,引用类型的实例是对象,因此string(引用类型)实例也是对象。在Java中,类实例和数组是对象。 String是一个类,因此它的实例(如"apple")就是对象。

如果你想看到"对象"的定义在每种语言中,这里有一些你可以找到的地方。

  • JLS第4.3.1节
  • C#语言规范第1.3节

答案 2 :(得分:0)

X是一个变量。在Java和C#中,String类型是引用类型,因此X是一个变量,它是一个引用。在该引用的末尾是一个类型为String对象,其内容为"apple"。当我们执行X.Method时,这意味着“取消引用变量X以获取对象,并在对象上调用Method方法”。

这是所有参考类型的工作方式。

  

但要定义一个我们应该使用的对象:String X = new String();

不,这是实例化对象的熟悉的方式,但是有一些额外的编译器语法可以在使用String时更加方便,并可能添加“实习”以便您不要分配超过必要的String个对象。在C#中。例如,string x = "apple";将变为(在MSIL中):

ldstr "apple"
stloc.0

其中ldstr是一个特殊的IL指令,用于通过自动实习加载常量。如果我们基于字节缓冲区而不是编译时常量创建String,则String不同的构造函数

答案 3 :(得分:0)

您的问题有不同的问题和缺点:

  1. 正如其他人所说,String是有区别的 用Java和C#处理。
  2. 另一点是你问的是String是一个对象还是一个 变量,但这两者并不相互排斥。对象是 变量,但它们是用户定义类型的实例,即类 或结构,其中通常也可以内置变量 类似intfloat ...
  3. 的类型
  4. 在C#中,内置类型也可以有方法。所以这不是一个 用于区分内置类型和用户定义的属性 类型。
  5. string是内置类型,它是预定义类型System.String的别名。但string不是简单类型,例如intfloat。有关详细信息,请参阅here
  6. String X = "apple";在C#中以特殊方式编译:有 一个IL指令,允许在C#中为文本分配一个文字 对象引用(这里是X)。这条IL指令是Ldstr 将新对象引用推送到存储在其中的字符串文字 元数据。欲了解更多信息: https://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes.ldstr.aspx

答案 4 :(得分:-1)

首先,它取决于平台到平台,但你可以说它是本机字符串或表示字符串的类的包装。