Java基础——this关键字与super关键字

Java基础——this关键字与super关键字

  有关this关键字与super关键字的介绍及区别,可以参考:this与super关键字详解,这里只重点强调this关键字与super关键字中一些关键的知识点。
  首先,this关键字与super关键字的定义:

  this:代表了所属函数的调用者对象,代表了对象的内存地址
  this是指向本类中某一个对象的一个变量,this相当于文章中第一人称的“我”,所有人描述自己的时候都会说“我”,只要读“我”的这个人发生变化,这个“我”指向的人就变了;而this关键字与之类似,this是抽象的,刚开始并不知道是指代谁,this是每一个对象携带的变量,这个变量所指向的都是自己,this只是起到了一个描述的作用:只要有一个具体的对象来执行的时候,this就用这个对象的this,换一个对象,this就变成另一个对象的this,所以只有在执行的时候才知道指向谁。就像文章中的“我”,只有确定了谁是读这篇文章的,才能确定这个“我”指代谁;
  super:代表了父类空间的引用

  说到this,首先先说一下命名遮挡

  命名遮挡(name shadow):局部变量、形参或者其他,与属性、方法或者其他重名导致直接通过名字访问出现歧义。

  因此可以通过this调用本类方法及属性:
   通过this<关键字>调用本类属性:只要在类中访问类的属性,一定要加上this关键字
   类的某个构造方法通过this()<方法>调用其他的构造方法,this调用构造方法必须出现在构造方法的第一行(编译期错误),也不允许成环(编译期错误)
	class Person{
	    public Person() {
	        this(15);
	    }
	    public Person(int value) {
	    }
	}
   通过this<关键字>调用本类中普通方法(this.方法名(参数)):当有类的继承关系时,表示本类方法一定要加上this关键字区别于super本类中没有找子类中的同名方法
  this就如上面描述的一样,代表这个类对象本身。实际上就是那个"我",但具体这个"我"指的是谁,和该类的对象密切相关。下面说一下super关键字,super关键字大多作用于方法之上。
   当super()<方法>用于子类构造方法时:
    当子类调用父类无参构造时(系统默认会调用),super()可写可不写,表示调用父类的无参构造方法。
    当子类调用父类有参构造时,super(参数列表)必须要写,要告诉编译器调用的到底是父类的哪个有参构造方法。
   特别要注意的是:
    当父类中没有无参构造器(无论是默认生成还是自己手写),子类构造器中必须使用super(参数列表)调用父类的有参构造方法。且必须是出现在子类构造方法的第一行语句
    如果是父类存在自定义的无参构造(无论有无有参构造,只要存在无参构造系统就会默认调用),子类可以不直接使用super(),系统默认会调用父类无参构造的。
	class Person{
	    public Person() {
	    }
	    public Person(int value) {
	    }
	}
	
	class Student extends Person{
	    public Student() {
	    }
	}
    若父类没有无参构造,就必须得使用super()调用父类有参构造。
	class Person{
	    public Person(String value) {
	    }
	}
	
	class Student extends Person{
	    public Student() {
	        super("hello");
	    }
	}
    this()和super()不能同时出现在构造方法中(都要出现在第一行),注意:此处指的是this()这个函数(调用本类其他构造方法),而不是this(值当前类的实例对象)
   当super<关键字>用于子类普通方法时:用于在子类中明确调用父类被覆写的方法。如果不使用super进行调用,子类调用的是子类重写父类的方法。
	class Person{
	    public void fun(){
	        System.out.println("我是学生");
	    }
	    public void show(){
	        System.out.println("你好人类");
	    }
	}
	
	class Student extends Person{
	
	    public void fun(){
	        System.out.println("我是学生");
	        // 此处调用的show()是子类覆写父类的方法
	        show();
	
	    }
	    public void show(){
	        System.out.println("你好学生");
	    }
	}
	class Person{
	    public void fun(){
	        System.out.println("我是学生");
	    }
	    public void show(){
	        System.out.println("你好人类");
	    }
	}
	
	class Student extends Person{
	
	    public void fun(){
	        System.out.println("我是学生");
	        // 此处调用的show()是子类明确调用父类被覆写的方法
	        super.show();
	
	    }
	    public void show(){
	        System.out.println("你好学生");
	    }
	}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值