Java this()和super()的使用注意
发布时间 - 2026-01-11 00:34:15 点击率:次Java this()和super()的使用注意

使用super和this应该注意这些:
1)调用super()必须写在子类构造方法的第一行,否则编译不通过。每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。
2)super()和this()类似,区别是,super从子类中调用父类的构造方法,this()在同一类内调用其它方法。
3)super()和this()均需放在构造方法内第一行。
4)尽管可以用this调用一个构造器,但却不能调用两个。
5)this和super不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其它的构造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。
6)this()和super()都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句块。
7)从本质上讲,this是一个指向本对象的指针, 然而super是一个Java关键字。
为什么this或者super要放到第一行?
this() super()是你如果想用传入当前构造器中的参数或者构造器中的数据调用其他构造器或者控制父类构造器时使用的,在一个构造器中你只能使用this()或者super()之中的一个,而且调用的位置只能在构造器的第一行,在子类中如果你希望调用父类的构造器来初始化父类的部分,那就用合适的参数来调用super(),如果你用没有参数的super()来调用父类的构造器(同时也没有使用this()来调用其他构造器),父类缺省的构造器会被调用,如果父类没有缺省的构造器,那编译器就会报一个错误。
如下:
class A{
public A(String name)
{
System.out.println(name);
}
}
class B extends A{
public B(String name) {
super(name);
}
}
class A中没有构造无参的构造函数,如果在class B中的构造函数如果没有调用super(name)将会报错。
假如我们允许把this 和super放置到任何位置。那么请看下面代码:
class A{
A()
{
System.out.println("You call super class non-args constructor!");
}
}
class B extends A
{
B()
{
//这里,编译器将自动加上 super();
System.out.println("You call subclass constructor!");
}
B(String n)
{
super();
this();//ERROR:编译错误
//实际就是调用了B(){...},而在B(){...}中编译器自动加上了super();这样就相当于两次调用了super();也就是说对父类进行了两次初始化。而在实例化一个对象时,一个构造方法只能调用一次,这说明this和super不能同时存在一个构造方法中。同时因为系统没有在第一行发现this()或super()调用,就会自动加上super(),如果没有将this()和super()放在第一行就会产生矛盾。因为总有一个super()在第二句上。所以该程序不能通过编译!!!
}
}
也就是说你必须在构造器的第一行放置super或者this构造器,否则编译器会自动地放一个空参数的super构造器的,其他的构造器也可以调用super或者this,调用成一个递归构造链,最后的结果是父类的构造器(可能有多级父类构造器)始终在子类的构造器之前执行,递归的调用父类构造器。无法执行当前的类的构造器。也就不能实例化任何对象,这个类就成为一个无为类。
从另外一面说,子类是从父类继承而来,继承了父类的属性和方法,如果在子类中先不完成父类的成员的初始化,则子类无法使用,应为在java中不允许调用没初始化的成员。在构造器中是顺序执行的,也就是说必须在第一行进行父类的初始化。而super能直接完成这个功能。This()通过调用本类中的其他构造器也能完成这个功能。
因此,this()或者super()必须放在第一行。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# Java
# this()和super()
# this()和super()关键字的使用
# 详解Java编程中super关键字的用法
# java之super关键字用法实例解析
# Java继承extends与super关键字详解
# Java super关键字的使用方法详解
# 举例讲解Java编程中this关键字与super关键字的用法
# java方法重写和super关键字实例详解
# java中this与super关键字的使用方法
# java 关键字super详解及用法
# Java中super关键字介绍以及super()的使用
# 子类
# 就会
# 放在
# 递归
# 类中
# 是一个
# 器中
# 而在
# 两次
# 如果没有
# 报错
# 会报
# 都是
# 也就是说
# 如果你
# 也不
# 会有
# 也就
# 将会
# 上了
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
微信h5制作网站有哪些,免费微信H5页面制作工具?
Laravel如何使用Sanctum进行API认证?(SPA实战)
JS经典正则表达式笔试题汇总
Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置
高防服务器如何保障网站安全无虞?
如何在宝塔面板中创建新站点?
javascript中闭包概念与用法深入理解
javascript读取文本节点方法小结
如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】
ChatGPT 4.0官网入口地址 ChatGPT在线体验官网
javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】
Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives
如何用PHP工具快速搭建高效网站?
laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法
Laravel如何使用Passport实现OAuth2?(完整配置步骤)
如何基于云服务器快速搭建网站及云盘系统?
linux top下的 minerd 木马清除方法
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
Python文件异常处理策略_健壮性说明【指导】
Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中
实例解析Array和String方法
Python并发异常传播_错误处理解析【教程】
图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?
laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法
Python文件流缓冲机制_IO性能解析【教程】
Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑
如何挑选优质建站一级代理提升网站排名?
如何在 Pandas 中基于一列条件计算另一列的分组均值
常州企业网站制作公司,全国继续教育网怎么登录?
iOS UIView常见属性方法小结
使用豆包 AI 辅助进行简单网页 HTML 结构设计
javascript如何操作浏览器历史记录_怎样实现无刷新导航
Laravel如何操作JSON类型的数据库字段?(Eloquent示例)
Laravel怎么实现模型属性的自动加密
Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用
Laravel如何实现API版本控制_Laravel API版本化路由设计策略
高防服务器租用指南:配置选择与快速部署攻略
Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面
Laravel如何使用查询构建器?(Query Builder高级用法)
简单实现Android文件上传
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】
北京企业网站设计制作公司,北京铁路集团官方网站?
Laravel如何实现多对多模型关联?(Eloquent教程)
Python高阶函数应用_函数作为参数说明【指导】
百度输入法ai组件怎么删除 百度输入法ai组件移除工具
北京网页设计制作网站有哪些,继续教育自动播放怎么设置?
网站建设要注意的标准 促进网站用户好感度!
如何在Windows服务器上快速搭建网站?
Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置

