• 根据《Java虚拟机规范》的规定,运行时数据区通常包括这几个部分:程序计数器(Program Counter Register)、Java栈(VM Stack)、本地方法栈(Native Method Stack)、方法区(Method Area)、堆(Heap)。

由此先来看看方法区的作用。

Read more »

1、异常概述

  • 在使用计算机语言进行项目开发的过程中,即使程序员把代码写得尽善尽美,在系统的运行过程中仍然会遇到一些问题,因为很多问题不是靠代码能够避免的,比如:客户输入数据的格式,读取文件是否存在,网络是否始终保持通畅等等。
  • 异常:在Java语言中,将程序执行中发生的不正常情况称为“异常”。(开发过程中的语法错误和逻辑错误不是异常)
  • Java程序在执行过程中所发生的异常事件可分为两类:
    • Error:Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。比如:StackOverflowError和OOM。一般不编写针对性的代码进行处理。
    • Exception: 其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。例如:空指针访问、试图读取不存在的文件、网络连接、数组角标越界等。
Read more »

  • 根据《Java虚拟机规范》的规定,运行时数据区通常包括这几个部分:程序计数器(Program Counter Register)、Java栈(VM Stack)、本地方法栈(Native Method Stack)、方法区(Method Area)、堆(Heap)。

由此先来看看本地方法栈和堆的作用。

Read more »

一、Java面向对象编程

1.1 类和对象

  • **类(Class)对象(Object)**是面向对象的核心概念。
    • 类是对一类事物的描述,是抽象的、概念上的定义。
    • 对象是实际存在的该类事物的每个个体,因而也称为实例(instance)。
  • 设计类,其实就是设计类的成员。
    • 属性 = 成员变量 = field = 域、字段
    • 方法 = 成员方法 = 函数 = method
    • 创建类的对象 = 类的实例化 = 实例化类
  • 类和对象的使用(面向对象思想落地的实现)
    • 创建类,设计类的成员。
    • 创建类的对象。
    • 通过“对象.属性”或“对象.方法”调用对象的结构。
      Read more »

  • 根据《Java虚拟机规范》的规定,运行时数据区通常包括这几个部分:程序计数器(Program Counter Register)、Java栈(VM Stack)、本地方法栈(Native Method Stack)、方法区(Method Area)、堆(Heap)。

由此先来看看虚拟机栈的作用。

Read more »

  • 非虚方法:方法在编译器就确定了具体的调用版本,这个版本的运行时是不可变的(非虚方法有静态方法、私有方法、final方法、实例构造器、父类方法,其他方法为虚方法)。

  • jvm提供了以下几条方法调用指令:

    • 调用非虚方法(final修饰的方法除外):
      • (1)invokestatic:调用静态方法,解析阶段确定唯一方法版本。
      • (2)invokespecial:调用方法、私有方法、父类方法,解析阶段确定唯一方法版本。
    • 调用虚方法:
      • (3)invokevirtual:调用所有虚方法。(调用final方法用的是这个指令)
      • (4)invokeinterface:调用接口方法。
      • (5)invokedynamic:动态解析出需要调用的方法,然后执行。
Read more »

  • 根据《Java虚拟机规范》的规定,运行时数据区通常包括这几个部分:程序计数器(Program Counter Register)、Java栈(VM Stack)、本地方法栈(Native Method Stack)、方法区(Method Area)、堆(Heap)。

由此先来看看程序计数器的作用。

Read more »

1、类加载子系统

在介绍类的加载过程之前,先看看类加载子系统的组成。

  • 类加载子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识。
  • ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine决定。
  • 加载的类信息存放于一块称为方法区的内存空间。除了类的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息是Class文件中常量池部分的内存映射)。
    Read more »

1、String类

  • String声明为final的,不可被继承。
  • String实现了Serializable接口:表示字符串是支持序列化的;实现了Comparable接口:表示String可以比较大小。
  • String内部定义了final char[] value用于存储字符串数据。
  • String:代表不可变的字符序列。简称:不可变性。
    • 当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值。
    • 当对现有的字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。
    • 当调用String的replace()方法修改指定字符或字符串时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。
  • 通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中。
  • 字符串常量池中是不会存储相同内容的字符串的。
Read more »

1、枚举类

  • 当需要定义一组常量时,强烈建议使用枚举类。
  • 枚举类的实现
    • JDK1.5之前需要自定义枚举类。
    • JDK 1.5 新增的 enum 关键字用于定义枚举类。
  • 若枚举只有一个对象, 则可以作为一种单例模式的实现方式。
  • 枚举类的属性
    • 枚举类对象的属性不应允许被改动, 所以应该使用 private final 修饰。
    • 枚举类的使用 private final 修饰的属性应该在构造器中为其赋值。
    • 若枚举类显式的定义了带参数的构造器, 则在列出枚举值时也必须对应的传入参数。
Read more »