一、概述

  1、Java,是一套语言规范,例如规定了变量如何定义、控制语句如何写等,提供基本的语法规范。JDK是java自带的一套调用组件,是对基本java语法规范的进一步封装,jdk中都是使用java基本的语法来写的,使用JDK能够更好的使用java。当然,自己也可以写一套JDK。自己在项目中也可以不使用自带的JDK,而使用原生的基本语法。

  2、在整个JDK API中,大约包含1200个包,包名主要有三种:java、javax和org。其中以java开头的包名是JDK的基础语言包,以javax开头的属于JDK扩展包(其中x是extend的简写),而以org开头的则是第三方组织提供的功能包(org是organization的简写)。而在JDK API中还包含了一些以com.sun开头的包名,这些是SUN公司提供的一些功能包,由于这些包中的类随着JDK版本的更改变化很大,不具备兼容性,所以未在标准的JDK API文档中进行公开。

  3、rt.jar文件是java运行时类库,是我们用到最多的基础类库,包括java.lang,java.io,java.net,java.util等。

    java.lang:Java语言包,这个包下的文件不需要显式import。包括:Object类,数据类型相关的类(String,Long,Byte),Class类,线程相关类Thread,异常类Throwable,等。

    java.io:I/O操作相关的类。包括:文件类File,FileReader,FileWriter,输入输出流InputStream/OutputStream,等。

    java.net:网络相关类。包括:http连接类HttpURLConnection,socket类,等。

    java.util:工具类。包括:数据结构相关的类ArrayList、Hashmap,日期类Date,随机数类Random,等。

  4、java native方法:不由java实现的方法,一般这些方法都是很底层,跟平台结合紧密,或者使用java实现性能很差。
 
二、Object类
  1、Object类是java中所有类的父类,所有类默认继承Object。这也就意味着,Object类中的所有公有方法也将被任何类所继承。如果,整个java类体系是一颗树,那么Object类毫无疑问就是整棵树的根。
  Object类中的方法如下:
  
 
三、Class类
  1、先复习几个概念:
    类:事物特征的抽象,可以理解为模板,是事物特征的定义。可以创建对象。
    对象:是一个具体的事物实体,由类创建的。
  2、Class类也是一个抽象的事物定义,也是类的一种,同String类以及自己定义的类是一样的。只是名字和class关键字高度相似。Java是大小写敏感的语言。
  3、Java程序在运行时,需要记录已经加载的类的信息,这些信息也会使用对象来记录,这个对象就由Class类来创建。Class类创建的对象是用来记录类的信息的。比如你创建一个shapes类,那么,Java会生成一个内容是shapes的Class类的对象,用来记录shapes的状态等信息。
  4、Class类的对象不能像普通类一样,以 new shapes() 的方式创建,它的对象只能由JVM创建,因为这个类没有public构造函数。
  5、一个类的多个对象只会有一个Class对象。每个类都有一个Class对象。
  6、基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也都对应一个 Class 对象。 
      7、每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。
  8、使用Class.forName(),加载一个类到内存中,使用newInstance()创建类。newInstance()方法调用默认构造器(无参数构造器)初始化新建对象。
  9、java里面任何类都要装载在虚拟机上才能运行。forName就是装载类用的(new是根据加载到内存中的类创建一个实例,要分清楚)。 至于什么时候用,可以考虑一下这个问题,给你一个字符串变量,它代表一个类的包名和类名,你怎么实例化它?
