java 笔记

RTTI : RTTI(Run-Time Type Information),通过运行时类型信息程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型。

java 使用CLass对象来执行RTTI,即使正在使用转型的操作.
所有的类都是在第一次对其使用时,动态加载到jvm中,当创建第一个对类的静态成员引用时,类被加载.
这个证明构造器也是静态方法,只是没有static关键字.因此,new关键字创建的对象也会被当做对类的静态成员的引用.

Class.forName:返回与给定的字符串名称相关联类或接口的Class对象。
Class.forName是一个静态方法,同样可以用来加载类。如果类还没有被加载就进行加载同时初始化类信息.

forName这句话就是装载类用的(new是根据加载到内存中的类创建一个实例,要分清楚)。
Class的newInstance方法是实现"虚拟构造器"的一种方式.虚拟构造器允许你声明"我不知道你的类型,但是可以正确的创建你自己".newInstance调用的是无参构造方法,没有则会报出异常.

java 类字面常量 : 例如 A.clalss 作用 : 生成对Class对象的引用.可以用于普通类还可以用于接口,数组,基本类型. 字面常量对Class对象的引用不会自动初始化Class对象.

类的加载三步骤 :
1.加载 : 类加载器加载.class文件,并通过字节码生成Class对象
2.链接 : 在链接阶段验证类中的字节码,为静态域分配存储空间,如果必须的话,解析这个类对其他类的所有引用
3.初始化 : 如果该类具有超类,则对其进行初始化,并且执行静态初始化器和静态初始化块.

在使用字面量常量时,如果一个值是static final"编译期常量".不需要对改类初始化就可读取,如果只是static和final之一,会先初始化后进行读取.也就是说只是static不是final,那么对它的访问总是先链接,初始化该类再后才能读取.
所以字符串常量应该尽量写成static final

Class引用总是指向某一个Class对象,它可以制作类的实例,并包含可作用于该实例的所有方法代码,包括静态成员.
Class引用表示的就是它所指向的对象的确切类型,而该对象便是Class类的一个对象.

Class<?>由于Class,几遍他们是等价的.Class<?>可以帮助进行类型检查。

Class.cast()用于类型转换 :
参数为要转型的对象,并 将其转为Class的引用类型
示例 :

class A {}
class B extends A {}

A a = new A();
CLass<B> classB = B.Class;
B b = classB.cast(a);

Java 类加载器,双亲委派机制的核心思想

双亲委派模型的工作过程是:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父加载器反馈自己无法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去加载。

protected synchronized Class<?>loadClass(String name,boolean resolve)throws ClassNotFoundException
{
//首先,检查请求的类是否已经被加载过了
Class c=findLoadedClass(name);
if(c==null){
try{
if(parent!=null){
c=parent.loadClass(name,false);
}else{
c=findBootstrapClassOrNull(name);
}
}catch(ClassNotFoundException e){
//如果父类加载器抛出ClassNotFoundException
//说明父类加载器无法完成加载请求
}
if(c==null){
//在父类加载器无法加载的时候
//再调用本身的findClass方法来进行类加载
c=findClass(name);
}
}
if(resolve){
resolveClass(c);
}
return c;
}

在这里插入图片描述

对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立其在Java虚
拟机中的唯一性,每一个类加载器,都拥有一个独立的类名称空间。这句话可以表达得更通俗一些:比较两个类是否“相等”,只有在这两个类是由同一个类加载器加载的前提下才有意义

正常情况都是使用应用程序类加载器进行类加载

java方法调用分静态和动态,方法调用在虚拟机的栈中,每一方法对应一个栈帧(方法用到的数据,包括局部变量表,操作数栈,动态链接,方法返回地址)

方法调用并不等同于方法执行,方法调用阶段唯一的任务就是确定被调用方法的版本(即调用哪一个方法),暂时还不涉及方法内部的具体运行过程。在程序运时,进行方法调用是最普遍、最频繁的操作,但前面已经讲过,Class文件的编译过程中不包含传统编译中的连接步骤,一切方法调用在Class文件里面存储的都只是符号引用,而不是方法在实际运行时内存布局中的入口地址(相当于之前说的直接引用)。这个特性给Java带来了更强大的动态扩展能力,但也使得Java方法调用过程变得相对复杂起来,需要在类加载期间,甚至到运行期间才能确定目标方法的直接引用。

方法版本指实际执行的对应方法,比如是父类的还是子类的。
静态调用由于在编译期就能确定调用版本,所以编译期直接使用方法引用地址,动态调用需要在运行阶段才能确定所以没有方法引用地址。

简单理解就就行静态调用性能高,动态灵活但是性能相对低。

静态调用包括:静态static方法,实例构造器<init>方法、私有方法和父类方法,
final 方法由于不能被覆盖重写,所以也是静态方法

动态调用包括:所有的虚方法,接口方法,会在运行时再确定一个实现此接口的对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java笔记是由北京大学青鸟教育推出的一款专门针对Java语言的学习工具。它以全面、系统、实践为特点,通过详细的代码示例和清晰的讲解,帮助学习者全面掌握Java编程语言。 Java笔记采用了线上与线下相结合的学习模式。学员可以通过手机、平板电脑、电脑等设备在线学习,还可以在学习过程中随时记录自己的学习笔记。同时,北大青鸟还为学员提供线下实践环境,学员可以在实验室里亲自动手实践所学知识,加深理解和应用。 Java笔记的内容非常全面,包括了Java语言的基本语法、面向对象编程、异常处理、流操作、多线程、数据库操作等众多知识点。除了理论知识,Java笔记还提供了大量的实例代码,可供学员参考和模仿。这样的学习方式既帮助学员理解Java的基本概念,又能让他们运用所学知识解决实际问题。 与此同时,Java笔记还注重学员的互动交流。在学习过程中,学员可以利用笔记功能记录学习心得和疑惑,还可以在论坛上与其他学员进行讨论和交流。这种互动形式既能促进学员之间的学习互助,也能更好地帮助学员理解和应用所学知识。 总之,Java笔记是北大青鸟推出的一款专注于Java语言学习的工具,通过系统的课程设置、丰富的实例代码和互动交流的方式,帮助学员全面掌握Java编程知识,提升编程能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值