静态语言和动态语言的区别

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.心得

失败是什么?没有什么,只是更走近成功一步;成功是什么?就是走过了所有通向失败的路,只剩下一条路,那就是成功的路。

原文地址:https://www.cnblogs.com/nanren/p/13555545.html