是否有任何其他方式改变一变量的类型,在一个静态语言喜欢Java和C++,除了'铸'?

我试图找出是什么主要区别在实际方面之间的动态和静态的打字和继续寻找非常学术定义。我不知道是什么意思什么我的代码看起来像。

有帮助吗?

解决方案

确保你不会静与.动态的打字混淆强与弱。

  • 静态键入:每个变量,方法参数,返回的类型等。有一种类型已知在汇编时,无论是宣布或推断的。
  • 动态键入:类型的忽视/不存在编制时间
  • 强打字:每个物体在运行时具有特定的类型,只能执行这些行动对它的定义对于这类型。
  • 弱键入:运行时的对象,既没有明确的类型,或者系统的尝试以自动转换类型,无论有必要的。

这两个对立的,可以结合自由:

  • Java是静态和强类型
  • C是静态和弱类型(指针算术!)
  • 红宝石是动态和强类型
  • JavaScript是动态和弱类型

Genrally,静的打字意味着一个很大的错误是抓的编译器是运行中的错误类型的一个动态的语言,但它还意味着你花了很多时间去担心类型,在许多情况下不必要地(见的接口与鸭打字).

强打字意味着,任何转换的类型之间必须明确,无论是通过一个铸造或通过使用转换方法(例如分析一串成一个整数)。这意味着更多的打字工作,但是具有优势的保持你在控制的东西,而弱打字往往会导致混乱,当本系统并一些不起眼的隐性转换,让你有一个完全错误的变量值,导致严重破坏的十个方法的呼吁。

其他提示

在C ++ / Java中,您无法更改变量的类型。

静态类型:变量在编译类型中分配了一种类型且不会更改。

动态类型:变量的类型可以在运行时更改,例如在JavaScript中:

js> x="5" <-- String
5
js> x=x*5 <-- Int
25

主要区别在于,在动态类型语言中,除非在该运行时使用方法,否则您不知道该方法是否存在。在静态类型语言中,检查是在编译时进行的,如果方法不存在,编译将失败。

  

我想知道我的代码是什么意思。

类型系统不一定会对代码看起来有什么影响,例如:静态类型,类型推断和隐式转换(例如Scala)的语言看起来很像动态类型语言。另请参阅:在辩论类型系统之前需要了解的信息

您不需要 显式投射。在许多情况下,隐式投射有效。

例如:

int i = 42;
float f = i; // f ~= 42.0
int b = f;   // i == 42

class Base {
};

class Subclass : public Base {
};

Subclass *subclass = new Subclass();
Base *base = subclass;  // Legal

Subclass *s = dynamic_cast<Subclass *>(base); // == subclass.  Performs type checking.  If base isn't a Subclass, NULL is returned instead.  (This is type-safe explicit casting.)

但是,您无法更改变量的类型。但是,您可以在C ++中使用联合来实现某种动态类型。

让我们看一下Java,因为他是动态类型的语言和JavaScript。在Java中,对于对象,变量是对对象的引用。该对象具有运行时类型,并且引用具有类型。引用的类型必须是运行时对象的类型或其祖先之一。这就是多态性的工作原理。您必须强制转换为引用类型的层次结构,但不能向下。编译器确保满足这些条件。在像JavaScript这样的语言中,你的变量就是变量。你可以让它指向你想要的任何物体,在你检查之前你不知道它的类型。

对于转换,有很多方法,比如Java中的toInteger和toFloat进行转换,并生成具有相同相对值的新类型的对象。在JavaScript中也有转换方法,但它们也会生成新对象。

无论您是否使用静态类型语言,您的代码在行为上看起来都不会有太大差异。仅仅因为您可以使用动态类型语言更改变量的数据类型,并不意味着这样做是个好主意。

例如,在VBScript中,匈牙利表示法通常用于指定变量的首选数据类型。这样,您可以轻松发现代码是否是混合类型。 (这不是匈牙利符号的原始用法,但它非常有用。)

通过保持相同的数据类型,您可以避免很难分辨代码实际执行的情况以及代码无法正常工作的情况。例如:

Dim id
id = Request.QueryString("id") ' this variable is now a string
If id = "42" Then
  id = 142 ' sometimes turned into a number
End If
If id > 100 Then ' will not work properly for strings

使用匈牙利表示法,您可以找到混合类型的代码,例如:

lngId = Request.QueryString("id") ' putting a string in a numeric variable

strId = 42 ' putting a number in a string variable
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top