欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JAVA基础(this关键字)

程序员文章站 2022-07-10 19:08:38
this关键字:1.this调用类中属性package 类与对象;class Person{ private String name; private int age; //使用this,构造方法中参数名与属性名相同 public Person(String name,int age){ this.name=name; this.age=age; } public String getInfo() {...

this关键字:

JAVA基础(this关键字)
1.this调用类中属性

package 类与对象;
class Person{
    private String name;
    private int age;
    //使用this,构造方法中参数名与属性名相同
    public Person(String name,int age){
        this.name=name;
        this.age=age;
    }
    public String getInfo()
    {
       //此处返回姓名和年龄可以不加this
        return "姓名:"+this.name+" 年龄:"+this.age;
    }
}
public class ThisDemo {
    public static void main(String[] args) {
        Person p = new Person("aaa",10);
        System.out.println(p.getInfo());
    }
}

JAVA基础(this关键字)
2.this调用类中方法
(1)调用普通方法

package 类与对象;
class Person{
    private String name;
    private int age;
    public Person(String name,int age){
        this.name=name;
        this.age=age;
        this.Print();//this调用普通方法,可以放在任意位置,此处this可以省略
    }
    public String getInfo()
    {
        return "姓名:"+name+" 年龄:"+age;
    }
    public void Print()
    {
        System.out.println("this调用Print()普通方法");
    }
}
public class ThisDemo {
    public static void main(String[] args) {
        Person p = new Person("aaa",10);
        System.out.println(p.getInfo());
    }
}

JAVA基础(this关键字)

(2)调用构造方法

package 类与对象;
class Person{
    private String name;
    private int age;
    //在使用this()进行构造方法之间互相调用时,要保留方法的出口--->即至少一个构造函数中没有this()调用其他构造方法出现
    //此处的无参构造就是“出口”!!!
    public Person()
    {
        System.out.println("构造方法初始化对象!");
    }
    public Person(String name)
    {
        this();//调用上述无参构造,且只能放在此构造函数的首行
        this.name=name;
    }
    public Person(String name,int age){
        this(name);//调用上述单参构造,且只能放在此构造函数的首行
        this.age=age;
    }
    public String getInfo()
    {
        return "姓名:"+name+" 年龄:"+age;
    }
}
public class ThisDemo {
    public static void main(String[] args) {
        Person p = new Person();
        Person p1 = new Person("bbb");
        Person p2 = new Person("aaa",10);
        System.out.println(p.getInfo());
        System.out.println(p1.getInfo());
        System.out.println(p2.getInfo());
    }
}

JAVA基础(this关键字)

package 类与对象;
class Person{
    private String name;
    private int age;

    public Person()
    {
        this("无名氏",0);
    }
    public Person(String name)
    {
        this(name,10);
    }
    //此处构造方法为“出口”,不含有this()调用其他构造方法
    public Person(String name,int age){
        this.name=name;
        this.age=age;
    }
    public String getInfo()
    {
        return "姓名:"+name+" 年龄:"+age;
    }
}
public class ThisDemo {
    public static void main(String[] args) {
        Person p = new Person();
        Person p1 = new Person("bbb");
        Person p2 = new Person("aaa",20);
        System.out.println(p.getInfo());
        System.out.println(p1.getInfo());
        System.out.println(p2.getInfo());
    }
}

JAVA基础(this关键字)
3.this表示类的当前对象(实例化后并且正在使用(比如调用方法,调用属性)的对象)

package 类与对象;
class Person{
    private String name;
    private int age;

    public void Print()
    {
        //哪个对象调用了Print()方法,this就指向哪个对象
        System.out.println("this指向当前对象--->"+this);
    }
}

public class ThisDemo {
    public static void main(String[] args) {
        Person p = new Person();
        System.out.println("p: "+p);
        p.Print();
        Person p1 = new Person();
        System.out.println("p1: "+p1);
       p1.Print();
    }
}

JAVA基础(this关键字)
4.类的嵌套调用之深入理解this表示当前对象:

package 类与对象;
class A {
    private B b;
    //2.调用A类的构造,转到--->3
    public A() {
        this.b = new B(this);//3.实例化B类属性b,this就是当前的temp对象,转到--->4
        b.get();//5.调用B类的get(),转到--->6
    }
    //7.执行print()
    public void print() {
        System.out.println("hello world");
    }
}
class B {
    private A a;
    //4.调用B类构造,此处this就是this.b对象,此时this.a=temp,转到--->5
    public B(A a) {
        this.a = a;
    }
    public void get() {
        //6.调用A类的print(),转到--->7
        a.print();
    }
}
public class ThisDemo {
    public static void main(String[] args) {
        //1.实例化A类对象转到--->2
          A temp = new A();
    }
}

JAVA基础(this关键字)

package 类与对象;
class Message {
    private String info = "ssss";
    public Message(String info) {
        this.info = info;
    }
    public String getInfo() {
        return info;
    }
    public void setInfo(String info) {
        this.info = info;
    }
}
    public class DEMO1 {
        public static void main(String[] args) {
            Message msg = new Message("Hello");
            fun(msg);
            System.out.println(msg.getInfo());
        }
        public static void fun(Message temp)
        {
            temp.setInfo("World");
        }
    }


JAVA基础(this关键字)
------------------- (图一)
JAVA基础(this关键字)
------------------(图二)
说明:由于String字段的内容不可改变,所以画内存图的时候,可以把String字段当做一般数据类型的字段画如图二所示
附:
基本数据类型是放在栈中还是放在堆中,这取决于基本类型声明的位置。
一:在方法中声明的变量,即该变量是局部变量,每当程序调用方法时,系统都会为该方法建立一个方法栈,其所在方法中声明的变量就放在方法栈中,当方法结束系统会释放方法栈,其对应在该方法中声明的变量随着栈的销毁而结束,这就局部变量只能在方法中有效的原因, 在方法中声明的变量可以是基本类型的变量,也可以是引用类型的变量。

     (1)当声明是基本类型的变量的时,其变量名及值(变量名及值是两个概念)是放在方法栈中

     (2)当声明的是引用变量时,所声明的变量(该变量实际上是在方法中存储的是内存地址值)是放在方法的栈中,该变量所指向的对象是放在堆类存中的。

二:在类中声明的变量是成员变量,也叫全局变量,放在堆中的(因为全局变量不会随着某个方法执行结束而销毁)。

   同样在类中声明的变量即可是基本类型的变量 也可是引用类型的变量

   (1)当声明的是基本类型的变量其变量名及其值放在堆内存中的

   (2)引用类型时,其声明的变量仍然会存储一个内存地址值,该内存地址值指向所引用的对象。引用变量名和对应的对象仍然存储在相应的堆中

(更多关于java栈区,堆区等有关内容见以下博客
https://blog.csdn.net/terstdfhuc/article/details/86526047)

本文地址:https://blog.csdn.net/weixin_43563049/article/details/107675984