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

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

method stub ExtendsInstanceTest b = new Sub(); } } 他的输出结果是  null 1) 上面程序最大的难点,也是最重要的地方就是:在父的构造函数调用了虚函数...3) 构造的时候,Java机制是到底先给属性分配空间并赋值,还是先处理 构造函数,换句话说,当我们使用new操作符生成一个对象的实例的时候,的加载机制是怎么样的, 如果这三个问题都搞定了,都理解了,...上面的程序就很容易理解为什么输出是null了 Java机制里面有这样的一个原则就是:如果父存在,子类可以不存在;如果子类存在,父必须存在; 怎么理解上面的这句话呢,可以用实际的例子来说明,一个人结婚了但是没有小孩...,对应着前半句的意思;如果他生了小孩,那么这个小孩子是一定有父亲的 到Java代码这样看,如果我们实例化一个子类,必须先构造这个子类的父,否则是错误的。...Java子类加载的机制是第三个需要理解的地方: 1)相关的的加载机制还是跟  上面第二点相似,只是在子类初始化的时候必须先去初始化父 2)只有 等Java机制给子类和所有的父都分配了内存空间之后

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

Java的原子类

在前面的内容,我们已经学习了CAS的原理,所以对于学习本节来说会非常容易。...本节介绍Java的原子类java.util.concurrent.atomic包下的对象,他们之所以有原子性的共性,都来源于CAS,可见CAS的重要性。...原子类是JDK5提供的,当时只有12个原子类,发展到JDK8时,又多出了4个原子类,如下图2-25所示,红色框内为JDK8新增加的。...图2-25 Java16个原子类 下面我们来对这些原子类进行分类讲解。 2.10.1原子更新基本类型 l AtomicBoolean: 原子更新布尔类型。...15pangPang 2.10.4原子更新字段 如果需要原子的更新里某个字段时,需要用到原子更新字段,Atomic包提供了3个进行原子字段更新: l AtomicIntegerFieldUpdater

64020

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.2K80

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

,为了规避风险,Java只允许单继承,势必在功能上有很大的限制,所以,Java引入多态性的概念以弥补这点不足,此外,抽象和接口也是解决单继承规定限制的重要手段.同时,多态也是面向对象编程的精髓所在....子类覆盖父实现多态: 如果子类继承的超是一个抽象,虽然抽象不能通过new操作符实例化,但是可以创建抽象的对象引用指向子类对象,以实现运行时多态性,不过,抽象子类必须覆盖实现超的所有的抽象方法...所以,父类型的引用可以调用父定义的所有属性和方法,而对于子类定义而父没有的方法,它是无可奈何的; 对于父定义的方法,如果子类重写了该方法,那么父类型的引用将会调用子类的这个方法,这就是动态连接...很显然,应该是”CCC” 4.对于多态总结一下 一、使用父类型的引用指向子类的对象; 二、该引用只能调用父定义的方法和变量; 三、如果子类重写了父的一个方法,那么在调用这个方法的时候...,将会调用子类 的这个方法;(动态连接、动态调用) 四、变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类”重写“了父 的变量,那么在编译时会报错。

1.1K20

java之父的构造器是否能被子类继承?

子类默认继承父的属性和方法,但不会继承父的构造器,而是在子类被实例化时会默认调用父的空构造器。子类在创建的时候会调用自己的空构造器,并在空构造器会隐式调用super(),即父的空构造器。...如果父的构造器被重载,那么子类的构造器也必须初始化父的构造器,否则会报编译错误。当然,只要父显示定义了空构造器,子类中就不必初始化父的构造器。...例如: 父Person.java package myjava; public class Person { private String name; private int age...:Student.java package myjava; public class Student extends Person{ //这里必须初始化父重载后的构造方法,否则会报错...,只有一个重载了的构造器,在子类构造器,必须初始化父的构造器,即super关键字+父构造器的参数。

1.2K20

5.1 、超子类

5.1 、超子类   子类比超拥有的功能更加丰富。   在本例,Manager类比超Employee封装了更多的数据,拥有更多的功能。   ...在通过扩展超定义子类的时候,仅需要指出子类和超的不同之处,因此,会将通用的方法放在超,而将具有特殊用途的方法放在子类,这种将通用的功能放在超的方法,在面向对象程序设计十分普遍。   ...超的有些方法在子类Manager不一定适用,比如说Manager的getSalary方法应该返回薪水和奖金的总和,为此需要提供一个新的方法来覆盖(override)超的这个方法。...将方法或声明为final的主要目的是:确保它们不会在子类改变语义。例如,Calender的getTime和setTime方法都声明为final。...一种是在子类定义部分抽象方法或抽象方法也不定义,这样就必须将子类也标记为抽象;另一种是定义全部的抽象方法,这样子类就不是抽象的了。   即使不包含抽象方法,也可以将声明为抽象

1K90

Java子类和父的构造函数?

参考链接: Java的继承和构造函数 这篇文章总结了关于Java构造的常见​​问题。  1)为什么创建一个子类对象要也需要调用父的构造函数? ...如果没有,编译器会插入调用父构造的语句。这就是为什么在创建子类对象时父的构造超函数会被调用。  这里没有创建两个对象,只有一个子对象。...在Java,如果一个没有定义构造函数,编译器会为默认创建一个无参构造函数。如果在父定义了构造函数super(String s),在这种情况下,编译器将不会为创建一个无参构造函数。...这是上边的Super发生的情况。  子类的构造函数,无论有参构造还是无参构造,将会调用父的默认的无参构造函数。...3)子类的显式调用父构造函数  下面的代码是正常的:    子类(Sub)构造函数显式地调用父(Super)的带参构造参数。如果父定义了相对应的构造函数,那将会被正常良好的调用。

