Java多态的全面系统解析

目录
  • Java基础知识(多态)
    • 多态
    • 多态的定义和存在的必要条件
      • 多态的定义:
      • 多态存在的三个必要条件
  • 多态的案例
    • 多态的好处
    • 多态的弊端
  • 引用类型转换
    • 1.引用类型转换是什么,为什么需要它?
    • 2.向上转型(自动转换)
    • 3.向下转型(强制转换)
    • 4.向下转型的问题
    • 5.转型的异常
    • 6.instanceof关键字
  • 总结

茫茫人海千千万万,感谢这一秒你看到这里。希望我的能对你的有所帮助!共勉!

愿你在未来的日子,保持热爱,奔赴山海!

Java基础知识(多态)

多态

因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。

多态的定义和存在的必要条件

多态的定义:

  • 多态是指同一个行为具有多个不同表现形式或形态的能力。
  • 多态就是同一个接口,使用不同的实例而执行不同操作。

就举动物类的例子吧,cat和dog都是属于动物这一类,而动物呢,都有一个共同的行为就是吃吧,而不同的动物所吃的食物都大不相同吧!

呢,它喜欢吃鱼

而对于狗呢,它就比较喜欢啃骨头

所以多态就是对于吃这一行为来说,每种动物对吃这一行为所表现的行为都不尽相同。

多态存在的三个必要条件

  • 继承或者实现

在多态中必须存在有继承或者实现关系的子类和父类。

  • 方法的重写

子类对父类中某些方法进行重新定义(重写),在调用这些方法时就会调用子类的方法。

  • 基类引用指向派生类对象,即父类引用指向子类对象

父类类型:指子类对象继承的父类类型,或者实现的父接口类型。

✍多态的格式:

父类类型 变量名 = new 子类类型();

变量名.方法名();

多态格式可以充分体现了同一个接口,使用不同的实例而执行不同操作。

接下来我们具体来进行案例体会体会吧!

多态的案例

多态我们首先要知道的一点:

当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,执行的是子类重写后方法。如果子类没有重写该方法,就会调用父类的该方法。

总结起来就是:编译看左边,运行看右边。

首先我们先定义一个父类动物类,动物有吃的行为!

接着定义一个猫类和狗类去继承动物类,重写里面的吃行为!

☘️具体代码如下:

定义动物父类:

package com.nz.pojo;

/**
 * 先定义一个父类 --> 动物类
 * 动物都有一个吃的行为属性
 */
public class Animal {

    public void eat() {
        System.out.println("动物它们都会吃东西!!!");
    }
}

定义猫咪子类:

package com.nz.pojo;

/**
 * 定义猫类继承动物类,
 * 随之重写里面的吃行为,因为猫也有吃的行为,但是猫喜欢吃罐头
 */
public class Cat extends Animal{

    public void eat() {
        System.out.println("小喵咪都喜欢吃鱼罐头!");
    }
}

定义小狗子类:

package com.nz.pojo;

/**
 * 定义狗类继承动物类,
 * 随之重写里面的吃行为,因为狗也有吃的行为,但是狗喜欢啃骨头
 */
public class Dog extends Animal{

    public void eat() {
        System.out.println("小狗狗都爱啃骨头!");
    }
}

定义测试类,测试多态的形式:

package com.nz;

import com.nz.pojo.Animal;
import com.nz.pojo.Cat;
import com.nz.pojo.Dog;

/**
 * 测试多态的形式
 */
public class Demo {
    public static void main(String[] args) {

        // 多态形式,创建猫类对象
        Animal animal = new Cat();
        // 调用的是Cat的 eat
        animal.eat();

        // 多态形式,创建狗类对象
        Animal animal2 = new Dog();
        // 调用的是Dog的eat
        animal2.eat();
    }
}

得到的结果:

小喵咪都喜欢吃鱼罐头!
小狗狗都爱啃骨头!

类的大致结构:

可以看出我们可以使用多态的属性得到不同的动物的一个吃的行为属性!

多态的好处

提高了代码的拓展性,使用父类类型作为方法形式参数,传递子类对象给方法,进行方法的调用。

具体我们来看看吧:

继续使用上述的动物类、猫类、狗类吧。

