为什么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!是的,我指的是输出.InString.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>)