2021最新Java学习总结---Java语言特点

Java语言是简单的

Java语言的语法与C语言和C++语言很接近,从某种意义上讲,它是由C和C++演变而来,使得大多数程序员很容易学习和使用

对C++来说进行了简化和一定的提高,如:使用接口代替了复杂的多重继承以及取消了指针,还通过实现垃圾自动回收机制,大大简化了程序员的资源释放管理工作。

提供了丰富的类库API文档,以及第三方开发包工具包,还有大量的基于Java的开源项目,帮助程序设计人员参考学习,JDK就是开放的源代码之一,读者可以通过分析项目的源代码,来提高自己的编程水平。

Java语言是面向对象的

面向对象就是Java语言的基础,也是Java语言的重要特性。面向对象是指以对象为基本单元,包含属性和方法。对象的状态用属性表达,对象的行为用方法表达

面向对象技术使得应用程序的开发变得简单易用,节省代码。总之,Java语言是一个纯面向对象的程序设计语言

Java语言是分布式的

分布性主要包括两大方面,分别是操作分布数据分布

操作分布指的是在多个不同的主机上布置相关操作,数据分布是将数据分别存放在多个网络中不同的主机上,借助的是URL(统一资源定位符)访问网络对象,访问方式和访问本地系统相似。

Java语言具有一个强大的,易于使用的网络能力,这是非常适合于分布式计算程序的。
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java.net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。

<<通俗易懂讲解什么是Java分布式>>链接

Java语言是多线程的

多线程机制使应用程序在同一时间并行执行多项任务,Java语言提供多线程之间的同步机制,这些相应的同步机制可以很好的保证不同线程,能够正确的共享数据。多线程机制使程序具有更好的交互性实时性

Java语言是高性能的

Java是一种先编译后解释的语言,所以它不如全编译性语言快。但是有些情况下性能是很要紧的,为了支持这些情况,Java设计者制作了“及时”编译程序,它能在运行时把Java字节码翻译成特定CPU(中央处理器)的机器代码,也就是实现全编译了。Java字节码格式设计时考虑到这些“及时”编译程序的需要,所以生成机器代码的过程相当简单,它能产生相当好的代码。
与那些解释型的高级脚本语言相比,Java的确是高性能的。事实上,Java的运行速度随着JIT(Just-In-Time)编译器技术的发展越来越接近于C++。

Java语言是跨平台的

所谓的跨平台性,是指软件可以不受计算机硬件和操作系统的约束而在任意计算机环境下正常运行。这是软件发展的趋势和编程人员追求的目标。之所以这样说,是因为计算机硬件的种类繁多,操作系统也各不相同,不同的用户和公司有自己不同的计算机环境偏好,而软件为了能在这些不同的环境里正常运行,就需要独立于这些平台。
在Java语言中,Java自带的虚拟机很好地实现了跨平台性。Java源代码经过编译后生成二进制的字节码是与平台无关的,Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。这就是Java的能够Write once, run anywhere(一次编译,到处运行)的原因。Java虚拟机提供了一个字节码到底层硬件平台及操作系统的屏障,使得Java语言具备跨平台性。

Java语言是可移植的

可移植性来源于跨平台性性,另外,Java还严格规定了各个基本数据类型的长度。Java系统本身也具有很强的可移植性,Java编译器是用Java实现的,Java的运行环境是用ANSI C实现的。

Java语言是安全的

在Java语言中删除了类似于C语言中的指针和内容释放等语法,有效的避免了非法操作内存,代码要经过校验之后才能够运行,所以未经允许的Java程序不可能出现损害系统平台的行为,最大的好处就是,Java可以编写防病毒和可修复的系统,Java通常被用在网络环境中,为此,Java提供了一个安全机制以防恶意代码的攻击,从而可以提高系统的安全性。

为什么安全?得从它的机制说起啊!!
编译好的.java文件会被jvm的类加载器进行加载校验,校验过程中除了校验是否符合编译标准之外还会校验代码中是否有对系统 文件进行操作的代码,如果有,那可能就不会让你校验通过了。 然后呢,说说jvm,jvm是系统内从开辟出来的一块独立的内存区域,你的代码在运行的时候会在一个独立的沙箱中(沙箱是啥?之后再补充 … )反正就是在这块区域中也不允许你去访问块内存之外的其他区域。比如说你想通过代码访问电脑磁盘中的文件什么的,那是不可能的。

