Java基础

一.Java的lang包

 

  1. String类一旦初始化(注意类的初始化的含义)(static变量初始化以及static语句的执行)就不可以改变,而stringBuffer可以,它用于封装内容可变的字符串,可以使用toString()方法转换成string字符串。

 

  2. String类的方法

 

     String(byte[] byte, int offset, int length);

 

     equalsIgnoreCase

 

     indexOf(int ch)

 

     subString(int beginIndex)

 

     subString(int beginIndex, int endIndex)

 

 

  3. 基本数据类型包装类的作用

 

      将基本数据类型包装成对象,为什么要将基本数据类型包装成对象呢?因为有些方法不可以直接处理基本数据类型,只能处理对象,比如vector的add方法,参数就只能够是对象,这时需要使用他们的包装类将他们包装成对象。

(1)

     String sb = new String();

 

     for(int j = 0; j < w; j ++){

 

      sb = sb + '*';

}

(2)StringBuffer sb = new StringBuffer();

 

   for(int j = 0; j < w; j ++){

       sb.append('*');

}

 

对于(1)而言每一次的循环中,都要先将string类型转换为stringBuffer类型,然后调用append方法将*追加进取,然后再调用toString()方法,转换为string类型,效率很低;

对于(2)而言每次循环中都只是调用原来那个stringBuffer对象,没有创建新的对象,所以效率比较高。

 

 

二. System类与Runtime类

 

  java不支持全局函数和全局变量,所以java设计者将一些与系统相关的重要函数和变量放在System类中,我们不能直接创建runtime的实例,只能通过runtime.getruntime()静态方法来获得

 

  三.Java中的两种不同机制的异常

 

  Java中有两类主要的异常:runtime exception和checked exception,所有的checked exception是从java.lang.Exception类衍生出来的,而runtime exception从java.lang.RuntimeException或者java.lang.Error类衍生出。

 

  两者的不同

 

(1)机制上

 

  1.抛出checked exception的方法在定义时要声明它会抛出exception,而抛出runtime exception的方法在定义时不必声明它会抛出exception(注意什么叫定义方法)

 

  2.对于checked exception,在定义方法时,需要声明会抛出的所有的异常,在调用方法时,需要捕获所有的异常,不然就得把它的异常传递下去;

 

  3.对于runtime exception,在定义方法时,不需要声明会抛出runtime exception,在调用这个方法时不需要捕获这个runtime exception

 

  4.checked exception从java.lang.exception中衍生出来

 

  5.runtime exception从java.lang.runtimeexception或者java.lang.error类衍生出来

 

(2)逻辑上

 

    从逻辑的角度讲,checked exception和runtime 有不同的使用目的,checked exception用来表示由调用方法可以直接处理的异常情况,而runtime exception则用来表示一种调用方法无法处理或者回复的程序错误。

 

  runtime exception一般是程序代码出现问题导致的,必须改正程序的代码才能够解决,如果在程序中捕获runtime exception,则可能导致代码中的bug被掩盖。

 

  四. 静态库,动态连接库

 

    1.程序编制一般需要经过编辑,编译,连接,加载和运行几个步骤,有一些公共代码需要反复使用,就把这些代码编译成“库”文件;

在连接步骤中,连接器将从库文件中取得需要的代码,复制到可生成的可执行文件中,这种库成为静态库,特点是可执行文件中包含了库代码的完整拷贝,缺点是被多次使用就有多份冗余拷贝。

  2.为克服这个缺点,采用动态连接库,这个时候连接器仅仅在可执行文件中打上标志,说明需要使用那些动态连接库,当运行程序时,加载器根据这些标志把所需的动态连接库加载到内存。

  3.Java程序不是本地的可执行程序,当运行java程序时,(1)首先运行JVM,(2)然后将Java class加载到JVM中运行,负责加载java class的部分叫做class loader

  4.JVM本身包含一个classloader成为bootstrap classloader,和JVM一样,bootstrap classLoader用本地代码实现,负责加载核心java class(即所有java.*开头的类),另外JVM还提供两个classLoader,分别是Extension classLoader和Application classLoader,这两个classLoader都是用java编写的,有bootstrap classLoader加载

 

  5.当使用Java去执行一个类,JVM使用Application ClassLoader加载这个类,然后如果类A引用了类B,不管是直接引用还是用class.forName()应用,JVM会找到加载类A的CLassLoader,并用这个ClassLoader来加载类B

 

 6.JVM自带的ClassLoader只懂得从本地文件系统加载标准的Java class 文件,如果编写自己的classLoader,可以做到:

 

  (1)在执行费置信代码之前,自动验证数字签名;

 

  (2)动态地创建符合用户特定需要的定制化构建类;

 

  (3)从特定的场所获得java class,例如从数据库中

 

 7. 目前的应用服务器大豆使用了ClassLoader技术,当决定创建自己的classLoader时,举要继承java.lang.ClassLoader或者它的子类,在实例化每一个classLoader对象时,需要制定一个副对象,如果没有指定的话,系统自动指定ClassLoader.getSystemClassLoader()为父对象

 

  8. Java CLass的加载采用委托模式,当调用一个ClassLoader.loadCLass()加载一个类的时候,遵循以下步骤:

  (1)检查类是否已经被加载进来(CLassLoader检查);

  (2)如果还没有加载,调用父对象(classLoader类的父类的对象)加载该类;

  (3)如果ClassLoader的父类的对象无法加载,调用ClassLoader对象的findClass()取得这个类

 

  所以创建自己的classLoader时,只需要重载findCLass()这个方法

 

 9. 在Java中,Java class的卸载仅仅是一种对系统的优化,有助于减少应用对内存的占用,既然是一种优化方法,就是JVM自行决定如何实现,对Java开发人员来说是完全透明的

   class or interface may be unloaded if and only if its class loader is unreachable,classes by the boostrap loader may not be unloaded

 

10.一个已经加载的类是无法被更新的,如果试图用一个classLoader再次加载同一个类,会得到异常,只能够重新创建一个新的classLoader实例来再次加载新类,至于原来已经加载的类,开发人员不必去管,因为它可能还有实例正在被使用,只要相关的实例都被内存回收,那么JVM就会在适当的时候把不再使用的类卸载(仅当类的classLoader被内存回收,不再reachabe的时候,类会被卸载)。

 

 

11. 类加载的表现形式,java中的类是动态加载的,类加载的三种形式

 

  Class A{}

  Class B{}

  Class C{}

 

  Class aa = A.class;

 

  Class bb = Class.forName("B"); = Class.forName("B",true,Loader.class.getClassLoader());

 

  Class cc =  ClassLoader.getSystemClassLoader().loadClass("C");

 

a.如果Class.forName的第二种形式的第二个参数设为false,类的static成员不会被初始化,static语句也不会执行,也就是类仅仅被加载了,并没有被初始化,为了保证类在加载后一定被初始化,可以使用Class.forName().newInstance()这样的语句。

b.最本质的方式是使用ClassLoader加载,所有的类最终都是通过ClassLoader加载的,

 

  Class cc = ClassLoader.getSystemClassLoader().loadClass("C");

 

  这里通过使用系统类加载器加载某个类,但是通过这种方式加载类,类是没有被初始化的,也就是初始化被延迟到真正使用的时候,不过,如果使用Class cc = ClassLoader.getSystemClassLoader().loadClass("C").newInstance()可以保证被加载后初始化

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值