14.多态

1.继承

上一片笔记中已经写了很多多态的东西,因为继承是多态的基础

2.多态

面向对象的三个特征:1.抽象、2.继承、3.多态

2.1 多态

我的理解,欢迎讨论

多态(Polymorphism)按字面的意思就是"多种状态",在运行的时候会根据传入的参数,做出不同的动作。

1.在JAVA中,接口中函数的可以有多种不同的实现方式,某个函数使用该接口作为参数的时候,在运行时根据具体的类型,决定调用哪一个实现类的同名函数

2.JAVA中还可以通过重写父类的方法实现多台,使用父类的引用指向子类的对象,对象会向上转型,通过引用调用该重写的函数,会调用子类的函数

2.2 向上转型

 使用父类或者接口的引用指向子类的对象

class Father{
        public int num=10;
        public void f(){
              System.out.println("1");
        }  
}

class Son extends Father{
        public int num=20;
        public void f(){
              System.out.println("2");
        }
        
        public void display(){}
}

public class Main{
      public static void main(String[] args){
  
    Father father=new Son();//向上转型
    System.out.println(father.num);
    father.f();
    father.g();
    } 
}

 说明:

1.father对象会向上转型,也就是说father引用调用不了函数display了

2.father.num//结果10,因为属性不存在动态绑定

3.father.f()//结果2,多态的缘故,调用的是子类的函数

4.father.g()//结果1,动态绑定不支持static函数,对象引用调用静态函数的方式特别的不好。

2.3 动态绑定

Java中的函数绑定

  • 方法调用与方法主体之间的关联关系
  • eg:Instrument类 play()函数
  •       Wind、Brass都是Instrument的子类,都对父类的play()进行了覆盖
  •       有一个函数public void tune(Instrument instrument){instrument.play();}
  • 1.前期绑定:编译时就知道调用哪个函数体
  • 2.后期绑定:编译器不知道instrument对象调用的是哪个对象的play函数,运行时确定
  • Java中的函数绑定:
  • 除了static、final、private修饰的函数是前期绑定之外,所有的函数都是后期绑定
  • 所以传入函数的参数最好都是基类的对象

2.4 动态连接

Java的类加载过程分为以下的七个步骤

  • 加载、验证、准备、解析、初始化、使用、卸载

  • 其中验证、准备、解析称为java的连接过程、这几个过程并不是顺序进行的,其中Java的解析过程可以发生在初始化之前、也可以发生在初始化之后,这是为了支持Java的动态绑定机制
  • 解析其其实把Java的符号引用转换为直接引用的过程,直接引用可以确定具体调用的函数

      • 符号引用:位于常量池的Constant_Class_info,Constant_Filed_info,Constant_Methodref_info中,通过其中的索引可以找到常量表中对应的类、方法、字段信息
      • 直接引用:目标对象的指针,或者说是操作句柄,与内存的布局相关,一般一个符号引用解析出来的直接引用一般是不一样的,一个对象有直接引用说明它已经存在于内存中了


2.5 动态加载

类加载

类加载器加载类的顺序如下:
1、检查这个类是否已经被加载。
2、如果没有被加载,则首先调用父加载器加载。
3、如果父加载器不能加载这个类,则尝试加载这个类。


动态类加载--运行时加载类

动态加载一个类十分简单。你要做的就是获取一个类加载器然后调用它的loadClass()方法。下面是个例子:

public class MainClass {

  public static void main(String[] args){

    ClassLoader classLoader = MainClass.class.getClassLoader();

    try {
        Class aClass = classLoader.loadClass("com.jenkov.MyClass");
        System.out.println("aClass.getName() = " + aClass.getName());
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }

}


参考文献:

[1].http://blog.youkuaiyun.com/sureyonder/article/details/5569617

[2].http://ifeve.com/dynamic-class-loading-reloading/

 

乐播投屏是一款简单好用、功能强大的专业投屏软件,支持手机投屏电视、手机投电脑、电脑投电视等多种投屏方式。 多端兼容与跨网投屏:支持手机、平板、电脑等多种设备之间的自由组合投屏,且无需连接 WiFi,通过跨屏技术打破网络限制,扫一扫即可投屏。 广泛的应用支持:支持 10000+APP 投屏,包括综合视频、网盘与浏览器、美韩剧、斗鱼、虎牙等直播平台,还能将央视、湖南卫视等各大卫视的直播内容一键投屏。 高清流畅投屏体验:腾讯独家智能音画调校技术,支持 4K 高清画质、240Hz 超高帧率,低延迟不卡顿,能为用户提供更高清、流畅的视觉享受。 会议办公功能强大:拥有全球唯一的 “超级投屏空间”,扫码即投,无需安装。支持多人共享投屏、远程协作批注,PPT、Excel、视频等文件都能流畅展示,还具备企业级安全加密,保障会议资料不泄露。 多人互动功能:支持多人投屏,邀请好友加入投屏互动,远程也可加入。同时具备一屏多显、语音互动功能,支持多人连麦,实时语音交流。 文件支持全面:支持 PPT、PDF、Word、Excel 等办公文件,以及视频、图片等多种类型文件的投屏,还支持网盘直投,无需下载和转格式。 特色功能丰富:投屏时可同步录制投屏画面,部分版本还支持通过触控屏或电视端外接鼠标反控电脑,以及在投屏过程中用画笔实时标注等功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值