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

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

,为了规避风险,Java只允许单继承,势必在功能上有很大的限制,所以,Java引入多态性的概念以弥补这点不足,此外,抽象和接口也是解决单继承规定限制的重要手段.同时,多态也是面向对象编程的精髓所在....因为子类是对的一个改进和扩充,所以一般子类在功能上较更强大,属性较更独特: 定义一个类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取的共性。...所以,类型的引用可以调用中定义的所有属性和方法,而对于子类中定义而中没有的方法,它是无可奈何的; 对于中定义的方法,如果子类中重写了该方法,那么类型的引用将会调用子类中的这个方法,这就是动态连接...很显然,应该是”CCC” 4.对于多态总结一下 一、使用类型的引用指向子类的对象; 二、该引用只能调用中定义的方法和变量; 三、如果子类中重写了中的一个方法,那么在调用这个方法的时候...Son s = new Son();//系统将分配1.5M内存 因为子类中有一个隐藏的引用super会指向实例,所以在实例 化子类之前会先实例化一个,也就是说会先执行的构造函数

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

Java——与对象(基本概念、定义、内存分析、引用传递)

2.2、与对象的定义         开发中先有,再有对象,要定义Java中使用class关键字来描述,而在中组成包括:属性(变量)、方法。...类属于引用数据类型,先对其进行内存分析,分析前首先给出两块内存控件的概念: 堆内存空间(Heap):保存对象中具体的属性信息; 栈内存空间(Stack):保存的堆内存的地址数值,简化一点,假设保存在栈内存中的是对象的名称...异常,原因就是使用了没有开辟堆内存空间的引用对象。...2.4、引用传递初步         引用传递是在引用数据类型上所用的一个操作定义,是Java的精髓,操作性质与C语言相同,进行内存的操作。换到程序中,就是一个堆内存空间可以被多个栈内存所指向。...以上分析可知: 使用关键字new 可以开辟堆内存空间(保存属性); 栈内存只能保存一块堆内存的使用地址; 引用传递的本质是同一块堆内存空间可以被不同的栈内存所指向; 发生引用传递时,如果操作的栈内存原有堆内存指向

42820

【Android 内存优化】Java 引用类型 ( 强引用 | 软引用 | 弱引用 | 虚引用 )

引用 ( 回收前通知 ) 如果单纯的想避免 OOM , 可以使用软引用 ; 如果对性能要求很高 , 要最大限度节省内存 , 所有的内存回收都要及时处理 , 就使用弱引用 ; 内存泄漏原理 : 长生命周期对象..., 但不是必须的对象 , 对象被软引用引用 , 当系统内存严重不足 , 在报出 OutOfMemoryError 错误之前就会将软件用释放掉 , 如果将软引用释放掉之后 , 还是内存不足 , 就会报..., 直接回收 , 即使内存足够 , 也要回收该对象所占用的内存 ; ④ 虚引用 : 虚引用无法获得被引用的对象 , 其唯一的作用是对象被回收时 , 可以得到相应的通知 ; 虚引用不会对对象的生存周期造成影响任何..., GC 忽略虚引用 , 即使有虚引用引用某对象 , GC 会当做该引用不存在 ; 开发时不常用 , 一般开发底层 SDK , 或监测系统运行的软件时 , 才使用 ; 强引用 ( 不回收 ) > 软引用...(softObject, referenceQueue); ④ 上述软引用释放 : 创建的软引用在两种情况下才会释放 : 软引用置空 : GC Root 不可达时回收 ; 内存不足 : 内存不足 ,

5.3K10

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里面,就好比是和亚当夏娃一样的存在。 只不过神话终归只是神话,是虚无缥缈的,但是计算机里面,Object是真真实实存在的。...②getSuperClass():得到名。 ③Class是指java.lang这是Java里面的一个包,名是Object。 所以数组的也就是Object.。...如果一个没有特别指定,那么默认继承自Object。 既然Object是顶层,那么按照继承的规则:子类可以调用的方法。 Object中的方法,所有都可以使用。...②如果比较的是引用数据类型 “==”比较的是引用地址是否相同。 那equals方法和“==”之间有什么区别呢?...引用数据类型,所以Object中的equals()方法,比较的是引用地址是否相同。 那么问题又来了,String中的equals方法为何比较的是值是否相等呢?

