我正在lynda.com上学习一门java课程,如果你想缩短变量,本课程将解释如何“演员”变量。
WIDENING:扩大变量使其变大(例如int int1 = 4030; long long1 = int1;)
缩短:缩短变量使其变小,并需要特殊的语法。 (例如int int2 = 5024; short int3 =(short)int2;)。
所以,我的问题是,为什么有人想要这样做?有什么好处?如果你知道你需要在某个时候扩展变量,你为什么不把它作为那个变量启动呢?如果缩短,为什么还要将数据类型设置得更小?如果您认为它可以像这样使用:
byte byte1 = 127;
byte1++;
if (byte1 > 127) {
short short1 = byte1;
}
(我知道这会给出错误信息,但你会得到一个粗略的想法。)
你可以这样做,但为什么呢?它不会保存数据,因为它只会添加更多行代码来占用数据。
答案 0 :(得分:0)
您可能希望“缩短”变量有几个原因。
一个是您正在使用的API或库要求传递的数据类型比您在代码中使用的类型“更短”。
另一个是节省空间。例如,如果我只需要存储一个两位数的数字,那么使用long
将是一种过度杀伤,因为它将使用比所需更多的系统内存。这通常不需要担心太多,但它可能是某些系统或大型项目的问题。
可能还有更多原因;这只是几个例子。
答案 1 :(得分:0)
想象一下,您想要实现min(...)
方法来计算两个数字的最小值。你可以简单地写:
public static double min(double lhs, double rhs) {
if (lhs >= rhs) {
return (lhs);
}
// else if (rhs > lhs) {
return (rhs);
// }
并通过自动转换(或您称之为“扩展”),您可以使用Java中的所有基元调用此方法。然而,缺点是结果始终为double
,如果您想将其保存为int
,则必须向下转换结果:
int i1 = 0;
int i2 = 100;
int max = (int) max(i1, i2);
如果方法返回int
iff会很好。这两个参数都是int
,long
iff。一个parapeter是long
,另一个参数是long
或int
,依此类推。这将导致以下代码 1 :
public static int min(int lhs, int rhs) {
if (lhs >= rhs) {
return (lhs);
}
// else if (rhs > lhs) {
return (rhs);
// }
}
public static long min(long lhs, long rhs) {
if (lhs >= rhs) {
return (lhs);
}
// else if (rhs > lhs) {
return (rhs);
// }
}
public static float min(float lhs, float rhs) {
if (lhs >= rhs) {
return (lhs);
}
// else if (rhs > lhs) {
return (rhs);
// }
public static double min(double lhs, double rhs) {
if (lhs >= rhs) {
return (lhs);
}
// else if (rhs > lhs) {
return (rhs);
// }
}
然后你可以写:
int i = 0;
long g = 1L;
float f = 2f;
double d = 3.0;
int intMax = max(i, i);
long longMax = max(i, g);
float floatMax = max(i, f);
double doubleMax = max(l, d);
通过自动展示和method overloading,最具体的方法将被称为 2,3 。
1 您还要为byte
,short
和char
编写这些方法。我不建议这样做,因为Java中的所有arithemtic操作至少返回int
类型的某些内容(例如byte + byte
将返回int
)。这是因为JVM不知道原语boolean
,char
,byte
和short
,它们被表示为int
(参见JLS §2.11.1)。子>
2 确切行为在JLS, §15.12.2.5
中指定 3 这实际上与java.lang.Math
实现min(...)
的机制相同,其实现略有不同。
答案 2 :(得分:0)
如果您必须将从您无法控制的功能收到的值传递到另一个无法控制的功能中,您绝对不能避免这种情况:
包abc.def:
public class Foo {
public static long foo() { ... }
}
打包xyz.qwerty:
public class Bar {
public static void bar(int n) { ... }
}
您的代码:
import xyz.qwerty.Bar;
import abc.def.Foo;
...
Bar.bar((int)Foo.foo());
在Foo.foo()
之前,可能会有暂时保留从Bar.bar()
收到的值的中间变量,但这并不能消除从一种类型转换为另一种类型的必然需求,这必然会发生介于两者之间。