首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

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

6.2K10

放弃dagger?Anrdoi依赖注入框架koin

Koin 是什么 Koin 是为 Kotlin 开发者提供的一个实用型轻量级依赖注入框架,采用纯 Kotlin 语言编写而成,仅使用功能解析,无代理、无代码生成、无反射。...代码更具可读性 省去写单例的方法 解耦 假如不用依赖注入的话,一个类的new代码是非常可能充斥在app的多个类中的,假如该类的构造函数发生变化,那这些涉及到的类都得进行修改。...也就是说inline关键字实际上增加了代码量,但是提升了性能,而且增加的代码量是在编译期执行的,对程序可读性不会造成影响 Reified 由于 Java 中的泛型存在类型擦除的情况,任何在运行时需要知道泛型确切类型信息的操作都没法用了...比如你不能检查一个对象是否为泛型类型 T 的实例,所以需要反射。 而reified,字面意思:具体化,,其实就是具体化泛型。...主要还是有内联函数inline,才使得kotlin能够直接通过泛型就能拿到泛型的类型,只有内联函数的类型参数可以具体化。

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

    Kotlin学习笔记(六)-反射

    要是对Java的反射不是很熟悉,可以花几分钟的时间先去网上找些Java反射的文章。关于Java的反射并不是这节的主要内,同时反射中也涉及到泛型的知识。...其实有很多反射的地方关于泛型我也不敢说完全明白,也在代码中加了很多TODO,希望以后慢慢能熟能生巧,慢慢理解。 在Kotlin中调用JavaApi实现反射 1....name: String, val age: Int) 创建对象 //这里使用的无参数构造方法,之前说过data class是没有无参数的构造方法的 //需要用noArg库 val person2...} 首先要明白一点Kotlin(如Main.kt)类,在编译后会生成MainKt类,但是这个类在Kotlin中时找不到的(在Java中可以找到),所以我们想在Kotlin中获取Kt类,可以使用方法Class.forName...//对象获取 反射创建对象 这部分先要连接什么是主构造器(primaryConstructor):在类名后面写的构造器时主构造器,在类里面写的构造器时非主构造器。

    2.4K10

    从 Kotlin 开发者角度看 Java 缺失的特性

    为了解决上述问题,Java 开发者发明了辅助类的概念,比如 XYZ 类对应的辅助类叫作 XYZUtils。辅助类提供了一系列静态方法,并带有私有构造函数,因此不能被实例化。...它的语法要清晰得多,并且允许函数链接,这在 Java 中是不可能做到的。 具体化的泛型 Java 5 中引入了泛型。...与之相反的是具体化的泛型,也就是说,泛型类型将被写入字节码中。 编译时泛型类型存在一些问题。...如果 Java 有具体化的泛型,就没有必要这么做了: public interface BeanFactory { T getBean();} 想象一下 Kotlin 的具体化泛型。...论 在这篇文章中,我描述了 Java 中缺失的 4 个 Kotlin 特性:不可变引用、空安全、扩展函数和具体化泛型。

    79120

    kotlin基础语法

    我们可以像使用普通函数那样使用构造函数创建类实例: val site = Runoob() // Kotlin 中没有 new 关键字 要使用一个属性,只要用名称引用它即可 site.name...(this) } } 如果类有主构造函数,每个次构造函数都要,或直接或间接通过另一个次构造函数代理主构造函数。...,一个没有实现方法时,默认是没有实现方法的, super.foo()切换实现方法,两个都有时也可以通过这个方式切换实现方法 泛型 泛型,即 "参数化类型",将类型参数化,可以用在类...声明一个泛型类: class Class(t: T) { var value = t } 型变 Kotlin 中没有通配符类型,它有两个其他的东西:声明处型变(declaration-site...Kotlin 中使用 : 对泛型的的类型上限进行约束。

    2.1K20

    【Kotlin】泛型总结 ★ ( 泛型类 | 泛型参数 | 泛型函数 | 多泛型参数 | 泛型类型约束 | 可变参数结合泛型 | out 协变 | in 逆变 | reified 检查泛型参数类型 )

    放在 尖括号 中 , 该泛型参数放在 类名后 , 主构造函数之前 , 该泛型参数 T 是 类型占位符 , 在 该泛型类类中 可以使用 类型占位符 T 作为一个类 使用 , 可以 定义 T 类型成员属性...主构造函数中可以接收 T 类型的实例对象作为参数 , T 类型可以 作为函数的返回值 ; 通常情况下 , 泛型参数 都使用 T 表示 , 使用其它字母 或者 字符串 都可以表示 泛型参数 , 但是 约定俗成...都使用 T 来表示泛型 ; 代码示例 : 下面的代码中 , 声明了 Student 泛型类 , 该泛型类 接收 T 类型的泛型参数 , 在主构造函数中接收 T 类型的参数 , 在该泛型类中声明了 T...return action(item) } 在 尖括号 中声明 泛型参数 时 , 可以指定 泛型类型 的 约束 , 如 泛型类型 必须是某个类型的子类 ; 在下面的代码中...在 Java 中 , 运行时 不知道 泛型参数 的 具体类型 ; 在 Kotlin 中可以 通过 reified 关键字检查 泛型参数类型 ; Java 中如果想要知道 泛型参数 具体类型 , 通过常规的方法无法实现

    4.1K10

    From Java To Kotlin 2:Kotlin 类型系统与泛型终于懂了

    当 Nothing 类型作为函数参数时,一个有趣的现象就出现了: ```kotlin // 这是一个无法调用的函数,因为找不到合适的参数 fun show(msg: Nothing) {} show(...由于 Nothing 的构造函数是私有的,我们将无法调用 show 函数,除非我们抛出异常,但这没有意义。 这个概念在泛型星投影的时候是有应用的,具体后面会解释。...这个类型则没有太多实际的意义。 - 当 Nothing 作为函数返回值时,意味着这个函数**永远不会返回结果**,而且还会截断程序的后续流程。Kotlin 编译器也会根据这一点进行流程分析。...- 当 Nothing 作为函数参数时,就意味着这个**函数永远无法被正常调用**。这在泛型星投影的时候是有一定应用的。 - Nothing 可以看作是 Nothing?...### 泛型接口/类(泛型类型) 定义泛型类型,是在类型名之后、主构造函数之前用尖括号括起的大写字母类型参数指定: ### 声明泛型接口 > Java: ``` //泛型接口 interface

    46950

    Kotlin入门(15)独门秘笈之特殊类

    可是枚举类型实际上是一种类,开发者在代码中创建enum类型时,编译器会自动生成一个对应的类,并且该类继承自java.lang.Enum。...toString()}" } 模板类 在前面的文章《Kotlin入门(11)江湖绝技之特殊函数》中,提到了泛型函数,当时把泛型函数作为全局函数定义,从而在别的地方也能调用它。...这个问题在Java中是通过模板类(也叫做泛型类)来解决的,例如常见的容器类ArrayList、HashMap均是模板类,Android开发中的异步任务AsyncTask也是模板类。...模板类的应用如此广泛,Kotlin自然而然保留了它,并且写法与Java类似,一样在类名后面补充形如“”或者“”的表达式,表示这里的类型待定,要等创建类实例时再确定具体的变量类型。...,区别在于密封类的定义更加严格;再次是帮助开发者摆脱搬砖命运的数据类;最后是解决未定参数类型的模板类(也叫泛型类)。

    1.3K30

    Kotlin与Java互操作

    当把平台值传递给期待非空值等的Kotlin函数时,也会触发一个断言。总的来说,编译器尽力阻止空值的传播(由于泛型的原因,有时这不可能完全消除)。...可空注解 由于泛型的原因,Kotlin在编译时可能出现空异常,而使用空注解可以有效的解决这一情况。...泛型 Kotlin 的泛型与 Java 有点不同,读者可以具体参考泛型章节。Kotlin中的通配符“”代替Java中的“?”...与Java一样,Kotlin在运行时不保留泛型,也就是对象不携带传递到它们的构造器中的类型参数的实际类型,即ArrayList()和ArrayList()是不能区分的。...型变的泛型 当 Kotlin 的类使用了声明处型变时,可以通过两种方式从Java代码中看到它们的用法。

    3.5K30

    Kotlin的互操作——Kotlin与Java互相调用

    当把平台值传递给期待非空值等的Kotlin函数时,也会触发一个断言。总的来说,编译器尽力阻止空值通过程序向远传播(由于泛型的原因,有时这不可能完全消除)。...与Java一样,Kotlin在运行时不保留泛型,也就是对象不携带传递到它们的构造器中的类型参数的实际类型,即ArrayList()和ArrayList()是不能区分的...⑥ 空安全性 当从Java中调用Kotlin函数时,没有任何方法可以阻止Kotlin中的空值传入。...⑦ 型变的泛型 当Kotlin使用了声明处型变时,可以通过两种方式从Java代码中看到它们的用法。...(boxDerived("s")),但是在Java中是行不通的,因为在Java中Box类在其泛型参数T上是不型变的,于是Box并不是Box的子类。

    3.8K10

    解毒 Kotlin Koans: 03 函数参数、重载

    上期回顾 上期我们留下了两个问题,下面给出答案: 请大家阅读 Kotlin 泛型,并且给出第 3 节中提到的 BaseView 和 BasePresenter 的 Kotlin 的正确写法。...,思考下为什么这么写,另外需要说明的是,VP 的绑定关系是可以通过运行时反射获取泛型参数来实现的,也就是说,View 实例化的时候同时实例化 Presenter,并初始化 Presenter 的 view...Java 视角看 Kotlin 的默认参数 Java 中是没有默认参数的,那么在 Java 中要怎样调用 Kotlin 中使用了默认参数定义的函数或者方法呢?...extends E> c) public ArrayList(int initialCapacity) 这几个版本没的构造器没办法用默认参数的形式合并,我们在 Kotlin 当中继承他时,主构造器只能调用一个父构造器...补充说明:在早期的版本当中,Kotlin 是不允许没有主构造器的,尽管不添加主构造器的写法现在也是允许的,但这种做法显然也是不被推荐的。 ?

    89720

    Android:这是一份全面 & 详细的Kotlin入门学习指南

    注:区别于Java,在Kotlin中字符(char)不属于数值类型,是一个独立的数据类型。...// 优点:省去了装箱操作,因此效率更高 // 具体使用:同Array val x: IntArray = intArrayOf(1, 2, 3) 注: 区别于Java,Kotlin中的数组是不型变的...) var user = User(age = 26) // Kotlin没有new关键字,所以直接创建类的实例: User() 对于构造函数,Kotlin中类可有一个主构造函数 & 多个次构造函数...: String) { // 主构造函数 init { println(userName) } // 次构造函数1:可通过this调主构造函数...2 // 当a=2,3时,执行代码块3 // 当a=其他值时,执行代码块4 // 注意:when语句在满足条件的分支执行后,会终止when语句执行 for语句 类似Java中的for语句 // 示例1

    2.8K20

    Carson带你学Android:这是一份全面 & 详细的Kotlin入门学习指南

    // 优点:省去了装箱操作,因此效率更高 // 具体使用:同Array val x: IntArray = intArrayOf(1, 2, 3) 注: 区别于Java,Kotlin中的数组是不型变的...) var user = User(age = 26) // Kotlin没有new关键字,所以直接创建类的实例: User() 对于构造函数,Kotlin中类可有一个主构造函数 & 多个次构造函数...主构造函数 属于类头的一部分 = 跟在类名后,采用 constructor 关键字 不能包含任何的代码。...: String) { // 主构造函数 init { println(userName) } // 次构造函数1:可通过this调主构造函数...2 // 当a=2,3时,执行代码块3 // 当a=其他值时,执行代码块4 // 注意:when语句在满足条件的分支执行后,会终止when语句执行 for语句 类似Java中的for语句 // 示例1

    2.2K20

    Kotlin入门(12)类的概貌与构造

    的名字叫init,不像Java那样把类名作为构造函数的名称; 2、Kotlin打印日志使用了类似C语言的println方法,而非Java的System.out.println; 3、Kotlin创建实例时省略了关键字...针对这个疑点,Kotlin引入了主构造函数与二级构造函数的概念,上面演示的只是主构造函数,它分为两部分:跟在类名后面的参数是主构造函数的入参,同时init方法是主构造函数的内部代码。...2、二级构造函数需要调用主构造函数,“this(context, name)”这句代码在Java中要写在函数体内部,在Kotlin中则以冒号开头补充到输入参数后面,这意味着二级构造函数实际上是从主构造函数扩展而来...注意到AnimalSeparate类的两个构造函数只是相差一个输入参数,所以完全可以把它们合并成一个带默认参数的主构造函数,新的主构造函数既可以输入两个参数,又可以输入三个参数。...如果利用带两个入参的主构造函数创建实例,则形同调用了原来的第一个构造函数“constructor(context:Context, name:String)”;如果利用带三个入参的主构造函数创建实例,则形同调用了原来的第二个构造函数

    44920

    Kotlin安卓开发学习(3)

    Kotlin会根据主构造函数中的参数自动生成包括equals(),hashCode(),toString()等固定无实际意义的方法自动生成。并当类没有任何代码时,尾部大括号可以省略。...单例类是Kotlin特有的功能,其实现的是最常用、最基础的设计模式之一的单例模式,它可以避免创建重复的对象。比如我们希望某个类在全局最多只能拥有一个实例,这时就可以使用单例模式。...fruit.length }) 然后Kotlin规定,当Lambda参数是函数最后一个参数时,可以移动到括号外面: val maxLengthFruit = list.maxBy() { fruit:...操作符,这个操作符的作用非常好理解,就是当对象不为空时正常调用相应的方法,当对象为空时则什么都不做。如: //简化前 if (a !...它是一个函数,提供了函数式API的编程接口,并将原始调用对象作为参数传递到Lambda表达式中: obj.let { obj2 -> // 编写具体的业务逻辑 } 这样就可以简化之前的代码: fun

    52610

    原 荐 Scala的面向对象

    //当调用构造方法时,会打印 …… 和*** println("…………") println("***") } 2>辅助构造器     有些时候,一个类里需要多个构造器。...scala里除主构造器之外的构造器被称为辅助构造器。     1)Scala的辅助构造器定义开始于def this()。     ...5)当一个单例对象和某个类写在同一个源文件中且共享同一个名字时,他们就产生了一个绑定的关系。此时单例对象称为该类的伴生对象。类称为该对象的伴生类。     ...2)当样例类声明一个主构造器后,会默认隐式的声明一个空构造器。     3)样例类默认实现序列化接口。     序列化的两个作用:①数据持久化;②网络数据传输。     ...    基本和java中相同,不同的是,泛型是用方括号引起来的。

    853130

    《Kotin 极简教程》第7章 面向对象编程(OOP)(1)第7章 面向对象编程(OOP)《Kotlin极简教程》正式上架:

    有任何问题,欢迎随时与我交流~ ---- 在前面的章节中,我们学习了Kotlin的语言基础知识、类型系统、集合类以及泛型相关的知识。...这里说有共同概念的东西(而没有说对象),其实,就是我们上一个章节中讲到的泛型。这样对于一个通用的算法,我们就可以最大化的实现复用,作用于的集合。...7.2.2 构造函数 在 Kotlin 中,一个类可以有一个 主构造函数(primary constructor)和一个或多个 次构造函数(secondary constructor)。...(主或次)构造函数,它会有一个生成的不带参数的主构造函数。...另外抽象类中的具体实现的函数,默认是final的。

    1.1K20

    Kotlin基本语法和使用技巧

    = null //在主构造函数中不能有任何代码实现,如果有额外的代码需要在构造方法中执行,你需要放到init代码块中执行 init { name = "Zhang Tao...类似静态变量 写在顶级的函数(不需要在class里写方法)或者变量有个好处:在 Android Studio 中写代码时,IDE 很容易根据你写的函数前几个字母自动联想出相应的函数。...,最终形成新的集合 flatMap:遍历每个元素,并为每个元素创建新的集合,最后合并到一个集合中 Elvis 操作符 通过 ?...= :对引用的内存地址进行比较,相当于 Java 中的 == 如果每个类型都去实现诸如 TextViewList、ActivityList 这样的具体的类型,显然是不可能的。...因此就诞生了「泛型」,它的意思是把具体的类型泛化,编码的时候用符号来指代类型,在使用的时候,再确定它的类型 使用关键字 out 来支持协变,等同于 Java 中的上界通配符 ? extends。

    86650

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

    5、辅助构造器:类似于Java/C++中的构造器,但是有两点不同:1)所有辅助构造器的名字都为this,2)每一个辅助构造器都必须以一个先前定义的其他辅助或主构造器的调用开始。...6、主构造器是与类定义交织在一起定义的,如果没有参数则是默认的主构造器。...3、测试某个对象属于哪个类使用isInstanceOf方法,当对象是该类或者子类的对象时返回True. 4、Scala中也有protected修饰符,与java中的一样 5、子类的辅助构造器不能调用父类的构造器只能通过子类的主构造器进行调用形式如下...第十六章泛型类型 1、Scala中也存在泛型的概率,与java不同Scala的泛型用方括号来定义如: class pair[T,S](val first: T, val second: S)//泛型类...2、当对象访问一个不存在的成员时。3、当对象调用某个方法,传入的参数类型不对时。

    4.4K20

    kotlin基本语法

    一、kotlin 语言介绍 与java类似的一种基于JVM虚拟机的语言,java其实也是一种解释型语言,生成的class文件供JVM解释,同时kotlin也是一样的kotlin就是为了解决...java的各种痛点而产生的,利用kotlin可以大大减少开发过程中的代码量编写,有一套几乎可以杜绝空指针的机制,kotlin没有分号 二、如何运行Kotlin代码 郭霖大神这本第三行代码是在...AS里面运行的,当然我们也可以用idea运行,eclipse应该也可以多安装一个kotlin插件就ok,生成后缀为kt的kotlin文件,利用以下简单代码段即可编写第一个程序,与java的主函数很像,不过代码更加简洁...函数 与java相似,method方法Java中的称呼,本质上是一样的,不过有一个比较特殊的,即语法糖,当只有一行代码时,可以直接将其写在尾部然后利用等号连接 fun hhh(name :...data即可 单例类:创建类时使用object关键词 六、Lambda 编程 集合的创建以及使用 Set 不存放重复元素,map可以利用类似数组下标进行赋值,list可以简化赋值 集合的函数式

    59030
    领券