zoukankan      html  css  js  c++  java
  • JDK源代码学习-基础类

    一、概述

      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();
        }
      }
    
    }
    

      

     
  • 相关阅读:
    笔记35 跨重定向请求传递数
    判断邮箱的正则表达式
    按钮
    async await 的用法
    笔记34 Spring MVC的高级技术——处理multipart形式的数据
    Convert Sorted Array to Binary Search Tree
    Binary Tree Zigzag Level Order Traversal
    Unique Binary Search Trees,Unique Binary Search Trees II
    Validate Binary Search Tree
    Populating Next Right Pointers in Each Node,Populating Next Right Pointers in Each Node II
  • 原文地址:https://www.cnblogs.com/leanfish/p/9729609.html
Copyright © 2011-2022 走看看