Java语言是健壮的

1、Java语言是一种强类型语言,即在编译和运行时进行大量的类型检查,防止不匹配的数据类型的发生
2、Java语言设计有自动收集垃圾功能,防止了内存分配的错误
3、Java语言设计了异常处理机制

Java语言的强类型机制、异常处理、垃圾的自动收集等是Java程序健壮性的重要保证。对指针的丢弃是Java的明智选择。Java的安全检查机制使得Java更具健壮性

Java语言是动态的

Java本质为静态语言,而不是动态语言。动态语言显著的特点是在程序运行时,可以改变程序结构或变量类型,典型的动态语言有Python、ruby、javascript等。Java不是动态语言,但Java具有一定的动态性
表现在以下几个方面:

  • 反射机制;
  • 动态字节码操作;
  • 动态编译;
  • 执行其他脚本代码;

1、反射机制

反射机制指的是可以在运行时加载、探知,使用编译期间完全未知的类。我们知道,当类加载完毕后,在堆内存中,就产生了一个Class类型的对象(一个类只有一个Class对象)。这个对象包含了完整的类结构信息,通过该对象就可以获知类的结构信息,如类的方法、属性等。

所以通过一个类的Class对象,我们就可以动态的创建实例调用方法访问属性。当一个类被加载时,JVM便自动产生了一个Class对象,Class对象是反射的根源,使用反射机制的前提是获取类的Class对象。
Class的描述如下:
Instances of the class Class represent classes and interfaces in a running Javaapplication. An enum is a kind of class and an annotation is a kind ofinterface. Every array also belongs to a class that is reflected as a Class object that is shared byall arrays with the same element type and number of dimensions. The primitiveJava types (boolean, byte, char, short, int, long, float, and double), and the keyword void are also represented as Class objects.
Class has no public constructor. Instead Class objects are constructedautomatically by the Java Virtual Machine as classes are loaded and by calls tothe defineClass method in the classloader.

反射机制常见的操作有:

  • 动态加载类、动态获取类的信息,如构造器、方法、属性等;
  • 动态构造对象;
  • 动态调用类和对象的任意方法(公有和私有)、构造器等;
  • 访问任意属性(公有和私有),在访问私有属性时,需要设置setAccessible属性为真,这时候告诉JVM不做安全检查,可以直接反问,而且由于不做安全检查,提高了效率;
  • 处理注解;
  • 获取泛型信息;

使用反射机制最大的问题就是性能问题,若大量使用反射则性能会大幅下降

2、字节码操作

运行时操作字节码,比反射开销下,效率高,可以实现如下功能:

  • 动态生成新的类;
  • 动态改变某个类的结构,如添加、删除、修改属性或方法等;
  • 常见的字节码操作类库有:
    - BCEL
    - ASM
    - CGLIB
    - Javassist

3、 代理

在Java中代理分为静态代理动态代理两种类型。
静态代理就是显示源码创建一个类的代理,当代理较多时,需要写大量的代理类源码;

动态代理是动态创建一个类的代理类,如可以通过JDK动态生成代理类,也可以采用字节码操作动态创建代理类。通过JDK提供的Proxy、InvocationHandler来动态创建代理类的步骤如下:

  1. 定义接口
  2. 提供实现类
  3. 实现InvocationHandler
/**
 * 定义接口
 * */

public interface UserDao
{
    
    
   public void add();
}

  /**
    * 实现类
 * */

public class UserDaoImpl  implements UserDao
{
    
    
    public void add()
    {
    
    
    System.out.println("adduser");
    }

}

/**
   * InvocationHandler
 * */
public class ProxyFactory  implements InvocationHandler

{
    
    
     private Object real;
     public ProxyFactory(Object real)
     {
    
    
          this.real=real;
     }   
    /**
     * 通过Proxy来返回代理对象
 * */
     publicObject getProxyObject()
     {
    
    
         returnProxy.newProxyInstance(ClassLoader.getSystemClassLoader(),real.getClass().getInterfaces(),this);
     }

     @Override
     public Object invoke(Object proxy, Method method, Object[] args)
               throws Throwable
     {
    
    
          System.out.println("logging..........");
          Object result=method.invoke(real, args);
          return result;
     }

 

}

猜你喜欢

转载自blog.csdn.net/m0_51755061/article/details/113099662
今日推荐