JAVA构造函数、覆盖、隐藏

Java编程中方法覆盖与构造函数的奥秘 本文通过分析Java编程中的方法覆盖、隐藏、重载以及构造函数的相关问题,深入探讨了面向对象编程中多态性和继承的细节。通过实际代码示例,我们能够更好地理解这些概念如何在实际开发中应用。 阅读详情
 

 

      JAVA是完全面向对象的开发语言,因此对面向对象语言的三个基本特点:封装、继承、多态,要有清晰地认识。封装自然不必说,只有设计时如何识别、分辨出类、对象等等,也就是说封装的概念主要是设计上的概念,对具体的开发过程并没有什么需要特别注意的。而继承、多态的部分对具体的开发过程、技术却有很多需要特别注意的地方。下面把几个需要特别留意的地方详细解释,说明一下。

      首先,对于类的继承关系,需要特别注意的就是JAVA中的构造函数。有几个点需要特别留意的:

      1.子类中一定会调用父类的构造函数。即使不使用显式的super(...)来调用父类的构造函数。

      2.如果在子类构造函数中,没有使用super(...)调用父类的构造函数,那么JAVA编译器会默认直接在子类构造函数的第一句执行super(),也就是说在子类的构造函数中首先调用父类的不带有参数的构造函数。

      3.在JAVA中,在类中如果不编写类的构造方法,则默认JAVA自动生成参数为空的构造函数,也就是在子类构造方法默认直接 调用的父类的构造方法。(这里就是为什么我们在使用JAVA时,如果不提供父类、子类的构造方法,仍能正常工作的原因。)

      4.在子类的构造方法中,如果要手动调用父类的构造方法,那么必须在子类构造方法的第一句调用,也就是

 

class Descent
{
      public Descent(){
                      super();
                      .............
                }
}

      这里所使用的super()可以是带有参数的super(...)。

      5.对类的构造方法来说,一旦自定义构造方法,那么JAVA编译器就不会生成默认构造方法了。也就是说一旦自定义了带有参数的构造方法,而没有定义参数为空的构造方法,那么这个类的子类构造方法中,JAVA就不会为其添加父类参数为空的构造方法,这种情况下,或者在子类中手动调用super(...),调用父类的带有参数的构造方法,或者在父类中手动添加参数为空的构造方法。

 

      说完了关于继承中构造方法的问题,再来看看继承、多态中另一个让人头疼的问题。方法的覆盖、与隐藏。这个概念需要仔仔细细的辨析一下。首先,明确一下,在JAVA中识别不同的方法所使用的概念,叫做签名(Signature)在JAVA中识别父类、子类的集成体系中,不同的方法,通过方法的名称,方法参数类型、参数个数来识别不同的方法,也就是所谓的签名。这个概念是在JAVA中分辨覆盖、隐藏的基础。所谓的覆盖、隐藏指的都是在子类中编写了与父类签名相同的方法。下面主要说一下覆盖与隐藏的主要区别。

      覆盖与隐藏从不同的角度来理解,主要可以有两方面的不同。从方法角度来看,覆盖与隐藏主要是对象方法、与类方法的区别。什么是类方法那,类方法就是在类中声明为static的方法。这种方法是与类绑定的,如果在子类中对这种方法定义与父类签名相同的方法,那么JAVA使用隐藏的处理方式,反之,方法前无static关键字,在子类中定义与父类方法签名相同的方法,JAVA使用覆盖的方式来处理。覆盖的处理方法就是在调用该方法时,调用实际对象的方法。隐藏的处理方法就是根据调用方法所属的类来识别、调用不同的方法。

      从另一个角度可以更清晰地解释二者的不同,就是JAVA运行时与编译时的区别。运行时,就是根据实际所使用的对象,调用对象方法。编译时,可以这样来理解,就是在编写代码时,所声明的对象所属的类别。举个简单例子:

      Sup sup = new Sub();

      这里Sub是Sup的子类。从运行时的角度来看,所声明的对象sup是一个Sub对象。从编译时的角度来看,sup是一个Sup的对象。理解这个层次,就可以更好的理解隐藏与覆盖了。隐藏是运行时的概念,也就是说,在sup中调用属于覆盖的对象方法,那么所调用的是运行时真正对象的方法,也就是Sub的方法,这个就是覆盖。而隐藏是一个“编译时”的概念,也就是说在在sup中调用static所声明的类方法(标准方法应该是使用Sup.xxx),那么调用的却是Sup的静态方法。从运行时、编译时的概念来理解隐藏、覆盖更有效果,明确一点就是所有的static方法,都是类方法,所以所调用的永远都是变量所属类的静态方法。而非static方法,属于对象方法,这里适用于面向对象的多态的概念,也就是说,对象方法永远识别的是变量所属的对象,也就是实际new XXX的对象。也就是多态。

      上面的概念如果清楚了,那么最后一点需要明确的就是在类中的属性,也同样复合覆盖、与隐藏的概念,static属性,使用隐藏,非static使用覆盖。而对类中属性的签名,就专指属性的名称了,属性的类型不在考虑之列。

 

      欢迎大家对本文进行批评指正。

                              ——欢迎转载,请注明出处 http://blog.youkuaiyun.com/zyplus——

 

 

