• this的用法


    this常见的用法有两种:

    1.用this调用成员变量和成员函数

    class Person
    {
    	String name ; 
    	void talk()
    	{
    		System.out.println("my name is" + this.name);
    	}
    }
    

      

    class Test
    {
    	public static void main(String args[])
    	{
    		Person p1 = new Person();
    		p1.name = "zhangsan";
    		p1.talk();
    	}
    }
    

      编译后执行Test,打印出“my name is zhangsan”

      this是一个对象,代表调用了"this所在函数的"那个对象,比如上面,p1.talk()调用了talk(),this就代表p1。this.name相当于p1.name。

      this一般不加也可以,比如上面第一段函数中的this。但是当成员变量参数名一致的时候就必须加this,比如下面这种情况:

    class Person
    {
    	String name ; 
    	void talk(name)
    	{
    		System.out.println("my name is" + name);
    	}
    }
    

      注意这里是没有加this的;这个时候如果在Test里的talk函数里传入“zhangsan1”,如下:

    class Test
    {
    	public static void main(String args[])
    	{
    		Person p1 = new Person();
    		p1.name = "zhangsan";
    		p1.talk(zhangsan1);
    	}
    }
    

      编译执行Test后打印出来的就是"my name is zhangsan1"。就是说默认传给了参数。如果要传递给成员变量的name,就要加this。

      同样,this作为对象,可以调用成员函数

    2.this调用构造函数

    class Person
    {
    	String name ; 
    	int age ; 
    	String address ; 
    	
    	Person()
    	{
    		System.out.println("无参数构造函数");
    	}
    	Person(String s1 , int a , String s2)
    	{
    		name = s1 ; 
    		age = a ; 
    		address = s2 ; 
    	}
    	void talk()
    	{
    		System.out.println("my name is" + this.name);
    	}
    }
    

      用了this,上面就可以这样写:

    class Person
    {
    	String name ; 
    	int age ; 
    	String address ; 
    	
    	Person()
    	{
    		System.out.println("无参数构造函数");
    	}
    	Person(String name , int age , String address)
    	{
    		this.name = name ; //第一个name是成员变量,第二个name是参数
    		this.age = age ; 
    		this.address = address ; 
    	}
    	void talk()
    	{
    		System.out.println("my name is" + this.name);
    	}
    }
    

      或者当你不需要给所有的成员变量赋值,比如只需给name 和 age赋值,可以加一个构造函数:

    class Person
    {
    	String name ; 
    	int age ; 
    	String address ; 
    	
    	Person()
    	{
    		System.out.println("无参数构造函数");
    	}
    	Person(String name , int age)
    	{
    		this.name = name ; 
    		this.age = age ; 
    	}
    	Person(String name , int age , String address)
    	{
    		this.name = name ; //第一个name是成员变量,第二个name是参数
    		this.age = age ; 
    		this.address = address ; 
    	}
    	void talk()
    	{
    		System.out.println("my name is" + this.name);
    	}
    }
    

      但是这样存在重复代码,这时候可以用this的第二种用法:

    class Person
    {
    	String name ; 
    	int age ; 
    	String address ; 
    	
    	Person()
    	{
    		System.out.println("无参数构造函数");
    	}
    	Person(String name , int age)
    	{
    		this.name = name ; 
    		this.age = age ; 
    	}
    	Person(String name , int age , String address)
    	{
    		this(name , age);
    		this.address = address ; 
    	}
    	void talk()
    	{
    		System.out.println("my name is" + this.name);
    	}
    }

        this调用哪一个构造函数,根据this()中传入的参数个数和类型来决定,比如调用无参构造函数只要写this();即可。注意,这种用法要求对this的调用必须是第一条语句。这样产生了一个矛盾,能不能在三个参数的构造函数里同时调用其他两个构造函数?在this(name , age );之前写一个this();是不可以的。但是可以在第二个构造函数里面写一个this();,形成一个接力形式。也就是:

    class Person
    {
    	String name ; 
    	int age ; 
    	String address ; 
    	
    	Person()
    	{
    		System.out.println("无参数的构造函数");
    	}
    	Person(String name , int age)
    	{
                    this();
    		this.name = name ; 
    		this.age = age ; 
                    System.out.println("两个参数的构造函数");
    	}
    	Person(String name , int age , String address)
    	{
    		this(name , age);
    		this.address = address ; 
                    System.out.println("三个参数的构造函数");
    	}
    	void talk()
    	{
    		System.out.println("my name is" + this.name);
    	}
    }
    

      如此一来,用一个Test来调用:

    class Test
    {
        public static void main(String args[])
        {
            Person p = new Person("Zhangsan" , 20 , "Beijing");
        }
    }

    打印出的是:

    无参数的构造函数

    两个参数的构造函数

    三个参数的构造函数

    (为什么可以直接打印出这三句话呢?见“构造函数”)

    (end)

  • 相关阅读:
    sqlalchemy 使用pymysql连接mysql 1366错误
    mysql之数据导出
    Go常见语句
    huffman code
    后缀数组,目前比较赶进度,而且有点难,所以放到以后再来看
    hash
    bipartite matching
    spanning tree
    拓扑排序
    Union Find
  • 原文地址:https://www.cnblogs.com/larrylawrence/p/3411424.html
Copyright © 2020-2023  润新知