A a = (A)Class.forName("pacage.A").newInstance();这和A a = new A();是一样的效果。
  10、jvm在装载类时会执行类的静态代码段,要记住静态代码是和类绑定的,类装载成功就表示执行了你的静态代码了,而且以后不会再执行这段静态代码了。
  11、Class.forName(xxx.xx.xx)的作用是要求JVM查找并加载指定的类,即查找对应的.class文件,也就是说JVM会执行该类的静态代码段。
  12、动态加载和创建Class对象,比如想根据用户输入的字符串来创建对象
         String str = 用户输入的字符串  
         Class t = Class.forName(str);  
         t.newInstance(); 
  13、在初始化一个类,生成一个实例的时候,newInstance()方法和new关键字除了一个是方法,一个是关键字外,它们的区别在于创建对象的方式不一样,前者是使用类加载机制,后者是创建一个新类。这主要考虑到软件的可伸缩、可扩展和可重用等软件设计思想,才有这两种创建方式。Java中工厂模式经常使用newInstance()方法来创建对象,因此从为什么要使用工厂模式上可以找到具体答案。例如:
           Class c = Class.forName(“Example”);  
           factory = (ExampleInterface)c.newInstance();  
       其中ExampleInterface是Example的接口,可以写成如下形式:
          String className = "Example";  
          class c = Class.forName(className);  
          factory = (ExampleInterface)c.newInstance();  
      进一步可以写成如下形式:
         String className = readfromXMlConfig;//从xml 配置文件中获得字符串
         class c = Class.forName(className);  
         factory = (ExampleInterface)c.newInstance();  
        上面代码已经不存在Example的类名称,它的优点是,无论Example类怎么变化,上述代码不变,甚至可以更换Example的兄弟类Example2 , Example3 , Example4……,只要他们继承ExampleInterface就可以。  
  14、从JVM的角度看,我们使用关键字new创建一个类的时候,这个类可以没有被加载。但是使用newInstance()方法的时候,就必须保证:这个类已经加载和这个类已经连接了。而完成上面两个步骤的正是Class的静态方法forName()所完成的,这个静态方法调用了启动类加载器,即加载 java API的那个加载器。现在可以看出,newInstance()实际上是把new这个方式分解为两步,即首先调用Class加载方法加载某个类,然后实例化。这样分步的好处是显而易见的。我们可以在调用类的静态加载方法forName时获得更好的灵活性,提供给了一种降耦的手段。  
  15、用最简单的描述来区分new关键字和newInstance()方法的区别:
  newInstance: 弱类型。低效率。只能调用无参构造。  
  new: 强类型。相对高效。能调用任何public构造。
 
简单实例如下:
public class People {

  private String name;
private int age;
private String gender; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public String getGender() {
return gender;
} public void setGender(String gender) {
this.gender = gender;
} public void say() {
System.out.println("Hello world!");
} public String showInfo() {
return "My name is " + this.name;
} } public class ClassTest { public static void main(String[] args) {
try {
//先加载类,再创建实例,等同于People tim = new People();
People tim = (People) Class.forName("com.tim.People").newInstance();
tim.say(); // 获取tim这个对象的类描述信息,
// 可以获取:类的构造方法,已经声明的字段、方法,获取类或者方法的注解,获取类的包名、父类,以及判断类是否是数组、是否是枚举、是否是接口
// 主要针对不清楚类的内部信息时,使用该方法获取
Class peopleClass = tim.getClass();
Field[] peopleField = peopleClass.getDeclaredFields();//获取类的字段
for (Field field : peopleField) {
System.out.println(field.getName());
} } catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} }

  

