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

Java的加载机制---和子类的多态调用

Auto-generated method stub ExtendsInstanceTest b = new Sub(); } } 他的输出结果是  null 1) 上面程序最大的难点,也是最重要的地方就是:在的构造函数调用了虚函数...上面的程序就很容易理解为什么输出是null了 Java机制里面有这样的一个原则就是:如果存在,子类可以不存在;如果子类存在,必须存在; 怎么理解上面的这句话呢,可以用实际的例子来说明,一个人结婚了但是没有小孩...,对应着前半句的意思;如果他生了小孩,那么这个小孩子是一定有父亲的 到Java代码这样看,如果我们实例化一个子类,必须先构造这个子类的,否则是错误的。...Java 中子类加载的机制是第三个需要理解的地方: 1)相关的的加载机制还是跟  上面第二点相似,只是在子类初始化的时候必须先去初始化 2)只有 等Java机制给子类和所有的都分配了内存空间之后...,多态的调用 7)子类有重载,所以调用子类的方法,但是子类的baseName还没有初始化,所以就没有直接打出null了 8)创建完毕,接下来就是去执行子类的创建工作了, 9)首先为子类的属性进行初始化

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

    Java强制转换子类原则

    最近,微信群友在讨论子类的转换问题,其实不难,给大家用实例来说明一下就很明了了。 我们知道Java中子类转换成是没有任何问题的,那可以转换成子类吗?...Fruit fruit1 = new Fruit(); Apple apple1 = new Apple(); apple1 = (Apple) fruit1; // java.lang.ClassCastException...} static class Fruit { } static class Apple extends Fruit { } } 结果是: test1:报转异常...所以,想让强制转换成子类,不是没有可能,除非是子类构造出来的实例,不然是不能强转的。 为什么呢?...如上代码,如果实例出来的对象是Orange,Orange当然不能强制转成Apple,所以说只有该子类对应的实例才能强转。

    2.3K80

    Java】基础21:顶层Object

    在东方神话体系,人类是如何来的? 是女娲用泥土捏出来的。 在西方神话体系,人类是如何来的? 是亚当夏娃的后代。 今天要学的ObjectJava里面,就好比是和亚当夏娃一样的存在。...②getSuperClass():得到名。 ③Class是指java.lang这是Java里面的一个包,名是Object。 所以数组的也就是Object.。...如果一个没有特别指定,那么默认继承自Object。 既然Object是顶层,那么按照继承的规则:子类可以调用的方法。 Object的方法,所有都可以使用。...②在测试main方法,创建对应的person对象并初始化。 ③调用toString()方法并打印(注意:Person并没有定义toString()方法,它调用的是Object的方法)。...①直接用Objects工具名就可以调用方法。 ②Objects的equals方法。 ③这种判断方式更加安全,不会出现空指针异常。 什么叫空指针异常呢?

    75220

    pythonobject_java中所有异常

    Object 所有,默认所有的都继承至Object 规定了的结构,加载方式,常用函数 以前的写法: class 名(Object): pass 现在的写法:...class 名: pass 如果有才编写,如果没有可以省掉Object,但是也是默认继承 内置函数: __new__(cls, *args, **kwargs) 创建对象时自动调用的函数...(构造函数),作用:给当前对象创建各类变量,并给变量赋初值,一般用于对象的初始设置,该函数没有返回值 __str__(self) 对象描述函数,作用:返回当前对象的字符串类型的信息描述,一般用于对象的直接输出显示...__new__(cls) # 调用的创建对象的函数,进行当前对象的创建 def __init__(self, name, age, sex): print...".format(self.name, self.age, self.sex) def __del__(self): print("删除该对象时会自动调用该函数,一般用于工具释放资源

    72820

    java引用指向子类对象好处_java子类调用类属性

    ,为了规避风险,Java只允许单继承,势必在功能上有很大的限制,所以,Java引入多态性的概念以弥补这点不足,此外,抽象和接口也是解决单继承规定限制的重要手段.同时,多态也是面向对象编程的精髓所在....2.多态的体现 1 接口 和 实现接口并覆盖接口中同一方法的几不同的体现的 2 和 继承并覆盖同一方法的几个不同子类实现的....所以,类型的引用可以调用定义的所有属性和方法,而对于子类定义而没有的方法,它是无可奈何的; 对于定义的方法,如果子类重写了该方法,那么类型的引用将会调用子类的这个方法,这就是动态连接...很显然,应该是”CCC” 4.对于多态总结一下 一、使用类型的引用指向子类的对象; 二、该引用只能调用定义的方法和变量; 三、如果子类重写了的一个方法,那么在调用这个方法的时候...所以可以实现强转… 4.static 顾名思义,就是静态的,他是方法的,他属于这个,由于是的方法,他可以直接引用名来引用方法,也可以通过的对象来引用这个方法,他既不能被子类覆盖,也不能被子类继承

    1.2K20

    我们再写一个继承一下它,这个我们用作和数据库映射 package com.ruben.pojo.dataObject;/** * @ClassName: UserDataObject * @Date...com.baomidou.mybatisplus.annotation.TableName; import com.ruben.pojo.BaseEntity; import com.ruben.pojo.UserInfo; import lombok.*; import java.io.Serializable...) private UserInfo userInfo; public UserPO(Integer id) { super(id); } } 然后我们使用的构造方法去创建这个对象...,并赋值id UserPO userPO = new UserPO(888); 最后我们发现userPO.getId()出来的结果为null 是因为我们调用的的构造函数,是给的id赋值了 而我们...直接把整张表删了!!! 还好测试时发现了,不然就要跑路了-_-!之后的开发应该多多避免类似的粗心。。。

    50330

    java加载的过程 _加载机制原理

    最后JVM对进行初始化,包括: 1)如果类存在直接并且这个还没有被初始化,那么就先初始化; 2)如果类存在初始化语句,就依次执行这些初始化语句。...2、元数据验证 第二阶段是对字节码描述的信息进行语义分析,以保证其描述的信息符合Java语言规范的要求,这个阶段可能包括的验证点如下: 这个是否有(除了 java.lang.0bject之外,所有的都应当有...) 这个是否继承了不允许被继承的(被finaI修饰的) 如果这个不是抽象, 是否实現了其父或接口之中要求实现的所有方法 的字段、 方法是否与产生了矛盾(例如覆盖了的final...()方法的肯定是 java,lang.Object 由于的()方法先执行,也就意味着定义的静态语句块要优先于子类的变量赋值操作 ()方法对于或接口来说并不是必须的...,程序先加载并连接该类; 假如该类的直接还没有被初始化,则先初始化其直接; 假如中有初始化语句,则系统依次执行这些初始化语句 当执行第二步时,系统对直接的初始化也遵循此1、2、3步骤,如果该直接又有直接

    71020

    子类继承,的初始化

    当然,基础子对象应该正确地初始化,而且只有一种方法能保证这一点:在构建器执行初始化,通过调用基础构建器,后者有足够的能力和权限来执行对基础的初始化。...在衍生的构建器Java 会自动插入对基础构建器的调用。...除此以外,在衍生构建器,对基础构建器的调用是必须做的第一件事情(如操作失当,编译器会向我们指出)。...个人总结: super关键字必须写在构造方法的方法体内的非注释代码的首行 子类进行初始化,必须调用的构造方法,如果的所有构造方法都用private修饰了的话,则无法继承,编译报错....衍生构造方法调用的构造方法,如果是无参构造方法,那么编译器会为衍生的构造方法首行加上super()。 编译器会强迫我们在衍生构建器的主体首先设置对基础构建器的调用。

    1.9K30

    java面对对象(.2)(多态性,终极,instanceof,包装等)

    多态性,是面向对象中最重要的概念,在Java的体现: 对象的多态性:的引用指向子类的对象 可以直接应用在抽象和接口上 Java引用变量有两个类型:编译时类型和运行时类型。...实际运行的是子类重写的方法) 对象的多态 —在Java,子类的对象可以替代父的对象使用 一个变量只能有一种确定的数据类型 一个引用类型变量可能指向 ( 引用 ) 多种不同类型的对象...} } 子类继承 若子类重写了方法,就意味着子类里定义的方法彻底覆盖了里的 同名方法,系统将不可能把里的方法转移到子类。...对于实例变量则不存在这样的现象,即使子类里定义了与完全相同的 实例变量,这个实例变量依然不可能覆盖定义的实例变量  接下来我们说下,目前学习我听过最中二的名字终极(Objext)...——Java程序中所有直接或间接库中所有,处在层次最高点 包含了所有Java的公共属性,其构造方法是Object( )  到这里我们随便讲下== 和equals以及还有终极中方法

    42230

    【Python】面向对象 - 继承 ② ( 子类重写成员 | 子类调用重名成员 | 子类中使用 名 调用成员 | 子类中使用 super 调用成员 )

    ; 成员属性 重写 , 就是在 子类 , 修改 成员属性的值 ; 成员方法 重写 , 就是在 子类 , 修改 成员方法的方法体内容 ; 在子类 , 如果需要重写的成员 , 直接在子类 ,...重新定义父的成员即可 ; 在 Python , 不像 Java / Kotlin / Groovy 一样 , 如果子类重写成员 , 需要使用 @Override 注解 修饰 ; 2、代码示例...- 子类重写成员 在 Animal , 定义了 成员属性 name 和 age , 成员方法 make_sound 函数 ; 在子类 Dog , 对 Animal 的 成员属性 name...) 2、代码示例 - 子类中使用 名 调用成员 在 Dog 子类的 make_sound 函数 , 通过 Animal.name 和 Animal.age 可以调用的成员变量 , 打印出来的值为的成员变量值...在 Dog 子类的 make_sound 函数 , 通过 super().name 和 super().age 可以调用的成员变量 , 打印出来的值为的成员变量值 ; 通过 super()

    60530

    Java中子类和的构造函数?

    参考链接: Java的继承和构造函数 这篇文章总结了关于Java构造的常见​​问题。  1)为什么创建一个子类对象要也需要调用的构造函数? ...,构造对象时,的构造函数(super())首先被调用。...让的构造器被调用的原因是,如果有私有的属性需要在它的构造函数初始化。 ...在Java,如果一个没有定义构造函数,编译器会为默认创建一个无参构造函数。如果在定义了构造函数super(String s),在这种情况下,编译器将不会为创建一个无参构造函数。...3)子类的显式调用构造函数  下面的代码是正常的:    子类(Sub)构造函数显式地调用(Super)的带参构造参数。如果定义了相对应的构造函数,那将会被正常良好的调用。

    2.2K20

    关于java关系的小坑

    学过JavaSE的都知道java在初始化的时候,如果存在直接,是先初始化,然后才初始化子类。      ...子类拥有所有的非私有化成员,非私有的成员不仅仅包括public修饰的成员,protected修饰的(protected修饰的可以访问其他包中子),不写访问修饰符是默认default修饰(只能访问同一个包...由的加载机制可以得知,的加载包括 加载,验证,准备,解析,初始化这几个阶段。 其中:静态变量初始化是在虚拟机的方法区初始化的,的实例变量会在实例化时跟随的实例在堆内存初始化。...还未执行任何java方法,而给静态变量赋值是在实例初始化之后,存放于构造器的。    ...2.子类访问成员的时候,注意直接访问成员和调用方法访问的区别。

    1.4K10

    索引和索引

    索引和索引 索引(this_class)和索引(super_class)都是一个u2型的数据,索引用于确定这个的全限定名,索引用于确定这个全限定名。...由于java语言不允许多重继承,所以索引只有一个。...索引为0x0004,去常量池里找索引为4的描述符,描述符的索引为18,再去常量池里找索引为18的字符串,就是“java/lang/Object”。...全限定名是把全名的“.”替换成“/”就可以了,比如java.lang.Object的全限定名就是“java/lang/Object”。...字段表集合不会列出从父或者接口中继承而来的字段,但有可能列出原版Java代码没有的字段,比如在内部类为了保持对外部类的访问性,会自动添加指向外部类实例的字段。

    80700
    领券