为什么我不能做 char c = 'A'; c.toLowerCase() 而不是必须做 Character.toLowerCase(c);

Why can't I do char c = 'A'; c.toLowerCase() and instead have to do Character.toLowerCase(c);

为什么只有这样

char c = 'A';
Character.toLowerCase(c);

而不是..

char c = 'A';
c.toLowerCase();

我觉得这很令人困惑,不知道在哪里可以找到有关为什么会发生这种情况或为什么有必要的更多信息。

tl;博士

char类型是原始类型,原始类型没有方法。

此外,char 已过时。使用单个字符时,请使用 代码点 整数。

Character.toString(
    Character.toLowerCase(    // Takes a code point integer number.
        "A".codePointAt( 0 )  // Annoying zero-based index numbering.
    )                         // Returns another code point integer number.
)                             // Returns a `String` containing a single character.

a

原始与Object

你说:

I find this very confusing

你需要了解Java中两类类型的区别:

  • 原始
  • object

你说:

where I can find more information

请参阅 Oracle 免费提供的 Java 教程。参见 Primitive Data Types and What is an Object?

search Stack Overflow 表示“java 原始”。

只有 object 有方法

char 类型是原始类型。所以它没有方法。只有 object 有方法。

Character class provides a static method toLowerCasechar 原始值作为参数。

您问的是:

why it's necessary

原语并不 object-oriented. Primitives were originally included in Java to make porting of C 代码更容易,这在当时被认为是非常重要的能力。

char 已过时

你应该知道 char 类型从 Java 2 开始就已经过时了,从 Java 5 开始就已经过时了。作为一个 16 位值,char 是身体上无法代表大多数角色——基本上是坏的。

代码点

改为使用 code point 整数。

拉丁文大写字母 A 的代码点为十进制 65,41 hexadecimal

获取字符的代码点。

int codePoint = "A".codePointAt( 0 ) ;

获取包含代码点字符的 String

String s = Character.toString( codePoint ) ;

获取由其代码点表示的字符的小写版本。

int lowerCaseCodePoint = Character.toLowerCase( codePoint ) ;
String lowerCaseLetter = Character.toString( lowerCaseCodePoint ) ;

转储到控制台。

System.out.println( "codePoint: " + codePoint ) ;
System.out.println( "s: " + s ) ;
System.out.println( "lowerCaseCodePoint: " + lowerCaseCodePoint ) ;
System.out.println( "lowerCaseLetter: " + lowerCaseLetter ) ;

看到这个 code run live at IdeOne.com

codePoint: 65
s: A
lowerCaseCodePoint: 97
lowerCaseLetter: a