73020

JAVA加载过程&主动引用和被动引用

2.1.4.当虚拟机启动时,用户需要指定一个执行的主,虚拟机会首先初始化这个主 2.2被动引用 2.2.1.通过子类引用的静态字段,不会导致子类初始化 2.2.2.通过数组定义来引用,不会触发此类的初始化...1.1加载 加载既是将class文件字节码加载到内存中,并将这些静态数据转换为jvm方法区运行时数据结构。在堆中生成一个代表这个java.lang.Class对象,作为方法区访问对象的入口。...准备: 正式为变量(static变量)分配内存,并设置变量初始值的阶段。这些内存都将在方法区分配。 解析: 虚拟机常量池内的符号引用替换为直接引用的过程。...在解析阶段,Java虚拟机会把这个符号引用替换为一个指针,该指针指向Car的run()方法在方法区内的内存位置,这个指针就是直接引用。 1.3 初始化 初始化是执行的构造器()方法的过程。...2.被动引用和主动引用java虚拟机规范中,严格规定了,只有对进行主动引用,才会触发其初始化方法。而除此之外的引用方式称之为被动引用,不会触发的初始化方法。

95021

为什么子类引用不能指向对象

java、C++等面向对象的语言中,实现多态的方式就是使用引用指向子类对象,所以引用指向子类对象是没有任何为题的,但是,大家有没有想过,子类引用可以指向对象吗?答案是不可以!...下图是在java中,使用子类引用指向对象的情况 ? 编译可以通过,因为对生成的Person对象做了一个强制转换,骗过了编译器,其本质上还是属于子类引用指向对象。...很明显,java虚拟机在运行该行代码的时候进行了运行时检测,禁止子类引用指向对象。 所以,这种操作在java里面是不允许的,接下来,我们把代码拷贝一下,在C++的环境再跑一下。 ?...接下来,我们来看一下,下面两行的反汇编代码,因为Student继承于Person,因此Student里面有age和stuId两个变量,又因为是公有的,所以stu可以访问这两个变量的地址,我们对这两个值进行赋值操作...因此,无论在C++还是java中,都是应该禁止掉这种行为的,只是java做了运行时检测,而C++并没有而已。 完

2.5K31

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

