Day20.1:关于this、super的解析
this、super详解
当我们在外部程序调用一个类的方法,如果这个类的方法与其父类的方法重载,我们需要用this、super进行区分
this在Java中是一个复杂的关键字,this的使用形式体现了其灵活性,可以实现三种结构形式的描述:
当前类中的属性:this.属性; super.属性
当前类中的方法(构造方法、普通方法):
普通方法:this.方法名(); super.方法名();
构造方法:this(); super(); —————————————因为构造方法的方法名与类名一致所以直接省去;
- 描述当前对象;
第一种this.属性; super.属性;
在普通方法中:当形参与成员名字相同时,用this.属性; super.属性;加以区分
我们先来看第一种结构形式的案例:
public class Person{
String name="工地佬";
}
public class Students{
private name="工地牛马";
public void test(String name){
System.out.println(name);//此时这个name表示的是当前参数的name;
System.out.println(this.name);//this.name表示当前类的属性,this代表的是Students实例化后的对象
System.out.printlb(super.name);//super.name表示来自的父类的属性;
}
}
public class Application{
public static void main(String[] args){
Students stu=new Students;//Students类实例化时,父类的构造器也会被调用
stu.test("超级牛马");
}
}
第二种this、super结构形式:
this.方法名();——调用本类的方法
super.方法名();——调用父类的方法
//输出结果
超级牛马
工地牛马
工地佬
public class Person{
String name="工地佬";
public void print(){
System.out.println("父类的方法输出了")
}
}
public class Students extends Person{
private name="工地牛马";
public void print(){
System.out.println("子类的方法输出了")
}
public void test1(){
print();//调用本类的print方法
this.ptint();//调用本类的print方法
super.print();//调用从父类继承过来的的print方法
//有人可能疑问,为什么可以直接调用上面的print方法;
//首先两个都是非静态方法,其次Students是Person的子类,Person的方法会被继承,最后非静态的方法可以相互调用!
}
}
public class Application{
public static void main(String[] args){
Students stu=new Students();
stu.print();
}
}
//输出结果
子类的方法输出了
子类的方法输出了
父类的方法输出了
在构造方法中this();是调用自身的构造方法
public class Students{
String name;
int age;
public Students(){
this.name="工地佬";
}
public Students(int age){
this();//此时则是在调用自身的构造器
this.age=age;
}
}
构造方法中的super(); 调用父类的构造器
public class Person{
public Person{
}
}
//Students是Person的子类
public class Students extends Person{
//当父类是无参构造器时,子类可定义有参或无参构造方法
public Students{
//此处隐藏一个父类构造器:super();
}
public Students(String name){
//此处隐藏一个父类构造器:super();
}
}
public class Person{
public Person(String name){
}
}
//Students是Person的子类
public class Students extends Person{
//当父类是有参构造器时,子类构造器中那个默认的父类构造器一定要显示的定义为有参构造;
//因为子类构造器中含有隐藏的、默认的父类无参构造器;
//如果我们不显示的定义父类有参构造器;当子类实例化时,默认的无参父类构造器无法运行,因为父类是有参构造器,构造器不一致,无法构造
//所以我们在定义一个有参构造器的时候,一定要将无参构造器显示的定义出来
public Students{
//此处隐藏一个无参父类构造器:super();如果不加以修改,无参和有参发生冲突,父类构造器无法调用
super(String name);//也就是说子类中调用的父类构造器要与父类中的构造器相符
}
public Students(String name){
//此处隐藏一个无参父类构造器:super();如果不加以修改,无参和有参发生冲突,父类构造器无法调用
super(String name);
}
}
总结:
super(参数);是在调用父类的构造器;this(参数);是在调用本类的构造器
super的结构形式只能出现在子类或者构造器中;
super调用父类方法时在构造器中的必须在代码的第一行;
super和this调用构造器时不能同时出现;因为this();会调用本类其他构造器,必然含有super();
this代表的是调用者本身这个对象,是指向对象的一个指针;
super可以理解为是指向自己父类对象的一个指针;
Day20.1:关于this、super的解析的更多相关文章
- Objective-C语言--self和super关键字解析
看代码: @implementation Son : Father - (id)init{ self = [super init]; if (self){ } return self; } self是 ...
- java中? extends T 和? super T解析
转:https://blog.csdn.net/qq_25337221/article/details/81669630 PECS原则 最后看一下什么是PECS(Producer Extends Co ...
- Scala 特质全面解析
要点如下: Scala中类只能继承一个超类, 可以扩展任意数量的特质 特质可以要求实现它们的类具备特定的字段, 方法和超类 与Java接口不同, Scala特质可以提供方法和字段的实现 当将多个特质叠 ...
- Android 数据存储(XML解析)
在androd手机中处理xml数据时很常见的事情,通常在不同平台传输数据的时候,我们就可能使用xml,xml是与平台无关的特性,被广泛运用于数据通信中,那么在android中如何解析xml文件数据 ...
- Android学习笔记_7_使用 sax 或者 dom 或者 pull 解析XML文件
一.Pull解析介绍: Android上使用SAX和DOM方式解析XML的方法,并且对两种做了简单的比较,通过比较我们知道对在往往内存比较稀缺的移动设备上运行的Android系统来说,SAX是一种比较 ...
- ES6语法中的class、extends与super的原理
class 首先, 在JavaScript中, class类是一种函数 class User { constructor(name) { this.name = name; } sayHi ...
- xml数据解析和生成
java中xml的解析方式有许多,有java自带的DOM.SAX,android中的PULL,其它的还有DOM4J.JDOM等. 本文简要讲述DOM.SAX.PULL三种方式. 1.DOM方法 缺点: ...
- [Scala] 快学Scala A1L1
基础 1.1 声明值和变量 在Scala中,鼓励使用val; 不需要给出值或变量的类型,这个信息可以从初始化表达式推断出来.在必要的时候,可以指定类型. 在Scala中,仅当同一行代码中存在多条语句时 ...
- 【第四篇】Volley修改之GsonRequest
json解析工具类的引入,这里引用lite马天宇的解析json的工具类: public class GsonImpl extends Json { private Gson gson = new Gs ...
- 快学Scala之特质
一个Scala类可以继承多个特质(trait), 特质可能会要求使用它们的类支持某个特定特性, 与Java接口不同, Scala特质可以给出这些特质的缺省实现. 要点如下: Scala中类只能继承一个 ...
随机推荐
- 【Android 逆向】动态调试AliCrackme_1
1 试玩 apk # 安装APK到真机 adb install AliCrackme_1.apk 打开apk,投石问路,输入123试一下 2 将apk 拖入androidKiller,得到反编译的sm ...
- win10设置vmware 虚拟机开机自启
Windows10设置VMware虚拟机开机自启的具体步骤如下: 一.配置vmrun环境变量 1)找到VMware的安装目录,并将目录路径拷贝进入环境变量进行添加,如下图 2)检查添加的环境变量是否生 ...
- Docker安装MySQL并使用Navicat连接
MySQL简单介绍: MySQL 是一个开放源码的关系数据库管理系统,开发者为瑞典 MySQL AB 公司.目前 MySQL 被广泛地应用在 Internet 上的大中小型网站中.由于其体积小.速度快 ...
- aspnetcore6.0源代码编译调试
虽然编译源码折腾了几个时间(卡在restore),最后还是跑起来了aspnetcore6.0mvc源码项目,下面说步骤,前提是网络能连外,对于不能连外的懒得折腾. 第一步 电脑找个地克隆下GitHub ...
- 路径参数:Path Parameters
官方文档地址:https://fastapi.tiangolo.com/zh/tutorial/path-params/ # -*- coding: UTF-8 -*- from fastapi im ...
- Linux日志切割方法[Logrotate、python、shell实现方式]
Linux日志切割方法[Logrotate.python.shell实现方式] 对于Linux系统安全来说,日志文件是极其重要的工具.不知为何,我发现很多运维同学的服务器上都运行着一些诸如每天切分 ...
- 第一章:模型层 - 9:查询集API
本节将详细介绍查询集的API,它建立在下面的模型基础上,与上一节的模型相同: from django.db import models class Blog(models.Model): name = ...
- 论Elasticsearch数据建模的重要性
文章转载自: https://mp.weixin.qq.com/s?__biz=MzI2NDY1MTA3OQ==&mid=2247484159&idx=1&sn=731562a ...
- 字符串反码A
while True: try: string=input() if string!="!": res="" for i in string: if i.isu ...
- 华为设备配置ssh-client命令
ssh client first-time enable 开启首次认证功能不对ssh服务器的RSA公钥进行有效性验证 stelnet 10.1.1.2 登陆R2 sys 进入到R2的系统视图 disp ...