1. 程式人生 > 實用技巧 >靜態語言和動態語言的區別

靜態語言和動態語言的區別

1.執行環境

jdk1.8.0_77 Intellij IDEA2018.3 x64

2.基本概念

1)靜態語言(強型別語言)

靜態語言是在編譯時變數的資料型別即可確定的語言,多數靜態型別語言要求在使用變數之前必須宣告資料型別。
例如:C++、Java、Delphi、C#等。

2)動態語言(弱型別語言)

動態語言是在執行時確定資料型別的語言。變數使用之前不需要型別宣告,通常變數的型別是被賦值的那個值的型別。
例如PHP/ASP/Ruby/Python/Perl/ABAP/SQL/JavaScript/Unix Shell等等。

3)強型別定義語言

強制資料型別定義的語言。也就是說,一旦一個變數被指定了某個資料型別,如果不經過強制轉換,那麼它就永遠是這個資料型別了。舉個例子:如果你定義了一個整型變數a,那麼程式根本不可能將a當作字串型別處理。強型別定義語言是型別安全的語言。

4)弱型別定義語言

資料型別可以被忽略的語言。它與強型別定義語言相反, 一個變數可以賦不同資料型別的值。強型別定義語言在速度上可能略遜色於弱型別定義語言,但是強型別定義語言帶來的嚴謹效能夠有效的避免許多錯誤

3.兩者區別

1)特性

強型別語言是一旦變數的型別被確定,就不能轉化的語言。
弱型別語言則反之,一個變數的型別是由其應用上下文確定的。

2)靜態語言的優勢

  1. 由於型別的強制宣告,使得IDE有很強的程式碼感知能力,故,在實現複雜的業務邏輯、開發大型商業系統、以及那些生命週期很長的應用中,依託IDE對系統的開發很有保障;
  2. 由於靜態語言相對比較封閉,使得第三方開發包對程式碼的侵害性可以降到最低;

3)動態語言的優勢

    1. 思維不受束縛,可以任意發揮,把更多的精力放在產品本身上;
    2. 集中思考業務邏輯實現,思考過程即實現過程;

4.程式碼展示