2K20

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

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

33230

Python的协议 、鸭子类型 、 抽象基 、混入

本篇文章探讨一下python的几个概念:协议 、鸭子类型 、 抽象基 、混入。 一、协议 在python,协议是一个或一组方法。...二、鸭子类型(duck typing) 多态的一种形式,在这种形式,对象的类型无关紧要,只要实现了特定的协议即可。...示例1 Eg1 实现了 len 和 getitem两个方法,也就是实现了序列协议,那么它的表现就和序列类似。...print(issubclass(Cat, Animal)) 输出: True 这种通过注册和抽象基关联起来的叫做虚拟子类,虚拟子类不会继承注册的抽象基,而且任何时候都不会检查它是否符合抽象基的接口...为了避免运行时错误,虚拟子类要实现所需的全部方法。 抽象基并不常用,但是在阅读源码的时候可能会遇到,因此还是要了解一下。 四、混入(mixin class) 混入是为代码重用而生的。

1.8K20

Java子类和父间的调用关系

3、每个直接或间接是Object的子类,Object只有一个无参构造方法。...3、每个直接或间接是Object的子类,Object只有一个无参构造方法。   4、编译器会在每个构造方法的第一行隐式添加父的默认无参构造器,即添加super()。   ...Must explicitly invoke another constructo   因为父定义了一个带参数的构造器,因此编译器不会添加默认无参构造方法,但是因为在子类的构造器没有显式调用父的某个构造方法...,因此编译器会自动添加super()方法, 但是父不存在默认无参构造方法,因此会提示默认无参构造方法未定义错误。   ...int id) {   }   }   class Teacher extends Employee {   public Teacher() {   super(10);   }   }   这样,在子类的构造器显式调用了父的某个构造器

94730

Java】原子类

Java】原子类 前言 保证线程安全是 Java 并发编程必须要解决的重要问题。Java 从原子性、可见性、有序性这三大特性入手,确保多线程的数据一致性。...原子变量可以分为 4 基本类型 AtomicBoolean:布尔类型原子类; AtomicInteger:整型原子类; AtomicLong:长整型原子类。...AtomicStampedReference 在引用类型原子类,彻底地解决了 ABA 问题,其它的 CAS 能力与另外两个相近,所以最具代表性。...Unsafe 实际上Atomic包里的基本都是使用Unsafe实现的包装。也就是上面的原子类实现过程中都会用到UnsafeJava的Unsafe提供了类似C++手动管理内存的能力。...DirectByteBuffer是Java用于实现堆外内存的一个重要,通常用在通信过程做缓冲池,如在Netty、MINA等NIO框架应用广泛;DirectByteBuffer对于堆外内存的创建、

1.1K30

探讨Java的父子类转化问题

有两个问题: (1)子类对象可以转化为父对象吗? (2)父对象可以转化为子类对象吗?...Son的数据, 并返回一个Son的对象,并赋值给Father的引用f,即f指向子类的对象, 此时,子类的对象并没有定义一个名字。...对比son:1407343478,par:1407343478也可以看出 2、java子类实例强制转化后 各实例之间的关系 子类实例转化为父实例后 是否还从属(instanceof)于子类?...fun已经执行 子类重写父方法fun已经执行 子类重写父方法fun已经执行 子类新增加的方法fun2已经执行 说明:子类转化为父实例后,这个实例就不能访问子类新增加的成员变量和新增加成员方法了,值得一提的是...属于子类实例"); } 结果: 子类的实例s 属于父实例 父的实例f 属于父实例 子类的实例s1 属于父实例 子类的实例s 属于子类实例 父的实例f 属于子类实例 子类的实例s1 属于子类实例

3.8K30

JAVA面向对象编程】--- 探索子类如何继承父

void main(String[] args) { Dog dog = new Dog("hello",10,3); dog.wangwang(); } 在子类变量访问父的变量和方法...4.如果子类想要调用父的静态构造方法,可以在子类通过方法名()进行访问 静态里面,不能用this 也不能用super 注意:子类构造方法中会默认调用无参构造方法: super(),...总结: 在子类构造方法,并没有写任何关于基构造的代码,但是在构造子类对象(穿件对象)时,先执行基(父)的构造方法,然后执行子类的构造方法, 因为: **子类对象成员是有两部分组成的...注意: 1,若父显式定义无参或者默认的构造方法,在子类构造方法第一行默认有隐含的super(调用,即调用基构造方法 2.如果父构造方法是带有参数的,此时需要用户为子类显式定义构造方法,并在子类构造方法中选择合适的父构造方法调用...3.在子类构造方法,super(...)调用父构造时,必须是子类构造函数第一条语句。4.super(...)只能在子类构造方法中出现一次,并且不能和this同时出现

6910
领券