定义测试类:

package com.nz;

import com.nz.pojo.Animal;
import com.nz.pojo.Cat;
import com.nz.pojo.Dog;

/**
 * 测试多态的好处
 */
public class Demo2 {
    public static void main(String[] args) {
        // 创建猫和狗对象
        Cat cat = new Cat();
        Dog dog = new Dog();

        // 调用catEat
        catEat(cat);
        // 调用dogEat
        dogEat(dog);

		/*
        多态的好处:
            以上各个动物的吃的方法, 我们都可以使用animalEat(Animal a)方法来代替。
            并且执行效果都一样, 所以我们可以使用animalEat直接替代了不同动物的吃方法。
        */
        animalEat(cat);
        animalEat(dog);
    }

    /*
        定义几个不同吃的方法,看看具体调用后的结果是什么吧!
     */
    public static void catEat (Cat cat){
        cat.eat();
    }

    public static void dogEat (Dog dog){
        dog.eat();
    }

    public static void animalEat (Animal animal){
        animal.eat();
    }
}

执行结果:

小喵咪都喜欢吃鱼罐头!
小狗狗都爱啃骨头!
小喵咪都喜欢吃鱼罐头!
小狗狗都爱啃骨头!

可以看出,由于多态的特性,我们的animalEat()方法传入的Animal类型参数,并且它是我们的Cat和Dog的父类类型,父类类型接收子类对象,所以我们可以将Cat对象和Dog对象,传递给animalEat()方法。

所以我们可以完全使用animalEat()方法来替代catEat()方法和dogEat()方法,达到同样的效果!以至于我们可以不必再单独写xxxEat()方法来传入指定的动物参数了,从而实现了实现类的自动切换。

所以多态的好处体现在:可以使我们的程序编写的更简单,并有良好的扩展性。

多态的弊端

从上面的多态的好处,可以看到我们可以使用父类的参数代替了某个子类的参数,从而达到程序的扩展!

但是对于某个子类有些独有的功能方法时,此时我们的多态的写法就无法访问子类独有功能了。

具体来瞧瞧?

代码如下:

重新定义下猫的子类:

package com.nz.pojo;

/**
 * 定义猫类继承动物类,
 * 随之重写里面的吃行为,因为猫也有吃的行为,但是猫喜欢吃罐头
 */
public class Cat extends Animal{

    public void eat() {
        System.out.println("小喵咪都喜欢吃鱼罐头!");
    }

    /**
     * 增加一哥猫咪特有的玩球方法()
     */
    public void playBall() {
        System.out.println("小喵咪都喜欢小球!");
    }
}

定义测试类:

package com.nz;

import com.nz.pojo.Animal;
import com.nz.pojo.Cat;

/**
 * 测试多态的弊端!
 */
public class Demo3 {
    public static void main(String[] args) {
        Animal animal = new Cat();

        animal.eat();

        animal.playBall();//编译报错,编译看左边,Animal没有这个方法
    }
}

可以看到动物类和猫类有个共同的eat吃方法,但是呢,猫咪多了个玩球球的方法。而对于动物对象来说,它本身动物类没有玩球球的方法,所以它的编译就直接没有通过了!

那有什么方法解决呢?且看下一章节吧!

引用类型转换

1. 引用类型转换是什么,为什么需要它?

从上面的多态的弊端的案例中,我们可以看到,我们使用动物对象时无法直接访问到猫类中的玩球球方法,这也就是我们之前说的编译看左边,运行看右边。

而在我们使用多态方式调用方法时,首先检查会左边的父类中是否有该方法,如果没有,则编译错误。也就代表着,父类无法调用子类独有的方法。、

所以说,如果编译都错误,更别说运行了。这也是多态给我们带来的一点小困扰,而我们如果想要调用子类特有的方法,必须做向下转型。

2. 向上转型(自动转换)

对于向下转型,我们先来讲解下向上转型的概念吧。

向上转型:

多态本身是子类向父类向上转换(自动转换)的过程,这个过程是默认的。当父类引用指向一个子类对象时,便是向上转型。

对于父类和子类的关系来说,具体来看图说话:

父类相对与子类来说是大范围的类型,Animal是动物类,是父类。而Cat是猫咪类,是子类。

