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

相关推荐

通过声音识别鸟类

根据野生鸟类的外表来识别它是一回事。仅仅根据声音来识别同一只鸟是另一回事。除非你是一个熟练的观鸟者,通过声音识别鸟类可能相当具有挑战性德国马尔堡大学的一组数学、计算机科学和生物学研究人员设计了一种快速识别鸟类和监测当地生物多样性的方法。他们使用连接到 NVIDIA 的便携式设备拍摄的录音根据研究人员的说法是一个边缘人工智能系统,“基于分布式系统中运行的嵌入式边缘设备,能够对森林中记录的声景进行高效、连续的评估。”要了解更多信息,请参阅。

分享AI前沿科技 1680

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

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

weixin_42521649的博客 278

LAN8720芯片硬件设计避坑指南:从晶振选择到PHY地址配置的5个关键细节

本文深入解析LAN8720以太网PHY芯片硬件设计的五个关键细节,涵盖晶振模式选择、PHY地址配置、复位电路设计、电源滤波与接口布线。重点阐述了REF_CLK Out与REF_CLK In两种时钟模式的配置逻辑与应用场景,提供了避免通信失败与信号完整性问题的实战方案,是嵌入式网络硬件开发的实用避坑指南。

i1j2k的博客 514

覆盖构造函数

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

Amyselfin的专栏 2218

Intel网卡固件烧录实战:eeupdate与bootutil命令完全解析

固件作为硬件设备底层运行的软件,其稳定性直接决定硬件功能的完整性。网卡固件一旦损坏,常表现为MAC地址丢失、PXE启动失效、NVM数据异常导致降速或掉线。维护这类问题,需借助Intel官方工具eeupdate与bootutil在UEFI Shell或DOS环境下执行底层烧录操作。eeupdate负责网卡的身份信息与NVM存储管理,可重置MAC、恢复固件镜像;bootutil则专管启动行为,支持PXE配置与Boot Agent升级。从环境准备、命令参数到故障恢复,掌握这两款工具能让运维人员在修复存量网卡、应对

weixin_34269583的博客 312

从零开始STM32cubeide学习

使用的是正点原子的精英版,单片机是STM32F103ZET6,详细讲解完成跑马灯实验

weixin_44077208的博客 2280

JAVA 类初始化及继承相关

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

247

EM的理论与实践(基础篇)

EM理论与实践

m0_61544122的博客 2379

构造函数与方法的覆盖

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

nieou的专栏 1973

ICC2:平行打孔create_pg_stapling_vias

power rail(follow pin)不总是metal1一成不变的,当需要使用metal2做power rail,而standard cell的pg pin仍然是metal1时就需要平行打孔,从metal2到metal1。 以往都是用create_pg_vias -allow_parallel_objects来做,但这样有两个弊端,一是需要抓出所有的via12(包括standard cell内部的和出pin绕线产生的),添加routing blockage,防止create pg via的时候产生d

m0_61544122的博客 2258

GVINS数据采集(u-blox fp9 + D435i)

1、配置千寻的RTK账号 采集数据当天购买千寻的RTK账号,然后在Window下,输入账号和密码 (具体的步骤如之前面连接所示),查看u-center软件上的信息,确保接收机可以收到RTK信息; 2、查看Linux系统下u-blox是否可以正常接受GPS信号和RTK数据流 1、GPS信号信息 // 打开端口 1 cd ublox_f9p/src // 或者在终端1下也可以 source devel/setup.bash r.....................

努力努力努力 2609

如何对构造函数进行隐藏

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

bigchen 565

【YOLO11改进 - 注意力机制】SCSA通过结合空间注意力和通道注意力,提高各种下游视觉任务的性能。

【YOLO11改进 - 注意力机制】SCSA通过结合空间注意力和通道注意力,提高各种下游视觉任务的性能。

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 474

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

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

hys741254872的博客 3375

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

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

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Java构造函数

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

小猪卟上树 500

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

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、付费专栏及课程。

余额充值