初始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上运行。

JRE和JDK之间的关系?

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

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是很火的,目前基本没人在用了。

注解(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语言几个重要特性,后面几期会详细介绍这些特性。

原文发布于微信公众号 - 木可大大(mukedd)

原文发表时间:2018-04-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java3y

JSP第三篇【JavaBean的介绍、JSP的行为--JavaBean】

什么是javaBean JavaBean就是一个普通的java类,也称之为简单java对象--POJO(Plain Ordinary Java Object),...

39560
来自专栏余林丰

Effective Java通俗理解(下)

第31条:用实例域代替序数   枚举类型有一个ordinal方法,它范围该常量的序数从0开始,不建议使用这个方法,因为这不能很好地对枚举进行维护,正确应该是利用...

29190
来自专栏博岩Java大讲堂

Java虚拟机--对象内存布局

37460
来自专栏木可大大

初识Java

为了让Java能够实现跨平台,Java的发明者们增加了一个抽象层,即JVM(Java Virtual Machine,Java虚拟机),自定义一套指令并且和硬件...

46840
来自专栏函数式编程语言及工具

泛函编程(38)-泛函Stream IO:IO Process in action

  在前面的几节讨论里我们终于得出了一个概括又通用的IO Process类型Process[F[_],O]。这个类型同时可以代表数据源(Source)和数据终端...

21170
来自专栏Java Web

Java 面试知识点解析(四)——版本特性篇

15950
来自专栏java达人

Java中的堆和栈的区别

当一个人开始学习Java或者其他编程语言的时候,会接触到堆和栈,由于一开始没有明确清晰的说明解释,很多人会产生很多疑问,什么是堆,什么是栈,堆和栈有什么区别?更...

25460
来自专栏Linyb极客之路

编码习惯之接口定义

工作中,少不了要定义各种接口,系统集成要定义接口,前后台掉调用也要定义接口。接口定义一定程度上能反应程序员的编程功底。列举一下工作中我发现大家容易出现的问题:

10830
来自专栏xiaoxi666的专栏

状态机编程思想(2):删除代码注释(目前支持C/C++和Java)

之前考虑过正则表达式,但是感觉实现起来相当麻烦。而状态机可以把多种情况归为一类状态再行分解,大大简化问题。本文就是基于状态机实现的。

14220
来自专栏SpringBoot 核心技术

第三十六章:基于SpringBoot架构重写SpringMVC请求参数装载

30670

扫码关注云+社区

领取腾讯云代金券