所以对于父类Animal来说,它的范围是比较大的,它包含一切动物,包括猫咪类和小狗类。

所以对于子类类型这种范围小的,我们可以直接自动转型给父类类型的变量。

使用格式:

父类类型 变量名 = new 子类类型();

如:Animal animal = new Cat();

相当于有:
Animal animal = (Animal) new Cat();

相当于自动帮我们了一个隐形的转换为动物类的一个过程,因为动物本身就包含了猫咪。

3. 向下转型(强制转换)

向上转型可以知道它是子类自动转换为父类的一个过程,所以我们现在再来看看向下转型的定义:

向下转型:

向下转型就是由父类向子类向下转换的过程,这个过程是强制的。一个需要将父类对象转为子类对象,可以使用强制类型转换的格式,这便是向下转型。

为什么这种就必须自己强制加上一个类型转换过程呢?

对于父类和子类的关系来说,我们接着看图说话:

对于猫咪类的话,它在动物类中只是其中的一部分吧,而对于动物类来说,它有许多其他子类动物如狗,牛,猪等等。

所以对于动物父类想要向下转型的时候, 它此时不知道指向那个子类,因为不确定呀,所以就必须自己加上强制的类型转换的一个过程。

使用格式:

子类类型 变量名 = (子类类型) 父类变量名;
如:
Animal animal = new Cat();
Cat cat = (Cat) animal;
cat.playBall();// 此时我们就可以使用猫咪的特有方法啦

所以对于多态的弊端,无法使用子类特有的参数,我们也解决啦,可以通过向下转型的方法,从而将类型强制转换为某个子类对象后,再去调用子类的特有方法!

4. 向下转型的问题

虽然我们可以使用向下转型使得我们可以使用子类的独有方法,但是转型的过程中,一不小心就会遇到这样的问题了,来,我们来看看下面的代码:

public class Test {
    public static void main(String[] args) {
        // 向上转型
        Animal a = new Cat();
        a.eat();               // 调用的是 Cat 的 eat

        // 向下转型
        Dog d = (Dog)a;
        d.watchHouse();        // 调用的是 Dog 的 watchHouse 【运行报错】
    }
}

这段代码可以通过编译,但是运行时,却报出了 ClassCastException ,类型转换异常!这是因为,明明创建了Cat类型对象,运行时,当然不能转换成Dog对象的。

5. 转型的异常

转型的过程中,一不小心就会遇到这样的问题,请看如下代码:

定义狗类中额外的独有遛狗方法:

package com.nz.pojo;

/**
 * 定义狗类继承动物类,
 * 随之重写里面的吃行为,因为狗也有吃的行为,但是狗喜欢啃骨头
 */
public class Dog extends Animal{

    public void eat() {
        System.out.println("小狗狗都爱啃骨头!");
    }

    public void walk() {
        System.out.println("小狗在被我溜着!");
    }
}

定义测试类

package com.nz;

import com.nz.pojo.Animal;
import com.nz.pojo.Cat;
import com.nz.pojo.Dog;

/**
 * 测试多态的向下转型的问题
 */
public class Demo4 {
    public static void main(String[] args) {

        // 向上转型的过程
        Animal animal = new Cat();

        // 调用了猫咪的吃方法
        animal.eat();

        // 向下转型
        Dog dog = (Dog) animal;

        dog.walk(); // 调用的是 Dog 的 walk 可以通过,但是会运行报错
    }
}

得到结果:

小喵咪都喜欢吃鱼罐头!
Exception in thread "main" java.lang.ClassCastException: com.nz.pojo.Cat cannot be cast to com.nz.pojo.Dog
at com.nz.Demo4.main(Demo4.java:20)

我们可以看到,虽然我们的代码通过编译,但是终究在运行时,还是出错了,抛出了 ClassCastException 类型转换的异常。

其实我们可以知道,我们在上面的时候,创建了Cat类型对象,而在向下转型时,将其强行转换为了Dog类型,所以程序在运行时,就会抛出类型转换的异常!

那我们如何可以避免这种异常发生呢?且看下一节分析!

6. instanceof关键字

