• 初识Java


    上一期中我们聊到的面向对象的演进过程的3个发展阶段在Java中得到很好的体现,本期我就带着大家领略下Java世界的多姿多彩!

    Write Once,run anywhere

    为了让Java能够实现跨平台,Java的发明者们增加了一个抽象层,即JVM(Java Virtual Machine,Java虚拟机),自定义一套指令并且和硬件无关,为每个操作系统实现一套JVM,通过JVM实现了Java的跨平台。需要注意的是目前有很多语言都是在JVM上实现的,例如Scala、Groovy、Clojure、JRuby、Jython等,这些语言通过映射到JVM的指令集上就实现了在JVM上运行。
    image.png

    JRE和JDK之间的关系?

    JRE(Java Runtime Environment),可以认为就是JVM;JDK(Java Development Kit)是Java开发工具包,它包含javac、jar、JRE,所以JDK是包含jre。
    image.png

    Java SE,Java EE ,Java ME之间是什么关系?

    Java SE(Standard Edition,标准版),它提供了Java API;Java EE(Enterprise Edition,企业版),它包含Web相关技术(Jsp、servlet、jdbc、ebj、jtc);Java ME(Mobile Edition,移动版),考虑到SE需要很多计算机的资源,因此ME使用了SE部分功能,它在Iphone和安卓出来之前,Java ME是很火的,目前基本没人在用了。
    image.png

    注解(Annotation)

    注解可以改变类型的定义,例如现在比较有名的lombok,它在编译源代码是修改AST(抽象语法树)来实现目标,比如说给POJO自动实现get方法、set方法和toString方法等。具体代码如下:

    public @Data class Demo{
      private String name;
    }
    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.SOURCE)
    public @interface Data{
      String staticConstructor() default " ";
    }
    
    

    源代码编译之后:

    public class Demo{
      private String name;
      public Demo(){
      }
      public String getName(){
        return name;
      }
      public void setName(String name){
        this.name = name;
      }
      public int hashCode(){
        ...
      }
      public String toString(){
        ...
      }
    
    }
    

    泛型(Generics)

    为了将代码尽可能的复用,除了使用多态性以外,我们还经常使用泛型。多态是在运行时处理的,而泛型是在编译时就获取到具体的类型,同时,一旦编译完成,所有和泛型有关的类型全部擦除,这样做的好处是使用类型推导避免强制类型转换,和编译期的类型安全检查。

    public void test(){
      List<Integer> list = Arrays.asList(1,2,3);
      list.add(4);
      int i = list.get(0);
    }
    

    类型檫除之后,JVM完成类型转换。

    public void test(){
      List list = Arrays.asList(1,2,3);
      list.add(4);
      int i = (Integer)list.get(0);
    }
    

    反射(Reflection)

    上面介绍的注解和泛型都是发生在编译期,而接下来要介绍的反射发生在运行时的。我们知道每个java文件都会被编译成一个.class文件,这些class文件会被JVM装入到虚拟机中,接着,JVM会把类的信息(包括父类、接口、构造函数、方法、属性等)存放到方法区中,所以,在运行时我们可以查看到类的所有信息。常见的方法有:

    // 获取所有级别的字段
    Field[] fields = clz.getDeclaredFields();
    // 获取public字段
    for(int i =0;i<fields.length;i++) {
      Class type = fields[i].getType();
      System.out.println(type.getName()+" "+fields[i].getName());
    }
    // 获取构造器
    Constructor[] constructors = clz.getDeclaredConstructors();
       
    

    本期就带领大家熟悉一下Java语言几个重要特性,后面几期会详细介绍这些特性。

    image

    欢迎关注微信公众号:木可大大,所有文章都将同步在公众号上。

  • 相关阅读:
    js
    第三方jar包导入unity
    xcode打包苹果应用遇到的问题及解决方法
    ios打包unity应用以及配置签名
    unity打包安卓应用及生成签名
    Unity实现用户条款弹窗及登录
    Unity协程实现伪加载页面
    Unity配置安卓开发环境
    Unity中用Mono插件解析xml文件
    Excel关联xml文件
  • 原文地址:https://www.cnblogs.com/neal-ke/p/8947394.html
Copyright © 2020-2023  润新知