this和super

作用域

作用域怎么说呢就是全局和除全局之外的变量,挺简单的,想你后面的只是尤其是多态这些都会有用到就不总结了,就是局部无默认,且不加修饰符,下面有的是关键字来可以使你知道的是什么变量,如果想理解就看就自己去了解。

this

this首先你的知道他在堆里是也是创建了的,但是他存放的地址是堆里的地址,所以我们在set是就会有this.name = name,因为this.name指的就是这个在堆中的地址,总结下来就是谁调用,就是谁的this,好好理解。

下面是细节部分

首先就是this可以区分属性和局部变量

取个经典的例子idea中的setter 

其次是this可以访问我们的变量属性,方法,构造器

属性自然不必多说。

方法则与继承是有关的,他会从子类即本身来开始找方法,找不到就会找父类的,如果再找不到就会报错

​
package com.Extends.This01;

public class This01
{
    public int age=1;
    public void hi()
    {

        System.out.println("我是this01的hi方法");
    }

}
package com.Extends.This01;

public class This02 extends This01
{
    public int age = 2;
    public void hi()
    {

        System.out.println("我是this02的hi方法");


    }
    public void hihi()
    {
        this.hi();
        super.hi();
    }
    public void text()
    {
        System.out.println("this.name="+this.age+"  super.age"+super.age);
    }

}
public class This03
{
    public static void main(String[] args)
    {
        This02 this02 = new This02();
        this02.hihi();
        this02.text();

    }
}


​

结果如下,他充分说明了this和super调用方法和属性的不一样。

this和super

 至于构造器会用就行除了比较恶心的就是在一个两个或三个构造器中用一个this连接他们

​
​
package com.Extends.This01;

import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;

public class ThisText {
    public static void main(String[] args)
    {//创建AAA
        AAA dog = new AAA("波吉");


    }

}

class AAA
{
    private String name;
    private int age;
    public AAA()
    {
        this(12);//关键就是这里会用和记得放在第一行就可以了
        System.out.println("我是无参构造器");
    }


    public AAA(String name) {//先来到这
        this();//jump to age
        System.out.println("我是name的构造器");
        this.name = name;
    }

    public AAA(int age)
    {

        System.out.println("我是age的构造器");
        this.age =age;
    }

​

​

虽说有点sb,但快乐是真的还差点弄出个死循环,对了附上结果

this和super

Call to 'this()' must be first statement in constructor body

this在构造器必须要在第一行,不然就会出现上述语句

还有额外一点就是this只能在类里及方法定义,因为他的形成过程,详情可以看类的形成过程

加上一个this指向堆的地址。

super

其实就是this的父类版,他从父类开始,就像this一样,他们两个都需要在第一句(构造器)中,所以不能共存,而且因为修饰符的原因,你无法用super访问到父类私有属性和方法,就算再这么继承那也是不同的类,所以super用不了那些

但super就是在初始化使用到

package com.Modifier;

public class Modifier extends Modifier_text {
    public Modifier(String name) {
        super(name);
    }
    public void text02()
    {
        System.out.println();
    }

}

super父类,其他的子类会自己初始化

还有就是访问上父类方法是,就近原则;

记住继承的图就好了。

上一篇:Java学习笔记十一:面向对象之封装、继承、多态


下一篇:低调的采集,低调的学习,用自然资源部信息中心网站,来练习Python爬虫