Java为我们提供一个关键字instanceof ,它可以帮助我们避免了ClassCastException 类型转换异常的发生。

那如何做呢?

格式:

变量名 instanceof 数据类型

解释:

  • 如果变量属于该数据类型或者其子类类型,返回true。
  • 如果变量不属于该数据类型或者其子类类型,返回false。

代码实现:

package com.nz;

import com.nz.pojo.Animal;
import com.nz.pojo.Cat;
import com.nz.pojo.Dog;

/**
 * 使用instanceof解决类型转换异常!
 */
public class Demo5 {
    public static void main(String[] args) {

        // 向上转型的过程
        Animal animal = new Cat();

        // 调用了猫咪的吃方法
        animal.eat();

        // 向下转型
        if (animal instanceof Cat){
            Cat cat = (Cat) animal;
            cat.playBall();        // 调用的是 Cat 的 playBall
        } else if (animal instanceof Dog){
            Dog dog = (Dog) animal;
            dog.walk();       // 调用的是 Dog 的 walk
        }
    }
}

结果:

小喵咪都喜欢吃鱼罐头!
小喵咪都喜欢小球!

可以发现,它可以帮助我们在做类型转换前,判断该类型是否属于该类型或者子类类型,如果是,我们就可以强转啦!

总结

相信各位看官都对Java中的特性之一多态的知识和使用有了一定了解,等待下一次更多Java基础的学习吧!

让我们也一起加油吧!本人不才,如有什么缺漏、错误的地方,也欢迎各位人才大佬评论中批评指正!

学到这里,今天的世界打烊了,晚安!虽然这篇文章完结了,但是我还在,永不完结。我会努力保持写文章。来日方长,何惧车遥马慢!

感谢各位看到这里!愿你韶华不负,青春无悔!

