类加载,内部类,及多态的实现

Java类加载,内部类,及多态的实现

一,java类加载的过程:
1.类加载的过程:
类加载的机制:
jvm把class文件加载到内存,并对数据进行校验,解析和初始化,最终形成居民可以直接使用的java类型的过程。

(1)装载阶段:
类加载器: Boostrap ClassLoader 启动类加载器 文件名地址 jre/lib/*.jar -> rt.jar
Ext ClassLoader 扩展类加载器 文件名地址jre/lib/ext/jar
AppClassLoader 应用类加载器 文件名地址 CLASSPATH
**

以上加载器依次遵循继承关系

类加载器的代理模式:双亲委派模型(双亲委托机制)
双亲委派:

例从应用类加载器开始 找之前是否加载过例,如果加载过,将加载产物Class对象返回。如果没有加载过,啧一次在其父类找知道Boostrap。在终极类加载器C/C++时返回为null,从Boostrap开始尝试向子类依次尝试加载,加载产物Class对象返回,直至最后路径找不到加载失败。

双亲委派模型的优点:1)安全
2)避免类的重复加载

如果一个类他的类加载器是启动类加载器,此时getClassLoader();返回值为null;因为类加载器的最终类加载器是c/c++。

(2)链接阶段:

验证: 文件格式验证,主次版本号
准备:准备阶段是正式为类变量分配内存并设置类变量初始值的阶段,这些变量所使用的内存都将在方法区中进行分配。coount在方法区中分配4字节内存,并赋类 型默认值0.
解析:将符号引用改为直接引用过程

(**3)初始化阶段:**对类的静态变量,静态代码块实质性初始化操作。
在Java中对类变量进行初始值设定有两种方式:
1)声明类变量是指定初始值。
2)使用静态代码块为类变量指定初始值。

Java内部类

Java内部类分为:实例内部类,静态内部类,匿名内部类,局部内部类。

1.实例内部类:

class  Outer{
class  inner{}
}

编译上述代码会产生两个文件:Outer.class和Outer$inner.class
2.静态内部类:
静态的含义是该内部类可以像其他静态成员一样,没有外部类对象时,也能够访问它。静态嵌套类不能访问外部类的成员和方法。

class  Outer{
static class Inner{}
}
class Test{
public static void main(String[] args){Outer.Inner  n =new  Outer.Inner();

}
}

3.匿名内部类:
匿名内部类就是没有名字的内部类。什么情况下需要使用匿名内部类?如果满足下面的一些条件,使用匿名内部类是比较合适的:

·只用到类的一个实例。

·类在定义后马上用到。

·类非常小(SUN推荐是在4行代码以下)

·给类命名并不会导致你的代码更容易被理解。

在使用匿名内部类时,要记住以下几个原则:

·匿名内部类不能有构造方法。

·匿名内部类不能定义任何静态成员、方法和类。

·匿名内部类不能是public,protected,private,static。

·只能创建匿名内部类的一个实例。

·一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。

·因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。

4.局部内部类:
向上造型:基类(基接口)引用派生类的对象(实现该接口的类对象)

他们之间的访问修饰符的区别:

1)修饰成员:

public 默认 protect private ->修饰成员
protect 《—》默认 包访问权限
继承:子类和父类定义在不同的包下,子类可以访问父类有protect。
2)修饰类:
2.1)修饰内部变量:public 默认 两种
2.2)修饰外部类:默认 public private protectde 四种

多态的实现

多态的实现原理:在这里插入图片描述

发生多态的三个条件:
1)继承
2 )方法的重写
3 )父类引用引用派生类对象(向上造型)

多态分为静多态和动多态

动多态(运行期多态/动态绑定)
运行期
静多态 :
静多态也称编译时的多态,就是我们所说的方法重载。相同的函数名,根据形参类型个数的不同调用不同的方 法。在编译期间就已经确定要调用的方法。
发生动态绑定的条件:
(1)继承 (2)重写 (3)向上改造

重写和重载的区别:
Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但可具有不同的参数列表、返回值类型。调用方法时通过传递的参数类型来决定具体使用哪个方法,这就是多态性。

Java的方法重写,是父类与子类之间的多态性,子类可继承父类中的方法,但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。重写的参数列表和返回类型均不可修改。
总结:
1 首先重载和重写他们所处的作用域范围不同。重载是在同一个类中进行方法的定义,重写是在父子类中进 行方法的定义。
2 其次,他们的定义方式也不同。重载是方法名相同,参数列表不同。而重写是方法名相同参数列表也相同。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值