Java中super()的使用[通俗易懂]

Java中super()的使用[通俗易懂]目录1.super()的使用实例一一一子类重写父类的方法2.super()的使用实例一一一子类重写父类的变量3.super()的使用实例一一一在子类的构造方法中4.关于构造方法中super()第一种情况:编译不通过第二种情况:编译不通过第三种情况:成功编译通过1.super()的使用实例一一一子类重写父类的方法publicclassA{…

大家好,又见面了,我是你们的朋友全栈君。

目录

1.super()的使用实例 一一一子类重写父类的方法

2.super()的使用实例 一一一子类重写父类的变量

3.super()的使用实例 一一一在子类的构造方法中

 4.关于构造方法中super()

第一种情况:编译不通过

第二种情况:编译不通过

第三种情况:成功编译通过


1.super()的使用实例 一一一子类重写父类的方法

public class A {
	
	private String nameA="A";
	
	public void getName() {
		System.out.println("父类"+nameA);
	}
	public static void main(String[] args) {
	}
	
}


public class B extends A{
	private String nameB="B";
	
	@Override
	public void getName() {
		System.out.println("子类"+nameB);
		super.getName();
	}
	
	public static void main(String[] args) {
		B b=new B();
		b.getName();
	
	}
}

运行结果:

Java中super()的使用[通俗易懂]

结果分析:

在子类B中,我们重写了父类的getName方法,如果在重写的getName方法中我们去调用了父类的相同方法,必须要通过super关键字显示的指明出来。

如果不明确出来,按照子类优先的原则,相当于还是再调用重写的getName()方法,此时就形成了死循环,执行后会报java.lang.StackOverflowError异常。如下图所示:

Java中super()的使用[通俗易懂]

Java中super()的使用[通俗易懂]

2.super()的使用实例 一一一子类重写父类的变量

public class A {
	
	 String nameA="A";

}

public class B extends A{
	 String nameA="B";
	
	
	public void getName() {
		System.out.println("子类"+nameA);
		System.out.println("父类"+super.nameA);
	}
	
	public static void main(String[] args) {
		B b=new B();
		b.getName();
	
	}
}

运行结果:

Java中super()的使用[通俗易懂]

此时子类B中有一个和父类一样的字段(也可以说成父类字段被隐藏了),为了获得父类的这个字段我们就必须加上super,如果没有加,直接写成name = name;不会报错,只是会警告,表示此条语句没有任何意义,因为此时都是访问的子类B里面的那么字段。

我们通过super是不能访问父类private修饰的变量和方法的,因为这个只属于父类的内部成员,一个对象是不能访问它的private成员的。

3.super()的使用实例 一一一在子类的构造方法中

编译器会自动在子类构造函数的第一句加上 super(); 来调用父类的无参构造器;此时可以省略不写。如果想写上的话必须在子类构造函数的第一句,可以通过super来调用父类其他重载的构造方法,只要相应的把参数传过去就好。

因此,super的作用主要在下面三种情况下:

1、调用父类被子类重写的方法;

2、调用父类被子类重定义的字段(被隐藏的成员变量);

3、调用父类的构造方法;

其他情况,由于子类自动继承了父类相应属性方法,关键字super可以不显示写出来。

 4.关于构造方法中super()

第一种情况:编译不通过

Java中super()的使用[通俗易懂]

Java中super()的使用[通俗易懂]

分析:

如果一个类中没有写任何的构造方法,JVM会生成一个默认的无参构造方法。在继承关系中,由于在子类的构造方法中,第一条语句默认为调用父类的无参构造方法(即默认为super(),一般这句话省略了)。所以当在父类中定义了有参构造函数,都是没有定义无参构造函数时,IDE会强制要求我们定义一个相同参数类型的构造器。

在本例中JVM默认给B加了一个无参构造方法,而在这个方法中默认调用了super(),但是父类中并不存在该构造方法

第二种情况:编译不通过

Java中super()的使用[通俗易懂]

同样编译错误,相同的道理,虽然我们在子类中自己定义了一个构造方法,但是在这个构造方法中还是默认调用了super(),但是父类中并不存在该构造方法

第三种情况:成功编译通过

public class A {
	public A(String s) {
		
	}

}

public class B extends A{
	public B(String s) {
		super(s);
	}
}

分析:

所以,只要记住,在子类的构造方法中,只要里面没有显示的通过super去调用父类相应的构造方法,默认都是调用super(),即无参构造方法,因此要确保父类有相应的构造方法。

欢迎大家访问我的公众号,一起来学习成长:

Java中super()的使用[通俗易懂]

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/131999.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mysql密码字段类型_MySQL 字段类型[通俗易懂]

    mysql密码字段类型_MySQL 字段类型[通俗易懂]数值MySQL的数值数据类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数。许多不同的子类型对这些类别中的每一个都是可用的,每个子类型支持不同大小的数据,并且MySQL允许我们指定数值字段中的值是否有正负之分(UNSIGNED)或者用零填补(ZEROFILL)。INT在MySQL中支持的5个主要整数类型是TINYINT,SMALLINT,MEDIUMINT,INT和B…

    2025年7月30日
    5
  • Oracle基础–PL/SQL编程基本语法[通俗易懂]

    Oracle基础–PL/SQL编程基本语法[通俗易懂]一、概念什么是PL/SQL?1.PL/SQL(ProcedureLanguage/SQL)2.PLSQL是Oracle对sql语言的过程化扩展(类似于Basic)3.指在SQL命令语言中增加了过程处理语句(如分支、循环等),使SQL语言具有过程处理能力。二、程序结构通过plsqlDeveloper工具的TestWindow创建程序模版。1.PL/SQL可以分为三个部分:声明部分、可执行部分、异常处理部分。声明部分:此部分是以关键字DECLARE开…

    2022年10月11日
    3
  • QuartusII 9.0安装教程详解及例程测试

    QuartusII 9.0安装教程详解及例程测试目录1.首先下载软件以及文件2.安装软件3.软件4.例程测试5.新建原理图1.首先下载软件以及文件链接:https://pan.baidu.com/s/1qGtGchiD0gXn_3b2ZRRGiA提取码:ofss下载完如下图所示:解压QuertusII9.0的压缩包。2.安装软件2.1.点击setup.exe2.2.接受条款…

    2022年10月16日
    5
  • PHP 二维数组根据某个字段排序

    PHP 二维数组根据某个字段排序PHP 二维数组根据某个字段排序

    2022年4月24日
    45
  • 求做3D游戏的一些想法,最好能用C++

    求做3D游戏的一些想法,最好能用C++本人第一次做3D游戏,可能做向CF这样的游戏个人有几个不明白的问题,希望能得到帮助:1 就是服务器判断阻挡点是怎么个思路?我自己还没一个想法,也可以和2D一样把经过的路线的点的多边形编号取出来再二分判断是不是有阻挡点,如果没有,那这条路是可用的,如果不可以,那说明是外挂!还有没有更好的方法!求大N2 还有3D游戏中要怎么表示多边形的点呢?(也就是用怎样的数据结构)我见recas

    2022年5月17日
    48
  • 应用系统之间数据传输的几种方式

    应用系统之间数据传输的几种方式

    2021年10月31日
    64

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号