Java编程中的多态性与方法覆盖规则 本文深入探讨了Java编程中的多态性、方法覆盖、隐藏变量以及构造函数的规则。通过理解方法的重载与重写、有效引用转换以及隐藏变量的概念,我们可以编写出更加灵活、易于维护的代码。文章还涉及了一些练习题,帮助读者加深对核心概念的理解。 阅读详情

相关推荐

OpenClaw Windows 最详细安装指南

Windows上养龙虾:OpenClaw完整安装教程+钉钉接入,助你养只大龙虾

weixin_43405859的博客 2212

java 覆盖构造函数_JAVA构造函数、覆盖、隐藏

JAVA是完全面向对象的开发语言,因此对面向对象语言的三个基本特点:封装、继承、多态,要有清晰地认识。封装自然不必说,只有设计时如何识别、分辨出类、对象等等,也就是说封装的概念主要是设计上的概念,对具体的开发过程并没有什么需要特别注意的。而继承、多态的部分对具体的开发过程、技术却有很多需要特别注意的地方。下面把几个需要特别留意的地方详细解释,说明一下。首先,对于类的继承关系,需要特别注意的就是JA...

weixin_42521649的博客 278

强化学习:Distributed PPO (DPPO) 学习笔记

DPPO = Distributed + Proximal Policy Optimization Distributed:多个智能体并行训练 Proximal:限制策略更新幅度,确保稳定性 Policy Optimization:基于策略梯度的优化方法 核心思想:多个智能体并行探索环境,共享经验,通过裁剪策略更新确保训练稳定

只是个人学习笔记 1331

覆盖构造函数

       从技术上说,构造方法是不能被覆盖的。由于它们的名称总是与当前类相同,构造函数是新创建的,而不是继承而来的。在很多时候,这样做是没有问题的;当类的构造方法被调用时,所有超类中特征标与此相同的构造方法也将被调用。因此,类中所有继承而来的部分都将被初始化。       然而,为类定义构造方法时,可能想修改对象的初始化方式,不但初始化类中新增的变量,而且要修改继承而来的变量的内容。为此,

Amyselfin的专栏 2218

RK3568部署YOLOv8的7种方法对比:量化vs非量化的性能实测与优化建议

本文针对RK3568平台,深度对比了YOLOv8模型的七种部署方法,重点分析了量化与非量化策略的性能差异。通过实测数据,详细评估了不同方法在推理速度、CPU占用、内存消耗及模型精度上的表现,并提供了从模型结构调整到系统级优化的具体建议,为边缘AI部署选型提供实用参考。

weixin_29099217的博客 527

手把手教你完成YOLOv8分类识别界面搭建,使用Qt6设计YOLOv8分类识别系统,前台系统+后台管理系统开发实战,全网最详细教程

本项目基于YOLOv8分类模型,结合PySide6框架开发了一套图形化分类识别系统,支持图片、视频和摄像头实时检测。系统包含以下功能: 分类识别模块:完成图像/视频目标分类,界面展示检测结果。 用户管理模块:支持登录注册、头像修改、密码重置等功能。 AI问答模块:集成DeepSeek大模型接口,实现流式输出对话。 后台管理系统(第二版新增):管理员可管理用户信息及个人中心。 系统采用MySQL数据库存储用户数据,并提供完整的UI界面与交互逻辑。代码已开源,适用于毕业设计或快速部署场景。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 825

JAVA 类初始化及继承相关

JAVA是完全面向对象的开发语言,因此对面向对象语言的三个基本特点:封装、继承、多态,要有清晰地认识。封装自然不必说,只有设计时如何识别、分辨出类、对象等等,也就是说封装的概念主要是设计上的概念,对具体的开发过程并没有什么需要特别注意的。而继承、多态的部分对具体的开发过程、技术却

