首页
学习
活动
专区
圈层
工具
发布

创建子类对象时,父类构造函数中调用被子类重写的方法为什么调用的是子类的方法?

A对象的时候父类会调用子类方法?...但是:创建B对象父类会调用父类的方法? 答案: 当子类被加载到内存方法区后,会继续加载父类到内存中。...如果,子类重写了父类的方法,子类的方法引用会指向子类的方法,否则子类的方法引用会指向父类的方法引用。 如果子类重载了父类方法,则子类重载方法引用还指向子类方法。...如果子类方法没有重写也没有重载父类方法,则方法引用会指向父类方法。 当子类对象创建时,会先行调用父类的构造方法(构造方法也是方法),虚拟机会在子类方法区寻找该方法并运行。...但是:由于java语言是静态多分派,动态单分派。其结果是当编译的时候,父类构造方法调用的方法的参数已经强制转换为符合父类方法的参数了。 上边代码在编译前已经转换为下面这个样子的了。

9.5K10

scala 类型 的最详细解释

scala 是一个强类型的语言,但是在编程时可以省略对象的类型. java中对象类型(type)与类(class)信息 jdk1.5 前 类型与类是一一映射,类一致类型就一致. 1.5 后引入了泛型,jvm...= A // 获取类信息 classOf[A] res52: Class[A] = class A 对象获得类信息 另外java 中对象获取类信息可以通过 getClass方法,scala继承了这个方法...scala> b1.getClass res8: Class[_ <: a1.B] = class A$B // 嵌套类的类信息是一致的是 A&B scala> b1.getClass == b2...类是面向对象系统里对同一类数据的抽象,在没有泛型之前,类型系统不存在高阶概念,直接与类一一映射,而泛型出现之后,就不在一一映射了。...类更多存在于面向对象语言,非面向对象语言也有“结构体”等与之相似的概念;类是对数据的抽象,而类型则是对数据的”分类”,类型比类更“具体”,更“细”一些。