JDK源代码学习-基础类的更多相关文章

  1. JDK源代码学习系列07----Stack

                                                                   JDK源代码学习系列07----Stack 1.Stack源代码很easy ...

  2. JDK源代码学习系列04----ArrayList

                                                                             JDK源代码学习系列04----ArrayList 1 ...

  3. JDK源代码学习系列05----LinkedList

                                             JDK源代码学习系列05----LinkedList 1.LinkedList简单介绍 LinkedList是基于双向 ...

  4. JDK源代码学习系列03----StringBuffer+StringBuilder

                         JDK源代码学习系列03----StringBuffer+StringBuilder 因为前面学习了StringBuffer和StringBuilder的父类 ...

  5. JDK源代码学习-ArrayList、LinkedList、HashMap

    ArrayList.LinkedList.HashMap是Java开发中非常常见的数据类型.它们的区别也非常明显的,在Java中也非常具有代表性.在Java中,常见的数据结构是:数组.链表,其他数据结 ...

  6. 通过分析 JDK 源代码研究 TreeMap 红黑树算法实现

    本文转载自http://www.ibm.com/developerworks/cn/java/j-lo-tree/ 目录: TreeSet 和 TreeMap 的关系 TreeMap 的添加节点 Tr ...

  7. [Java] LinkedList / Queue - 源代码学习笔记

    简单地画了下 LinkedList 的继承关系,如下图.只是画了关注的部分,并不是完整的关系图.本博文涉及的是 Queue, Deque, LinkedList 的源代码阅读笔记.关于 List 接口 ...

  8. 调试JDK源代码-一步一步看HashMap怎么Hash和扩容

    调试JDK源代码-一步一步看HashMap怎么Hash和扩容 调试JDK源代码-ConcurrentHashMap实现原理 调试JDK源代码-HashSet实现原理 调试JDK源代码-调试JDK源代码 ...

  9. 无法debug断点跟踪JDK源代码——missing line number attributes的解决方法

    在项目工程->Properties->Java Build Path->Libraries中导入的JRE System Library库里,给jar包添加JDK源代码包后,能够直接打 ...

随机推荐

  1. 深入理解Linux内核 学习笔记(1)

    1.用户和用户组 每个用户是一个或多个用户组的一名成员,组由唯一的用户组标识符(user group ID)标识.每个文件的相关权限也恰好与一个组相对应. root为超级用户, 2.模块 为了达到微内 ...

  2. 卷积神经网络CNN

    卷积神经网络,在图像识别和自然语言处理中有很大的作用,讲cnn的中文博客也不少,但是个人感觉说的脉络清晰清晰易懂的不多. 无意中看到这篇博客,写的很好,图文并茂.建议英文好的直接去看原文.英文不好的就 ...

  3. C# xml序列化与反序列化 特性的使用

    以下为将被序列化的类Entity: [XmlRoot("Root")] public class Entity { [XmlAttribute(AttributeName = &q ...

  4. 前端面试知识点集锦(JavaScript篇)

    目录 1.谈谈你对Ajax的理解?(概念.特点.作用) 2.说说你对延迟对象deferred的理解? 3.什么是跨域,如何实现跨域访问? 4.为什么要使用模板引擎? 5.JavaScript是一门什么 ...

  5. MySQL中SELECT语句简单使用

    最近开始复习mysql,查漏补缺吧. 关于mysql 1.MySQL不区分大小写,但是在MySQL 4.1及之前的版本中,数据库名.表名.列名这些标识符默认是区分大小写的:在之后的版本中默认不区分大小 ...

  6. Asp.Net 将HTML中通过dom-to-image.js标签div内的内容转化为图片保存到本地

    由于客户的需求,将js写出来的一个统计能够保存到本地.作为码奴的我只能慢慢搬砖咯!一开始使用的是html2canvas.js.功能是可以实现,但是有缺陷.话不多说开始搞! 1.引入几个JS库 ①:jq ...

  7. vue学习之ajax 简单快速使用axios

    vue2.x 推荐使用axios 1.首先使用安装 npm install axios -S 2.在哪用在哪引入 import axios from 'axios' 或则在main.js 中引入 在申 ...

  8. Django 使用 locals() 函数

    locals() 函数会以字典类型返回当前位置的全部局部变量. 在 views.py 中添加 from django.shortcuts import render,HttpResponse,rend ...

  9. Admin Console 反应慢的相关bug

    一个常见问题是在 Admin console 刷新 server 列表时,页面反应慢.从 Admin Server 的 Thread Dump 可以看到 Admin server 到 Managed ...

  10. (五) Keras Adam优化器以及CNN应用于手写识别

    视频学习来源 https://www.bilibili.com/video/av40787141?from=search&seid=17003307842787199553 笔记 Adam,常 ...