到此这篇关于Java多态的全面系统解析的文章就介绍到这了,更多相关Java 多态内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 新手小白入门必学JAVA面向对象之多态

    目录 1. 概念 2 . 特点 3. 练习:多态入门案例 4. 多态的好处 5. 多态的使用 6. 练习:多态成员使用测试 7 拓展 7.1 设计汽车综合案例 7.2 多态为了统一调用标准 7.3 静态变量和实例变量的区别 7.4 向上转型和向下转型 总结 1. 概念 多态是面向对象程序设计(OOP)的一个重要特征,指同一个实体同时具有多种形式,即同一个对象,在不同时刻,代表的对象不一样,指的是对象的多种形态. 可以把不同的子类对象都当作父类来看,进而屏蔽不同子类对象之间的差异,写出通用的代码,

  • java多态实现电子宠物系统

    本文实例为大家分享了java多态实现电子宠物系统的具体代码,供大家参考,具体内容如下 效果实现: 代码实现: 1.主人类: public class Master {     //领养     public Pet adopt(String name){         if ("狗狗".equals(name)){             return new Dog();         }else if (name.equals("企鹅")){        

  • Java中接口的多态详解

    目录 多态参数 多态数组 接口的多态传递现象 总结 多态参数 就像我们现实生活中电脑的usb接口,我们既可以接受手机对象,又可以接受相机对象,等等,体现了接口的多态,查看以下代码 接口: package InterfaceM; public interface Interface { public void join(); public void stop(); } 手机类: package InterfaceM; public class Phone implements Interface{

  • java多态中的就近原则介绍

    直接上题: 题目补充: class A { int m; //-10 int getM() { return m; } int seeM() { return m; } } class B extends A { int m ; //10 int getM() { // System.out.println(this.m+"............"+super.m); return m+10; } } public class Test { public static void ma

  • 详解Java面向对象编程之多态

    目录 Java面向对象编程之多态 一.对于多态的理解: 二.多态的实现方法 总结 Java面向对象编程之多态 一.对于多态的理解: 通俗点理解,多态其实就是一词多义,就是一种方法的多种状态,即不同的类对象,调用同一个方法名,有不同的实现效果,如下面这段代码块: public class Test { public static void main(String[] args) { Dog dog = new Dog("豆豆"); Cat cat = new Cat("花花&q

  • 浅谈Java封装、继承、多态特性

    目录 1.封装 2.继承 3.多态 4.上代码,效果运行放在最后 1.封装 什么是封装,谈谈自己对封装的理解,封装就是将类的信息(比如说类的属性)隐藏在类的内部,不允许外部程序直接访问.此时就要提到一个关键字private,他是一个权限修饰符,可以用来修饰成员(变量和方法),保护成员不被其他别的类来使用,如果需要被其他类来使用,那么需要提供对应的操作:a.提供get变量名()方法,用于获取成员变量的值 b.提供set变量名(参数),用于设置成员变量的值,同样也和get方法一样,都是用public

  • java面向对象继承与多态介绍

    目录 一.概述 二.继承 2.1 继承的概述 2.2 继承机制 2.3 类中属性,方法的继承与覆盖 2.4 super 关键字 三. 多态 总结 一.概述 面向对象程序设计的三大原则是封装性,继承性和多态性.继承性是子类自动共享父类的数据和方法的机制,它是由类的派生功能体现的.继承具有传递性,使得一个类可以继承另一个类的属性和方法,这样通过抽象出共同的属性和方法组件新的类,便于代码的重用.而多态是指不同类型的对象接收相同的消息时产生不同的行为,这里的消息主要是对类成员函数的调用,而不同的行为是指

  • Java继承与多态的正确打开方式

    目录 一.概述 二.继承 2.1 继承的概述 2.2 继承机制 2.3 类中属性,方法的继承与覆盖 1.属性的继承与覆盖 2.方法的继承与覆盖 2.4 super 关键字 三. 多态 总结 一.概述 面向对象程序设计的三大原则是封装性,继承性和多态性.继承性是子类自动共享父类的数据和方法的机制,它是由类的派生功能体现的.继承具有传递性,使得一个类可以继承另一个类的属性和方法,这样通过抽象出共同的属性和方法组件新的类,便于代码的重用.而多态是指不同类型的对象接收相同的消息时产生不同的行为,这里的消

  • Java之理解多态详解

    目录 一.多态的概念 二.多态的特点 三.instanceof操作符 四.多态的转型 1.向上转型 2.向下转型 五.方法重写 六.小结 一.多态的概念        继承关系使一个子类能继承父类的特征,并且附加一些新特征.子类是它的父类的特殊化,每个子类的实例都是其父类的实例,但是反过来不成立.例如:每个圆都是一个几何对象,但并非每个几何对象都是圆.因此,总可以将子类的实例传给需要父类型的参数.参考案例如下: public class PolymorphismDemo{ /** Main me

  • Java多态的全面系统解析

    目录 Java基础知识(多态) 多态 多态的定义和存在的必要条件 多态的定义: 多态存在的三个必要条件 多态的案例 多态的好处 多态的弊端 引用类型转换 1.引用类型转换是什么,为什么需要它? 2.向上转型(自动转换) 3.向下转型(强制转换) 4.向下转型的问题 5.转型的异常 6.instanceof关键字 总结 茫茫人海千千万万,感谢这一秒你看到这里.希望我的能对你的有所帮助!共勉! 愿你在未来的日子,保持热爱,奔赴山海! Java基础知识(多态) 多态 因为在程序运行时才确定具体的类,这

  • Java多态中动态绑定原理解析

    这篇文章主要介绍了Java多态中动态绑定原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 多态是面向对象程序设计非常重要的特性,它让程序拥有 更好的可读性和可扩展性. 发生在继承关系中. 需要子类重写父类的方法. 父类类型的引用指向子类类型的对象. 自始至终,多态都是对于方法而言,对于类中的成员变量,没有多态的说法. 一个基类的引用变量接收不同子类的对象将会调用子类对应的方法,这其实就是动态绑定的过程.在理解动态绑定之前,先补充一些概念.

  • Java面向对象编程之继承和多态以及包的解析与使用范例

    目录 1.继承 1.1继承的基本使用 1.2 protected 关键字 1.3 final 关键字 2.多态 2.1向上转型 2.2动态绑定 2.3方法重写 2.4向下转型 2.5super 关键字 2.5.1 super 关键字的基本用法 2.5.2 this和super的区别 3.包的使用 3.1导入包中的类 3.2常见系统包 1.继承 为什么要有继承? 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中, 那么多个类无需再定义这些属性和行为,只要继承那个类即可. 此处的多个类称为

  • 深入解析Java多态进阶学习

    目录 1.动态绑定机制 实例A 实例B 实例C 2.多态数组 3.多态数组的高阶用法 4.多态参数 5.多态参数的高阶用法 1.动态绑定机制 java的动态绑定机制非常重要 实例A 我们来看一个实例: 阅读上面的代码,请说明下面的程序将输出什么结果: 程序将会输出40和30,这个实例很简单,直接看运行类型即可,该代码的运行类型为B,所以会调用B类的方法 实例B 我们将上面的代码变通一下,将子类中的如下代码块注销: 随后继承机制会访问父类的sum方法: 那么这里有一个问题,此处的getI(),会执

  • Java Web开发入门书籍实例解析(总结一)

    从事Java Web开发这一段时间来,对Java 面向对象的思想和MVC开发模式可以说已经熟悉了.我当前参与的项目使用的框架是Spring.SpringMVC.Hibernate.下面我们小编给大家整理一篇教程帮助大家学习javaweb相关知识,感兴趣的朋友可以参考下. 一.基本概念 1.1.WEB开发的相关知识 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资源分为: 1.静态web资源(如html 页面):指w

  • Java数组越界问题实例解析

    Java中数组初始化和OC其实是一样的,分为动态初始化和静态初始化, 动态初始化:指定长度,由系统给出初始化值 静态初始化:给出初始化值,由系统给出长度 在我们使用数组时最容易出现的就是数组越界问题,好了,这里有个简单的例子 int [][] array = {{1,2,3},{1,4}}; System.out.println(array[1][2]); 这是一个二维数组,很明显,数组越界了,控制台中会打印如下信息: Exception in thread "main" java.l

  • Java环境配置原理全面解析

    Java环境配置原理详解 1.Jdk安装目录文件说明: 一般jdk安装目录及路径 \Java\jdk1.7.0_79\lib,里面主要包含以下文件夹. bin:主要存放的是java工具中常用命令如:java,javac等. db:安装java db的路径. include:一些平台特病的头文件. jre:运行java程序所需的jre环境. lib:jdk工具命令的实际存放位置,如:bin中javac命令,实际是lib中tools.jar\sun\tools\javac中的Main.class文件

  • 详解Java多态对象的类型转换与动态绑定

    Java多态对象的类型转换 这里所说的对象类型转换,是指存在继承关系的对象,不是任意类型的对象.当对不存在继承关系的对象进行强制类型转换时,java 运行时将抛出 java.lang.ClassCastException 异常. 在继承链中,我们将子类向父类转换称为"向上转型",将父类向子类转换称为"向下转型". 很多时候,我们会将变量定义为父类的类型,却引用子类的对象,这个过程就是向上转型.程序运行时通过动态绑定来实现对子类方法的调用,也就是多态性. 然而有些时候

  • Java中类加载过程全面解析

    类文件加载的顺序 1.先加载执行父类的静态变量及静态初始化块(执行先后顺序按排列的先后顺序) 2.再加载执行本类的静态变量及静态初始化块 只要类没有被销毁,静态变量及静态初始化块只会执行1次,后续再对该类进行其他操作也不会再执行这两个步骤. 类实例创建过程 只有在调用new方法时才会创建类的实例 1.按照上面类文件加载的顺序(类已被加载则跳过此步) 2.父类的非静态变量及非静态初始化块 3.父类的构造方法 4.本类的非静态变量及非静态初始化块 5.本类的构造方法 4.类实例销毁时候,首先销毁子类

  • Java Classloader机制用法代码解析

    做Java开发,对于ClassLoader的机制是必须要熟悉的基础知识,本文针对Java ClassLoader的机制做一个简要的总结.因为不同的JVM的实现不同,本文所描述的内容均只限于Hotspot Jvm. 本文将会从JDK默认的提供的ClassLoader,双亲委托模型,如何自定义ClassLoader以及Java中打破双亲委托机制的场景四个方面入手去讨论和总结一下. JDK默认ClassLoader JDK 默认提供了如下几种ClassLoader Bootstrp loader Bo

随机推荐