浅谈Java特性

学习Java有几个月了,记录下此时的体会与总结。结合Java体系结构、JVM原理和JDK源码,谈谈我对Java的理解及其特性的分析。


Java语言特性


SUN公司对Java的描述:

“Java is a simple,object-oriented, distributed,
interpreted, robust, secure, architecture neutral, portable,
high-performance, multihreaded, and dynamic language”.

Java语言最初是面向嵌入式系统开发的语言,其主要是为了满足“一次编译,到处运行”的需求。众所周知,Java具有健壮性、安全性、平台无关性、可移植性、面向对象等特性。随着网络技术的发展,分布式的大量应用,Java语言逐渐发展出面向网络的特性。


简易性

较之C/C++,Java简单且好用,它抛弃了指针、操作符重载、类多继承、自动强制类型转换。

不支持操作符重载

  • Java中仅有的两个操作符重载为String的+ 和+=

    查看String的注释,发现Java为其提供特殊支持,+操作会转化为StringBuilder或StringBuffer,调用append方法完成。

 * The Java language provides special support for the string
 * concatenation operator ( + ), and for conversion of
 * other objects to strings. String concatenation is implemented
 * through the {@code StringBuilder}(or {@code StringBuffer})
 * class and its {@code append} method.

不支持指针

  • Java没有显式地使用指针
  • JVM由C++实现,其操作可能涉及指针操作
  • JVM调用native方法可能涉及指针操作

不支持类的多继承

  • 此处放到面向对象特性讲

不支持自动强制类型转换

  • 使用强制类型转换的时候要加上强制类型转换符()
  • 自动类型转换:类型要兼容且目标类型要大于源类型
  • boolean不允许任何类型的转换
  • 类数据类型不允许转换(同族可以)

boolean类型较为特殊

  • 编译成字节码时用int或byte表示
  • JVM中,0表示false;非零表示true;
  • boolean用int操作
  • boolean数组用byte数组访问
int i = 0;
char c = 'a';
int x = c;//使用自动类型转换
byte b1 = i;//使用自动强制类型转换,错误
byte b2 = (byte)i;//使用显式强制类型转换,正确

面向对象

说到面向对象,不得不说其三大特性:继承、封装和多态。其作用如复用性、耦合性在此不再赘述。

继承

  • Java支持类的单继承
  • Java支持接口的多继承,Java集合框架中许多体现
  • 创建一个类若不显式指明继承关系,隐式继承自Object
  • 使用extends关键字,自动得到基类中所有域和方法(包括私有,但无法访问)
  • 基类包装在子类的内部,这解释为何先调用父类构造函数

多态

相同类型的引用变量,调用同一个方法呈现不同行为特征。

重载&重写

  • 重载 静态分派
    静态、私有、实例构造器、父类方法会在解析阶段把符号引用转化为直接引用

  • 重写 动态分派
    运行期根据实际类型方法执行分派
    本质把常量池中类方法的符号引用解析到不同的直接引用上

重写规则:两同两小一大

  • 方法名,参数列表相同
  • 返回类型和抛出异常小于父类
  • 访问权限大于父类

封装

访问控制符

  • 外部类:public default abstract final修饰
  • 内部类:所有
  • 局部内部类:相当于成员变量,无访问控制修饰符

安全性&健壮性

内置于JVM的安全特性确保了Java语言的健壮性。但Java的分布式、面向网络特性会带来安全问题,Java安全模型是一种扩展的内置安全模型,侧重于保护用户避免来自网络的恶意代码的侵害。强化其了健壮性,故一起分析。

类装载器双亲委派模型

  • 防止不可靠类代替信任类
  • 通过包权限控制不可靠类的活动范围

class文件检验器

  • 即类加载验证阶段,在此不赘述

内置于JVM的安全特性

  • 类型安全的引用转换
  • 自动垃圾回收
  • 内存结构化访问
    1.无指针
    2.class文件里无内存布局信息
  • 数组边界检查
  • 对象引用检查:引用非空
  • 异常的结构化处理

安全管理器及Java API

代码签名和认证


平台无关性

平台无关性来自于JVM、Java语言、class文件、API的支持

JVM

  • Java程序只需要与JVM交互,JVM通过API和主机交互
  • 字节码指令集面向操作数栈而不是寄存器

Java语言

  • 基本数据类型的值域和行为都是由语言自己定义的

class文件

  • 8位字节为基础单位的二进制流
  • 严格限制字节码存储格式,与JVM无关

面向网络

Class文件

  • 将程序分割为各个Class文件传输:动态连接与扩展特性
  • 文件格式紧凑,8位字节为基础,便于传输

RMI

  • 远程对象将会把自身的一个拷贝序列化后以Socket的形式传输给客户端

序列化

  • 对象可以被表示为一个字节序列,便于存储和传输

问题

面向网络:分布式传输性能、及安全问题
健壮性:垃圾收集器给内存管理和线程调度带来问题
平台无关性:API最小公分母问题
保密性:Java语言和class文件联系紧密,class文件包含过多信息;混淆器

猜你喜欢

转载自blog.csdn.net/moni_mm/article/details/80638000