1.2K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    《零基础 Java 开发 》 第五章 数组第五章 数组

    java> numbers instanceof Object java.lang.Boolean res2 = false 上面的数组对象的声明其实跟普通类的对象声明是一样的 java> class...数组在Java中其实也是一个对象,数组实例同样是使用new操作符创建的。...创建一个数组对象实例 因为数组是引用类型,它的元素相当于类的成员变量,因此数组分配空间后,每个元素也被按照成员变量的规则被隐式初始化。...当使用 int[] 类型声明数组时, ArrayList 构造函数这里的array 参数类型是 int[1][] ,如下图所示 ?...,调用 sort 方法时,传入的数组中的元素不能有 null 值,否则会报空指针异常 String[] s = {"JS", "Java", "Kotlin", "Scala", null, null,

    1.4K30

    学好Spark必须要掌握的Scala技术点

    但在Scala中:这些操作符实际上是方法。例如:a + b是a.+(b)方法调用的简写:a 方法 b可以写成 a.方法(b)。...classOf和getClass区别: getClass方法得到的是Class[A]的某个子类,而classOf[A]得到是正确的 Class[A],但是去比较的话,这两个类型是equals为true的...主要作用: 1)存放工具方法和常量 2)高效共享单个不可变的实例 3)单例模式 2.伴生对象 单例对象,不需要new,用【类名.方法】调用单例对象中的方法 伴生对象 在scala的类中,与类名相同且与该类在同一个文件的对象叫伴生对象...类和伴生对象之间可以相互访问私有的方法和属性,但类的字段被private[this]修饰的只有本类能访问 3.2.2 应用程序对象 Scala程序都必须从一个对象的main方法开始,可以通过扩展App...apply方法,当遇到类名(参数1,...参数n)时apply方法会被调用。

    2.2K50

    Scala语言快速了解一下?

    AnyAny是所有其他类的超类AnyRefAnyRef类是Scala里所有引用类(reference class)的基类上表中列出的数据类型都是对象,也就是说scala没有java中的原生类型。...在scala是可以对数字等基础类型调用方法的,即数字也是一个对象,不是一个字面量。...Scala 中使用单例模式时,除了定义的类之外,还要定义一个同名的 object 对象,它和类的区别是,object对象不能带参数。...当单例对象与某个类共享同一个名称时,他被称作是这个类的伴生对象:companion object。你必须在同一个源文件里定义类和它的伴生对象。...实例中我们使用 Unapply 方法从对象中提取用户名和邮件地址的后缀。提取器使用模式匹配,在我们实例化一个类的时,可以带上0个或者多个的参数,编译器在实例化的时会调用 apply 方法。

    3.9K102

    Scala 高阶(七):集合内容汇总(上篇)

    类似 于 java 中 StringBuilder 对象 Scala中的集合都是引用类型,并不关心指向的对象中的内容,只关心当前指向的对象。...不可变集合 整体继承图(来源于网络) Scala中的Set 和 Map集合包含的类与Java相类似,不同的是Seq下面分为IndexedSeq和LinearSeq两个特质。...添加元素时:在前,对象在前,:在后,对象在后。...(arr) println(newArray1) println(arr == newArray1) // false // 可变数组添加元素调用 += 方法,添加完后无需赋给新的数组对象...本身是一个抽象类,不能使用new对象的方式,使用半生对象的apply方法进行创建 遍历集合 list.foreach(println) 访问元素 println(list(1)) 添加元素 +: :

    1.3K20

    02.Scala:面向对象、Object、抽象类、内部类、特质Trait

    类和对象 scala是支持面向对象的,也有类和对象的概念。我们依然可以基于scala语言来开发面向对象的应用程序。...类的构造器 当创建类对象的时候,会自动调用类的构造器。之前使用的都是默认构造器,我们接下来要学习如何自定义构造器。...) 定义Customer类的辅助构造器,该辅助构造器接收一个数组参数,使用数组参数来初始化成员变量 使用Person类的辅助构造器来创建一个"zhangsan"对象 姓名为张三 地址为北京 打印对象的姓名...特质(trait) scala中没有Java中的接口(interface),替代的概念是——特质 14.1 定义 特质是scala中代码复用的基础单元 它可以将方法和字段定义封装起来,然后添加到类中 与类继承不一样的是...一个类继承另一个类、以及多个trait,当创建该类的实例时,它的构造顺序如下: 执行父类的构造器 从左到右依次执行trait的构造器 如果trait有父trait,先构造父trait,如果多个trait

    1.6K10

    Scala:面向对象、Object、抽象类、内部类、特质Trait(二)

    类和对象 scala是支持面向对象的,也有类和对象的概念。我们依然可以基于scala语言来开发面向对象的应用程序。...类的构造器 当创建类对象的时候,会自动调用类的构造器。之前使用的都是默认构造器,我们接下来要学习如何自定义构造器。...) 定义Customer类的辅助构造器,该辅助构造器接收一个数组参数,使用数组参数来初始化成员变量 使用Person类的辅助构造器来创建一个"zhangsan"对象 姓名为张三 地址为北京 打印对象的姓名...特质(trait) scala中没有Java中的接口(interface),替代的概念是——特质 14.1 定义 特质是scala中代码复用的基础单元 它可以将方法和字段定义封装起来,然后添加到类中 与类继承不一样的是...一个类继承另一个类、以及多个trait,当创建该类的实例时,它的构造顺序如下: 执行父类的构造器 从左到右依次执行trait的构造器 如果trait有父trait,先构造父trait,如果多个trait

    1.1K10

    Scala 【 13 类型参数 】

    类型参数 ​ Scala 的类型参数其实意思与 Java 的泛型是一样的,也是定义一种类型参数,比如在集合,在类,在函数中,定义类型参数,然后就可以保证使用到该类型参数的地方,就肯定,也只能是这种类型。...Scala 自动推断泛型类型特性:直接给使用了泛型类型的 field 赋值时, Scala 会自动进行类型推断。...与泛型类一样,你可以通过给使用了泛型类型的变量传递值来让 Scala 自动推断泛型的实际类型,也可以在调用函数时,手动指定泛型类型。...比如,我们可能要求某个泛型类型,它就必须是某个类的子类,这样在程序中就可以放心地调用泛型类型继承的父类的方法,程序才能正常的使用和运行。此时就可以使用上下边界 Bounds 的特性。 ​...Scala的上下边界特性允许泛型类型必须是某个类的子类,或者必须是某个类的父类。

    1.2K20

    Spark基础-scala学习(二、面向对象)

    res3: Int = 2 伴生对象 如果有一个class,还有一个与class同名的object,那么就称这个object是class的伴生对象,class是object的伴生类 伴生对象伴生类和伴生对象必须放在一个...而创建伴生类的对象时,通常不会使用new Class的方式,而是使用Class()的方式,隐式地调用伴生对象的apply方法,这样会让对象创建更加简洁 比如,Array类的伴生对象的apply方法就实现了接收可变数量的参数...> s res9: Student = Student@2d7e6c8c getClass和classOf isInstanceOf只能判断对象是否是指定类以及其子类的对象,而不能精确判断出,对象就是指定类的对象...如果要求精确地判断对象就是指定类的对象,那么就只能使用getClass和classOf了 对象.getClass可以精确获取对象的类,classOf[类]可以精确获取类,然后使用==操作符即可判断 scala...;因此子类的辅助constructor是一定不可能直接调用父类的constructor的 只能在子类的主constrctor中调用父类的constructor scala> :paste // Entering

    89130

    大数据--scala学习第一章:基础第二章:控制结构和函数第三章:数组第四章:字典和元组第五章:类第六章:对象第七章:包和引入第八章:继承第九章文件和正则表达式第十章特质:接口第十一章操作符第十二章函

    10、for循环与yield结合使用,则整个循环语句返回的结果是一个集合,当for循环中有两个生成器时返回结果使用第一个生成器兼容的格式:for(i i % 3 //...可以在任可语法中使用嵌套类,Scala中每个实例对象都有它自己的嵌套类,也就是说两个实例的嵌套类是不同的两个类。...2、在Scala中一个非抽象方法重写时必须使用override修饰符如:override def toString=getClass.geName+super.toString+”peace”。...3、测试某个对象属于哪个类使用isInstanceOf方法,当对象是该类或者子类的对象时返回True. 4、Scala中也有protected修饰符,与java中的一样 5、子类的辅助构造器不能调用父类的构造器只能通过子类的主构造器进行调用形式如下...2、当对象访问一个不存在的成员时。3、当对象调用某个方法,传入的参数类型不对时。

    5.1K20

    调用Thread类的方法:public final String getName() 为什么得到的线程对象的名称默认是:Thread-0、Thread-1、Thread-2、...呢?

    调用Thread类的方法:public final String getName() 为什么得到的线程对象的名称默认是:Thread-0、Thread-1、Thread-2、...呢?...super(); } } 由以上可知,由MyThread my1 = new MyThread(); 第一次调用无参构造的时候,就会去父类thread 调用位无参构造,而父类的无参构造是一系列的...init() 方法,最终得到 Thread-0,启动线程后,再通过Thread类的getName()方法得到线程对象的名称。...同理,MyThread my2 = new MyThread(); 第二次调用无参构造的时候,就会去父类thread 调用位无参构造,而父类的无参构造是一系列的init() 方法,最终得到 Thread...-1,启动线程后,再通过Thread类的getName()方法得到线程对象的名称。

    1K20

    带你快速掌握Scala操作———(5)

    抽象类 和Java语言一样,scala中也可以定义抽象类 定义 如果类的某个成员在当前类中的定义是不包含完整的,它就是一个抽象类 不完整定义有两种情况: 1....println(p2.WHO_AM_I) } } 5、匿名内部类 匿名内部类是没有名称的子类,直接用来创建实例对象。...——特质 定义 • 特质是scala中代码复用的基础单元 • 它可以将方法和字段定义封装起来,然后添加到类中 • 与类继承不一样的是,类继承要求每个类都只能继承一个超类,而一个类可以添加任意数量的特质。...在scala中,trait是可以定义抽象方法,也可以定义具体方法的  trait中定义了一个抽象方法  trait中定义了其他的几个具体方法,会调用抽象方法  其他实现类可以来实现抽象方法  真正调用...类中调用多个tait中都有这个方法时,首先会从最右边的trait方法开始执行,然后依次往左执行,形成一个调用链条。 示例 实现一个模拟支付过程的调用链 ? 步骤 1.

    69720

    Scala学习教程笔记二之函数式编程、Object对象、伴生对象、继承、Trait、

    1:Scala之函数式编程学习笔记: 1:Scala函数式编程学习: 1.1:Scala定义一个简单的类,包含field以及方法,创建类的对象,并且调用其方法: class User...而创建伴生类的对象时,通常不会使用new Class的方式,而是使用Class()的方式,隐式的调用伴生对象得到apply方法,这样会让对象创建更加简洁: 2.1:比如,Array类的伴生对象的...如果要求精确的判断对象就是指定类的对象,那么只能使用使用getClass和classOf了。     ...constructor,在scala中,每个类可以有一个主constructor和任意多个辅助constructor,而每个辅助constructor的第一行都必须是调用其他辅助constructor或者是主...,就是通过子类的主构造函数来调用父类的构造函数;如果是父类中接受的参数,比如name和age,子类中接受时,就不要用任何val或者var来修饰了,否则会认为是子类要覆盖父类的field;

    1.4K60

    Scala 【 8 面向对象编程 - 继承 】

    对象 .getClass 可以精确获取对象的类, classOf[类] 可以精确获取类,使用 == 操作符即可判断。...constructor 在 Scala 中,每个类可以有一个主 constructor 和任意多个辅助 constructor,而每个辅助 constructor 的第一行都必须是调用其他辅助 constructor...或者是主 constructor,因此子类的辅助 constructor 是一定不可能直接调用父类的 constructor 的。...如果是父类中接收的参数,比如 name 和 age,子类中接受时,就不要用任何 val 或者 var 来修饰了,否则认为是子类要覆盖父类的 field 。...在类中如果有一个抽象方法,那么类就必须用abstract 来声明为抽象类,此时抽象类是不可以实例化的。 在子类中覆盖抽象类的抽象方法时,不需要使用 override 关键字。

    52840

    spark开发基础之Scala详解apply方法

    这里自己总结下:包括摘录及个人经验,希望可以加深大家的理解 什么情况下会调用apply方法 当遇到下面表达式时,apply方法会被调用:Object(参数1,参数2。。。。...参数N) 通常这样一个方法返回的是伴生对象。 举例来说:Array对象定义了apply,我们可以用下面形式来数组 Array("about”,"yun","com") 为什么不使用构造器?...(补充:Scala中同名和类和对象分别称之为伴生类和伴生对象) 为了加深理解,我们在换另外一个说法 半生对象中有一个apply方法 构造类的时候一般不用new A() 上面不知你是否理解,这样我们在反过来...显然这样是不行的。但是在Scala中,很多类默认都是由伴生对象的,所以我们可以简化类的实例。这样apply方法你是否理解了。...对象调用apply方法 apply除了实例化作用,我们看到实例化的对象,还可以a();这样,这时候调用的是类的apply方法,而非伴生对象的。

    2.4K60

    Scala学习教程笔记三之函数式编程、集合操作、模式匹配、类型参数、隐式转换、Actor、

    因为Java是完全面向对象的编程语言,没有任何面向过程编程语言的特性,因此Java中的一等公民是类和对象,而且只有方法的概念,即寄存和依赖于类与对象中的方法。...Java中的方法是绝对不可能脱离类和对象独立存在的。 1.2:Scala是一门既面向对象,又面向过程的语言。...在Scala中,函数和类,对象等一样,都是一等公民。Scala中的函数可以独立存在,不需要依赖于任何类与对象。 1.3:Scala的函数式编程,就是Scala面向过程的最好的佐证。...Scala的上下边界特性允许泛型类型必须是某个类的子类,或者必须是某个类的父类。...也就是说,可以为,某个类定义一个加强版的类,并定义互相之间的隐式转换,从而让源类在使用加强版的方法时,由Scala自动进行隐式转换为加强肋,然后再调用该方法。

    3.4K50

    2021年大数据常用语言Scala(三十):scala面向对象 继承(extends)

    ]       println(s2)     }   } } getClass和classOf isInstanceOf 只能判断出对象是否为指定类以及其子类的对象,而不能精确的判断出,对象就是指定类的对象...如果要求精确地判断出对象就是指定类的对象,那么就只能使用 getClass 和 classOf 。...无法访问     println(p.name)   } } 调用父类的constructor 实例化子类对象,必须要调用父类的构造器,在scala中,只能在子类的主构造器中调用父类的构造器 步骤: 创建一个...创建Student对象实例,并打印它的姓名、班级 代码: class Person5(var name:String) // 直接在父类的类名后面调用父类构造器 class Student5(name:...    println(p2.WHO_AM_I)   } } 匿名内部类 匿名内部类是没有名称的子类,直接用来创建实例对象。

    67320
    领券