public static void main(String[] args) {
String s=new String("hello");
//1.getClass()
Class clz=s.getClass();
System.out.println("類名:"+clz.getName());
System.out.println("包名:"+clz.getPackage());
System.out.println("是否為介面:"+clz.isInterface());
System.out.println("是否為陣列:"+clz.isArray());
System.out.println("String類的父類:"+clz.getSuperclass());

//2.Class
Class clz2=s.getClass();
System.out.println("類名:"+clz2.getName());
System.out.println("包名:"+clz2.getPackage());
System.out.println("是否為介面:"+clz2.isInterface());
System.out.println("是否為陣列:"+clz2.isArray());
System.out.println("String類的父類:"+clz2.getSuperclass());

//3.ForName
Class clz3;
try {
clz3=Class.forName("demo1.demo1");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}

//4.int
Class intClz=int.class;

//4.ClassLoader
try {
Class clazz4=ClassLoader.getSystemClassLoader().loadClass("java.lang.String");
System.out.println("clazz4:"+clazz4.getName());

System.out.println(clz==clazz4);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}

===============================================================================================
public static void main(String[] args) {
//1.getClass()
String s = new String("hello");
Class clazz = s.getClass();

//2..class
Class clazz2 = String.class;

//3.Class.forName();
Class clazz3 = null;
try {
clazz3 = Class.forName("java.lang.String");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}

//4.ClassLoder()
Class clazz4 = null;
try {
clazz4 = ClassLoader.getSystemClassLoader().loadClass("java.lang.String");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
System.out.println(clazz == clazz2);
System.out.println(clazz == clazz3);
System.out.println(clazz == clazz4);
System.out.println(clazz3 == clazz4);

//3Class.forName()
Class clzdemo2 = null;
try {
clzdemo2 = Class.forName("demo1.demo2");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}

//4.ClassLoader.
Class clzdemo22 = null;
try {
clzdemo22 = ClassLoader.getSystemClassLoader().loadClass("java.lang.String");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
System.out.println(clzdemo2 == clzdemo22);
System.out.println(clzdemo2.getName());
System.out.println(clzdemo2.getSimpleName());
System.out.println(clazz.getSigners());
}
public String[] test(){
System.out.println("test");
String[] arr={"a","b","c"};
return arr;
}

===========================================================================
public static void main(String[] args) {
student student=new student();
Class clzstu=student.getClass();
Field[] fields=clzstu.getDeclaredFields();
System.out.println(Arrays.toString(fields));
try {
Field field=clzstu.getDeclaredField("name");
System.out.println("field = " + field);
Field[]fields1=clzstu.getDeclaredFields();
System.out.println("fields1 = " + fields1);
System.out.println(Arrays.toString(fields1));
try {
Method method=clzstu.getMethod("test",String.class);
System.out.println("method = " + method);

Method[]method2=clzstu.getMethods();
System.out.println("method2 = " + method2);
System.out.println(Arrays.toString(method2));
System.out.println("=======================================");
Method[]method3=clzstu.getDeclaredMethods();
System.out.println("methods:"+Arrays.toString(method3));

int num=clzstu.getModifiers();
System.out.println("num = " + num);

Constructor constructor=clzstu.getConstructor(String.class);
System.out.println("constructor = " + constructor);

Constructor[] constructors=clzstu.getConstructors();
System.out.println("constructor1 = " + constructors);
System.out.println("=======================================");
System.out.println(Arrays.toString(constructors));

Constructor[] constructors1=clzstu.getDeclaredConstructors();
System.out.println("=======================================");
System.out.println(Arrays.toString(constructors1));

} catch (NoSuchMethodException e) {
e.printStackTrace();
}
} catch (NoSuchFieldException e) {
e.printStackTrace();
}


5.執行結果

類名:java.lang.String
包名:package java.lang, Java Platform API Specification, version 1.8
是否為介面:false
是否為陣列:false
String類的父類:class java.lang.Object
類名:java.lang.String
包名:package java.lang, Java Platform API Specification, version 1.8
是否為介面:false
是否為陣列:false
String類的父類:class java.lang.Object
clazz4:java.lang.String
true

---------------------------------------------------------------------------------------------------------------------

true
true
true
true
false
demo1.demo2
demo2
null

------------------------------------------------------------------------------------------------------------------

[private java.lang.String demo2.student.name, private int demo2.student.age]
field = private java.lang.String demo2.student.name
fields1 = [Ljava.lang.reflect.Field;@74a14482
[private java.lang.String demo2.student.name, private int demo2.student.age]
method = public void demo2.student.test(java.lang.String)
method2 = [Ljava.lang.reflect.Method;@677327b6
[public java.lang.String demo2.student.toString(), public java.lang.String demo2.student.getName(), public void demo2.student.setName(java.lang.String), public void demo2.student.test(java.lang.String,int), public void demo2.student.test(java.lang.String), public int demo2.student.getAge(), public void demo2.student.setAge(int), public void demo2.student.pipi(), public final void java.lang.Object.wait() throws java.lang.InterruptedException, public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException, public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException, public boolean java.lang.Object.equals(java.lang.Object), public native int java.lang.Object.hashCode(), public final native java.lang.Class java.lang.Object.getClass(), public final native void java.lang.Object.notify(), public final native void java.lang.Object.notifyAll()]
=======================================
methods:[public java.lang.String demo2.student.toString(), public java.lang.String demo2.student.getName(), public void demo2.student.setName(java.lang.String), public void demo2.student.test(java.lang.String,int), public void demo2.student.test(java.lang.String), public int demo2.student.getAge(), public void demo2.student.setAge(int), private void demo2.student.gege(), public void demo2.student.pipi()]
num = 1
constructor1 = [Ljava.lang.reflect.Constructor;@14ae5a5
=======================================
[public demo2.student(), public demo2.student(java.lang.String,int)]
=======================================
[public demo2.student(), public demo2.student(java.lang.String,int)]

6.心得

失敗是什麼?沒有什麼,只是更走近成功一步;成功是什麼?就是走過了所有通向失敗的路,只剩下一條路,那就是成功的路。