为什么java从相同的方法参数返回不同的类型?

为什么java从相同的方法参数返回不同的类型?,java,types,Java,Types,为什么我不能给数组赋值 public static void main(String[] args) { int r = 100 + (int) (Math.random()*999); // create random number from 100 to 999 int a [] = new int[String.valueOf(r).length()]; // create array with r length for(int i=0;i<a.length;

为什么我不能给数组赋值

public static void main(String[] args) {
    int r = 100 + (int) (Math.random()*999); // create random number from 100 to 999
    int a [] = new int[String.valueOf(r).length()]; // create array with r length
    for(int i=0;i<a.length;i++) {
        a[i] = String.valueOf(r).charAt(i);
        System.out.println(a[i]); // returns numbers from 48 to 57 (dec)
        System.out.println(String.valueOf(r).charAt(i)); // returns numbers from 0 to 9
    }
publicstaticvoidmain(字符串[]args){
int r=100+(int)(Math.random()*999);//创建从100到999的随机数
int a[]=new int[String.valueOf(r.length()];//创建长度为r的数组

对于(int i=0;i阅读有关“Java自动装箱和取消装箱”的内容您在标题和正文中提出了不同的问题:

为什么java从相同的方法参数返回不同的类型

System.out.println
的两个调用都接受(而不是返回)不同的类型(
char
在代码的第一个调用中,第二个调用中,
int
),因为
println
方法重载(有关重载的一般性讨论,请参阅:)

为什么我不能给数组赋值

public static void main(String[] args) {
    int r = 100 + (int) (Math.random()*999); // create random number from 100 to 999
    int a [] = new int[String.valueOf(r).length()]; // create array with r length
    for(int i=0;i<a.length;i++) {
        a[i] = String.valueOf(r).charAt(i);
        System.out.println(a[i]); // returns numbers from 48 to 57 (dec)
        System.out.println(String.valueOf(r).charAt(i)); // returns numbers from 0 to 9
    }
您当然可以将“普通数字”分配给int[]数组。但是请注意,此行:

a[i] = String.valueOf(r).charAt(i);
System.out.println(a[i]); // returns numbers from 48 to 57 (dec)
System.out.println(String.valueOf(r).charAt(i)); // returns numbers from 0 to 9

可能没有按照您的想法进行:它不是在字符串
r
中分配索引
i
处的“数字”,而是该数字的ASCII(实际上是Unicode)代码。

数组由字符的UTF-16值而不是实际数字填充。您可以使用
字符.digit(字符c,整数基数)
要获取数值,请执行以下操作:

a[i] = Character.digit(String.valueOf(r).charAt(i), 10);
“返回”的意思是“输出”。
println
不返回任何内容

输出是不同的,因为您正在调用不同的方法。在这一行:

a[i] = String.valueOf(r).charAt(i);
System.out.println(a[i]); // returns numbers from 48 to 57 (dec)
System.out.println(String.valueOf(r).charAt(i)); // returns numbers from 0 to 9
…您正在调用,它将输出存储在
a[i]
中的数值的十进制表示形式,该数值是字符的数值(例如,字符
'9'
为57)

但在这方面:

a[i] = String.valueOf(r).charAt(i);
System.out.println(a[i]); // returns numbers from 48 to 57 (dec)
System.out.println(String.valueOf(r).charAt(i)); // returns numbers from 0 to 9
…您正在调用,它将输出实际字符(例如,
'9'

你在评论中说:

例如,如果r为789,i=2,那么代码将返回9,对吗?然后我分配
a[2]=9
a[i]=String.valueOf(r).charAt(i);
),所以当我调用
a[2]
时,它必须返回存储在array的第三个元素中的
9
-值。我不需要那个数字的十进制值,我也不“说”这就是java

啊,但是你是。:-
println
被重载了-根据你给它的参数类型,它有不同的版本

当您这样做时:

a[i] = String.valueOf(r).charAt(i);
您正在获取一个
char
charAt
的返回值)并将其提升为
int
a[i]
的类型)。将
char
'9'
提升为
int
值57(该字符的数字版本)。然后

System.out.println(a[i]);
System.out.println(String.valueOf(r).charAt(i));
a[i]
int
)的类型决定了调用哪个
println
println(int)
println(int)
输出给定数字的十进制表示:57

当你这样做的时候

System.out.println(a[i]);
System.out.println(String.valueOf(r).charAt(i));

String.valueOf(r).charAt(i)
的类型是
char
(返回类型是
charAt
),因此您可以调用
println(char)
println(char)
输出您给它的字符,
'9'

第一个在存储在
int
中时打印
char
整数值,第二个在直接访问重载
println
时打印
char
本身。重载函数必须在算术或数据类型上有所不同es.@nikolay不是,您只需将
char
int
值存储在
int[]
,对于
char->int
转换。对于从
System.out.println
调用打印
char
本身的第二秒,函数族的成员都返回void!是的,我指的是输出.In
String.valueOf(r).charAt(i);
返回相同的数据。例如,如果r为789,i=2,那么代码将返回9,对吗?然后我分配一个[2]=9(
a[i]=String.valueOf(r).charAt(i);
),所以当我调用[2]时,它必须返回存储在array第三个元素中的9-值。我不需要那个数字的十进制值,我也不“说”尼古拉:相同的数据,是的;但类型不同。我在答案中添加了解释。烹饪过吗?大蒜-相同的成分-但味道不同,取决于是磨碎还是切碎…我尝试了
a[I]=(char)String.valueOf(r).charAt(I);
但没有意义,因为我把
System.out.println((char)a[I])
输出返回了一个字符中的[i]整数值。@nikolay:a[i]=(char)String.valueOf(r).charAt(i);
没有任何作用;
String.valueOf(r).charAt(i)
的值已经是一个
字符了。这是分配给
a[i]的行为
这就是促销。
System.out.println((char)a[i]);
调用
println(char)
,因为您已经将参数的类型从
int
更改为
char
(如果不想转换为
int
,为什么不首先为
a
使用
char[/code>)