(b)准备:给的静态变量分配存储空间 (c)解析:将符号引用转成直接引用 3、初始化:对静态变量,静态代码块执行初始化工作 的加载过程 当Java程序需要使用某个时,如果该类还未被加载到内存中,...当被加载后就进入连接阶段,这一阶段包括验证、准备(为静态变量分配内存并设置默认的初始值)和解析(将符号引用替换为直接引用)三个步骤。...当Java程序需要使用某个时,如果该类还未被加载到内存中,Java虚拟机会通过加载、连接和初始化一个Java, 使该类可以被正在运行的Java程序所使用。...验证步骤确保了Java类型数据格式正确并且适于Java虚拟机使用。而准备步骤则负责为该类型分配它所需的内存、比如为它的变量分配内存。解析步骤则负责把常量池中的符号引用转换为直接引用。...2、元数据验证 第二阶段是对字节码描述的信息进行语义分析,以保证其描述的信息符合Java语言规范的要求,这个阶段可能包括的验证点如下: 这个是否有(除了 java.lang.0bject之外,所有的都应当有

67720

——曼德拉 今天在项目中遇到一个小坑可把我吓坏了,记录一下,以免再犯 首先还原下场景吧,我们写个 package com.ruben.pojo; import lombok.Data; /**...我们再写一个继承一下它,这个我们用作和数据库映射 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赋值了 而我们

48430

子类继承,的初始化

《Thinging in Java》的引用 基础及衍生,而不再是以前的一个,所以在想象衍生的结果对象时,可能 会产生一些迷惑。...在衍生的构建器中,Java 会自动插入对基础构建器的调用。...下面这个例子向大家展示了对这种三级继承的应用 //: Cartoon.java // Constructor calls during inheritance class Art { Art()...个人总结: super关键字必须写在构造方法的方法体内的非注释代码的首行 子类进行初始化,必须调用的构造方法,如果的所有构造方法都用private修饰了的话,则无法继承,编译报错....衍生构造方法调用的构造方法,如果是无参构造方法,那么编译器会为衍生的构造方法首行加上super()。 编译器会强迫我们在衍生构建器的主体中首先设置对基础构建器的调用。

1.8K30

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

一、子类重写成员 1、子类重写成员语法 子类 继承 的 成员属性 与 成员方法 后 , 如果对 继承的 成员 不满意 , 可以 重写 成员 ; 成员 属性 和 成员 方法 , 都可以进行重写...重新定义父的成员即可 ; 在 Python 中 , 不像 Java / Kotlin / Groovy 一样 , 如果子类重写成员 , 需要使用 @Override 注解 修饰 ; 2、代码示例...访问成员 : 如果需要调用被重写之前的 成员 , 则需要使用如下方法 : 方法一 : 使用 名 调用成员 ; 调用类同名成员变量 : 名.成员变量名 调用类同名成员方法...: 名.成员方法名(self) 方法二 : 使用 super 调用成员 ; 调用类同名成员变量 : super().成员变量名 调用类同名成员方法 : super().成员方法名(...) 2、代码示例 - 子类中使用 名 调用成员 在 Dog 子类中的 make_sound 函数中 , 通过 Animal.name 和 Animal.age 可以调用的成员变量 , 打印出来的值为的成员变量值

39230

Java中子类和的构造函数?

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

2.1K20

关于java关系的小坑

学过JavaSE的都知道java在初始化的时候,如果存在直接,是先初始化,然后才初始化子类。      ...由的加载机制可以得知,的加载包括 加载,验证,准备,解析,初始化这几个阶段。 其中:静态变量初始化是在虚拟机的方法区中初始化的,的实例变量会在实例化时跟随的实例在堆内存中初始化。...准备阶段是正式为变量分配内存并设置变量初始值的阶段。...还未执行任何java方法,而给静态变量赋值是在实例初始化之后,存放于构造器中的。    ...正由于子关系的存在,方便了框架公共代码的抽取,比如在快递项目中,所有Action抽取CommonAction的时候,就是利用子的关系将公共代码抽取出来,这样再创建Action的时候就可以避免重复代码的编写

1.4K10

Java基础学习-引用类型和内存分析

引用类型: Java语言中除基本类型之外的变量类型都称之为引用类型。...基本数据类型: 数值型:整数类型(byte,short,int,long);浮点类型(float,double) 字符型(char) 布尔型(boolean) 引用数据类型: (class)接口(interface...)数组 Java中的对象和数组是通过引用对其操作的 引用可以理解为一种受限的指针 指针是可以进行与整数做加减运算的,两个指针之间也可以进行大小比较运算和相减运算。...引用就是一个变量或对象的别名(引用的本质是一个对象);指针是一个段内存空间的地址(指向存储一个变量值的空间一个对象的空间) 内存分析: 栈: 存放:局部变量 先进后出,自下而上存储 方法执行完毕,自动释放空间...思路:当A和B都在栈中时,想取A,必须先取B 堆: 存放new出来的对象 需要垃圾回收器来回收:System.gc() 方法区: 存放:的信息(代码)、static变量、字符串常量等。

39382

索引和索引

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

78400

python之类的重写方法与调用方法

博主简介:原互联网大厂tencent员工,网安巨头Venustech员工,阿里云开发社区专家博主,微信公众号java基础笔记优质创作者,csdn优质创作博主,创业者,知识共享者,欢迎关注,点赞,收藏...下面我们来介绍一下python的的重写方法与调用方法。...---- 二、重写方法与调用方法   在继承关系中,子类会自动继承中定义的方法,但如果中的方法功能不能满足需求,就可以在子类中重写的方法。...2.子类调用方法   如果需要在子类中调用的方法,可以使用内置函数super()或通过“名.方法名()”的方式来实现。 例:子类调用的方法示例。...,欢迎点赞、收藏、在看,欢迎微信搜索关注java基础笔记,后面会不断更新相关知识,大家一起进步。

2.7K30

Java中子类和间的调用关系

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

95830
领券