247

使用lightGBM进行数据建模及预测

在机器学习领域中,数据建模和预测一直是非常重要的任务。而lightGBM作为一种基于梯度提升算法的高效机器学习框架,被广泛应用于数据建模和预测中。本文将介绍如何使用lightGBM进行数据建模和预测。到此,我们已经成功使用lightGBM对数据进行了建模和预测。使用lightGBM可以快速、高效地完成数据建模和预测任务,是机器学习领域中不可或缺的工具之一。使用lightGBM进行数据建模及预测。

qq_37934722的博客 1016

构造函数与方法的覆盖

子类可以从父类(超类)继承所有的非私有的方法和变量,但子类不继承父类的构造函数。 每个类至少有一个构造函数,如果不写一个构造函数,Java编程语言将提供一个,该构造函数没有参数,面且函数体为空. 如果增加一个带参数的构造函数声明到一个类中,该类以前没有显式构造函数,那么将失去该缺省构造函数.基于这一点,对new Xxxx()的调用将会引起编译错误.这一点很重要.(必须在new的时候写入的参

nieou的专栏 1973

VXWorks6.9 + Workbench3.3 开发环境部署

VxWorks6.9 + Workbench3.3的安装部署,以及简单示例项目的创建、编译和运行

Mr.Sugarcane 5461

多维时空数据介绍(4)多维栅格数据构建

上图中包含了经度、纬度和时间三个维度,其变量为经度、纬度、时间以及降雨量,对应的变量单位为东经多少度、北纬多少度、阳历1895-1-1日开始多少天以及每年降雨多少毫升,其中经度数值4个、纬度数值3个、时间数值2个都是一维的数据,而降雨量是一个包含经度、纬度、时间的三维数组,数值有4*3*2=24个。在GeoScene 中NetCDF数据可以用做多种多维时空数据的数据源,进行创建、可视化和分析,它可以是多维栅格数据、时空立方体,还可以是体元图层,区别在于其所要表示的内容和目的。变量又分为坐标变量和属性变量。

你好,我是小张同学! 1286

如何对构造函数进行隐藏

设计过程中如何对类的构造函数进行私有化隐藏,仅能通过另一类的接口获取?或是某一固定接口获取?

bigchen 565

18、改进的LSTM用于污染物浓度预测

本文探讨了改进的长短期记忆网络(MLSTM)在空气污染预测中的应用,重点分析了其对印度泰米尔纳德邦五个城市(金奈、塞勒姆、哥印拜陀、马杜赖和图蒂科林)的PM2.5、PM10、SO2和NO2四种污染物浓度的预测效果。通过与传统LSTM模型的对比实验,结果显示MLSTM在预测准确性和执行效率方面均优于LSTM。研究结果表明,MLSTM在空气质量预测领域具有较高的应用潜力,可为环境保护和空气质量管理提供有力支持。

j0k1l2m3n的博客 175

Java中用子类构造函数实例化父类,子类与父类的隐藏与覆盖问题

我们在看代码时,可能会碰到这样的情况: 第一次见的初学者可能会觉得很奇怪,List<String> name = new ArrayList<String>();像这样的对象声明,类名与构造方法不对应,学习过集合的人可能会知道 ArrayList类是List类的子类,这说明可以声明子类类型的父类对象。以下代码说明了这一特性: //文件名:Test3.java class Test{ int a=10; void p() { System.out.println(a)

hys741254872的博客 3375

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Java 继承 - 字段不能被覆盖

package tao.integer; class Base{ public String str = "base"; public Base(){ System.out.println("cons: base... "+this);// cons: base... tao.integer.Sub@1fb8ee3 this.func(); // func: sub .....

天下无双 6083

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Java构造函数

JAVA类继承过程中其成员的一些问题构造函数不能继承。子类的构造函数可以通过super关键字显式调用父类中的构造函数。如果子类中的构造函数没有显式调用父类中的构造函数,编译器就会自动在子类的构造函数中调用父类中参数为空的构造函数。于是,当父类中没有参数为空的构造函数,而子类中又没有显示调用父类的其他构造函数,编译时就会报错。这一点需要特别注意。当父类中没有定义任何构造函数时,编译器就会为它指定一个参

小猪卟上树 500

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

108. Java 继承 - 隐藏字段与 super 关键字

摘要: 本文介绍了Java继承中的字段隐藏与super关键字用法。当子类声明与父类同名字段时,会隐藏父类字段,需通过super访问,但不推荐这种做法以避免代码混淆。super可用于调用被覆盖的父类方法(如super.printMethod())或访问被隐藏字段(如super.name)。在构造函数中,super()必须作为第一条语句调用父类构造方法,支持参数传递。通过示例展示了构造函数链式调用机制,强调若无显式super()调用,编译器会自动尝试调用父类无参构造方法。合理使用super能有效管理继承关系,但

yaoxin521123的博客 899

继承中的构造方法及覆盖与隐藏

继承中的构造方法 一、无参构造函数(默认构造函数)与有参构造函数 子类的所有构造方法都必须调用父类的一个构造方法,如果不显示指定调用父类的哪个构造方法,就默认调用父类的无参构造方法. class A {    //A() { System.out.println("A()");}    A(int i) { System.out.println("A(i)");} } class B extend

nihousheng的专栏 744

JAVA类继承过程中其成员的一些问题

JAVA类继承过程中其成员的一些问题   一、构造函数的问题:   构造函数不能继承。子类的构造函数可以通过super关键字显式调用父类中的构造函数。如果子类中的构造函数没有显式调用父类中的构造函数,编译器就会自动在子类的构造函数中调用父类中参数为空的构造函数。于是,当父类中没有参数为空的构造函数,而子类中又没有显示调用父类的其他构造函数,编译时就会报错。这一点需要特别注意。当父类中没有定义任何构

358

JAVA继承中的私有变量及方法调用问题

一、有参数的父类问题 父类中只有含参的构造函数 class Animal { public String name; public int weight; public Animal(String name, int weight) { this.name = name; this.weight = weight; } } 如上面的代码所示,父类Animal只有一个构造函数(...

suyi的博客 1489

java里有哪三个属性_Java习题集3 - 图文

子类SubClass中定义了公共整型属性SubProperty,则属性SubClass.SuperProperty是否存在?来自何处?答:存在,这个属性是从其父类那里继承来的。35、什么是多重继承?Java是否支持多重继承?Java采取什么机制来替代多重继承?答:一个子类有多个父类的情况称为多重继承,Java不支持多重继承,Java用实现接口的方法替代多重继承。 36、什么是属性(域)的隐藏?答:...

weixin_28882149的博客 537

java子类初始化_Java 父类子类的对象初始化过程

1. 基本初始化过程:对于一个简单类的初始化过程是:static 修饰的模块(static变量和static 块) ---> 按照代码顺序依次执行。|实例变量 及非static模块---> 按照代码顺序依次执行。|构造函数 ---> 执行对应的构造函数。子类的初始化过程。父类static修饰的模块|子类static修饰模块|父类实例变量和非static块|父类对应构造函数。当...

weixin_32350433的博客 879

java 获取继承字段_java-实例字段的继承如何在此特定代码中工作?

java-实例字段的继承如何在此特定代码中工作?class A{int a = 2, b = 3;public void display(){int c = a + b;System.out.println(c);}}class B extends A{int a = 5, b = 6;}class Tester{public static void main(String arr[]){A x ...

weixin_39775428的博客 225

java拾遗补缺

1.如果某类的构造函数是private的那么该类是不可以被继承的//将发生错误class B extends A{        }class A{ private A(){}    }2.如果某类中的方法是static的,那么该方法在子类中不能被覆盖override只能被隐藏hidden..如  class A{  public static void test(){System.out.pri

圣手屠鸭的专栏 865

java笔记1

创建静态内部类对象的一般形式为:外部类类名.内部类类名xxx=new外部类类名.内部类类名() 创建成员内部类对象的一般形式为:外部类类名.内部类类名xxx=外部类对象名.new内部类类名() 在生成对象的过程中,会先初始化对象的成员变量,然后再执行构造器。也就是说类中的变量会在任何方法(包括构造器)调用之前得到初始化,即使变量散步于方法定义之间。 隐藏和覆盖是不同的。隐藏是针对成员变量和静态方法的,而覆盖是针对普通方法的。(后面会讲到) 父类的构造器调用以及初始化过程一定在子类的...

qq_40313232的博客 119
上一篇: JAVA 类初始化及继承相关
下一篇: Android使用定制framework开发应用
zyplus
博客等级 码龄19年 102粉丝 13原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值