Java中this关键字和static关键字

1 this关键字

this关键字主要有三个方面的用途:

  1. this表示本类属性。
  2. this表示本类方法。
  3. this表示当前对象。

1.1 this表示本类属性

观察以下代码:

class Person{
    private String name;
    private int age;

    public String getName()
    {
        return name;
    }
    public void setName(String name)
    {
       name=name;
    }

    public int getAge()
    {
        return age;
    }
    public void SetAge(int age)
    {
       if(age <= 0)
       {
           System.out.println("年龄输入错误!");
       }
       else
       {
           age=age;
       }
    }
    //构造函数
    public Person(String name,int age)
    {
        name=name;
        SetAge(age);
    }
    public void work()
    {
        System.out.println(name+"在工作!");
    }
    public  void  age()
    {
        System.out.println(name+age+"岁了!");
    }
}
public class Test{
    public static void main(String[] args)
    {
       Person per1=new Person("花花",-18);
        per1.work();
        per1.age();
    }
}

在这里插入图片描述
  通过以上代码,我们发现当参数与类中的属性同名时,类中的属性无法被正确赋值(就近原则,相当于自己=自己)。此时我们加上this关键字便可以正确给对象属性赋值。

class Person{
    private String name;
    private int age;

    public String getName()
    {
        return name;
    }
    public void setName(String name)
    {
       this.name=name;
    }

    public int getAge()
    {
        return age;
    }
    public void SetAge(int age)
    {
       if(age <= 0)
       {
           System.out.println("年龄输入错误!");
       }
       else
       {
           this.age=age;
       }
    }
    //构造函数
    public Person(String name,int age)
    {
        this.name=name;
        SetAge(age);
    }
    public void work()
    {
        System.out.println(name+"在工作!");
    }
    public  void  age()
    {
        System.out.println(name+age+"岁了!");
    }
}
public class Test{
    public static void main(String[] args)
    {
       Person per1=new Person("花花",18);
        per1.work();
        per1.age();
    }
}

在这里插入图片描述
只要在类中访问类的属性,一定要加上this关键字

1.2 this调用本类方法

1.2.1 this调用普通方法

格式:this.方法名称(参数)

class Person{
    private String name;
    private int age;

    public String getName()
    {
        return name;
    }
    public void setName(String name)
    {
       this.name=name;
    }

    public int getAge()
    {
        return age;
    }
    public void SetAge(int age)
    {
       if(age <= 0)
       {
           System.out.println("年龄输入错误!");
       }
       else
       {
           this.age=age;
       }
    }
    //构造函数
    public Person(String name,int age)
    {
        this.name=name;
        SetAge(age);
        this.work();
    }
    public void work()
    {
        System.out.println(name+"在工作!");
    }
    public  void  age()
    {
        System.out.println(name+age+"岁了!");
    }
}
public class Test{
    public static void main(String[] args)
    {
       Person per1=new Person("花花",18);
    }
}

在这里插入图片描述
  虽然调用本类的普通方法不需要加this也可以正常调用,但还是建议加上,this的可以区分方法定义来源,在继承中有效。

1.2.2 this调用构造方法

观察构造方法存在的问题:

class Person{
	private String name;
	private int age;
	public Person(){
		System.out.println("********产生一个新的Person对象********");
	}
	public Person(String name){
		System.out.println("********产生一个新的Person对象********");
		this.name = name ;
	}
	public Person(String name,int age){
		System.out.println("********产生一个新的Person对象********");
		this.name = name ;
		this.age = age ;
	}
	public String getPersonInfo(){
		return "姓名:" + name + ",年龄:"+age;
	}
}
public class Test{
		public static void main(String[] args) {
			Person per1 = new Person();
			Person per2 = new Person("张三");
			Person per3 = new Person("李四",20);
			System.out.println(per1.getPersonInfo());
			System.out.println(per2.getPersonInfo());
			System.out.println(per3.getPersonInfo());
	}
}

  上述代码中有大量的重复代码,然而Java最忌讳的就是代码的重复书写。在Java中,支持构造方法的互相调用。
修改上述代码:

class Person{
	private String name;
	private int age;
	public Person(){
		System.out.println("********产生一个新的Person对象********");
	}
	public Person(String name){
		this();  //调用本类无参构造
		this.name = name ;
	}
	public Person(String name,int age){
		this(name); //调用本类有参构造
		this.age = age ;
	}
	public String getPersonInfo(){
		return "姓名:" + name + ",年龄:"+age;
	}
}
public class Test{
		public static void main(String[] args) {
			Person per1 = new Person();
			Person per2 = new Person("张三");
			Person per3 = new Person("李四",20);
			System.out.println(per1.getPersonInfo());
			System.out.println(per2.getPersonInfo());
			System.out.println(per3.getPersonInfo());
	}
}

使用this调用构造方法时请注意:

扫描二维码关注公众号,回复: 3659558 查看本文章
  1. this调用构造方法的语句必须在构造方法的首行。
  2. this调用构造方法不允许成环。
    在这里插入图片描述

1.2.3 this表示当前对象

class Person{
	private String name;
	private int age;

	public Person(String name,int age){
        this.name = name;
		this.age = age ;
	}
	public void getPersonInfo(){
		System.out.println(this +" 姓名:" + name + ",年龄:"+age);
	}
}
public class Test{
		public static void main(String[] args) {
			Person per1 = new Person("李四",17);
		    System.out.println("&per1="+per1);
            per1.getPersonInfo();
			Person per2 = new Person("张三",18);
            System.out.println("&per2="+per2);
            per2.getPersonInfo();
	}
}

在这里插入图片描述

2 static关键字

2.1 static属性(类属性)

观察此段代码:

class Person{
	private String name;
	private int age;
    private String schoolName;

    public String getName()
    {
        return name;
    }
    public void setName(String name)
    {
       this.name=name;
    }
    public int getAge()
    {
        return age;
    }
    public void SetAge(int age)
    {
       if(age <= 0)
       {
           System.out.println("年龄输入错误!");
       }
       else
       {
           this.age=age;
       }
    }
     public String getSchoolName()
    {
        return name;
    }
    public void setSchoolName(String schoolName)
    {
       this.schoolName=schoolName;
    }
	//构造方法
    public Person(String name, int age, String schoolName)
    {
        this.name=name;
        this.age=age;
        this.schoolName=schoolName;
    }
    public void getPeopleInfo()
    {
        System.out.println("学校:"+schoolName+"  姓名:"+name+" 年龄:"+age);
    }
}
public class Test{
		public static void main(String[] args) {
		Person per1=new Person("张三",18,"励志中学");
		Person per2=new Person("李四",17,"励志中学");
        per1.getPeopleInfo();
        per2.getPeopleInfo();
	}
}

内存分析图:
在这里插入图片描述
  一个学校里有成千上万个学生,虽然名字各不相同,但是学校名称却是相同的,像上图那样保存学生的信息,会造成系统资源的浪费。
  描述共享属性,只需在属性前添加static关键字即可。
  static属性又称类属性,保存在全局数据区的内存之中,所有对象都可以进行该数据区的访问。通过类名调用,与对象实例化无关。
修改上述代码:public static String schoolName=“励志中学”; //static之前用public修饰

class Person{
	private String name;
	private int age;
    public static String schoolName="励志中学";
    public String getName()
    {
        return name;
    }
    public void setName(String name)
    {
       this.name=name;
    }
    public int getAge()
    {
        return age;
    }
    public void SetAge(int age)
    {
       if(age <= 0)
       {
           System.out.println("年龄输入错误!");
       }
       else
       {
           this.age=age;
       }
    }
    public Person(String name, int age)
    {
        this.name=name;
        this.age=age;
    }
	
    public void getPeopleInfo()
    {
        System.out.println("学校:"+schoolName+"  姓名:"+name+" 年龄:"+age);
    }
}
public class Test{
		public static void main(String[] args) {
		Person per1=new Person("张三",18);
		Person per2=new Person("李四",17);
        per1.getPeopleInfo();
        per2.getPeopleInfo();
        System.out.println(Person.schoolName);
	}
}

在这里插入图片描述
此时的内存分析图如下:

在这里插入图片描述
结论:

  • 访问static属性(类属性)应使用类名称.属性名
  • 所有的非static属性必须在对象实例化后使用,而static属性(类属性)不受对象实例化的控制。若想执行:System.out.println(Person.age);会报错:
    在这里插入图片描述

2.2 static方法(类方法)

  通过类名调用,与对象实例化无关,常见于工具类方法。

class Person{
	private String name;
	private int age;
    public int old;
    public static String schoolName;
    public String getName()
    {
        return name;
    }
    public void setName(String name)
    {
       this.name=name;
    }
    public int getAge()
    {
        return age;
    }
    public void SetAge(int age)
    {
       if(age <= 0)
       {
           System.out.println("年龄输入错误!");
       }
       else
       {
           this.age=age;
       }
    }
    public Person(String name, int age)
    {
        this.name=name;
        this.age=age;
    }
	//静态方法
    public static void setschoolName(String n)
    {
        schoolName=n;
    }
    public void getPeopleInfo()
    {
        System.out.println("学校:"+schoolName+"  姓名:"+name+" 年龄:"+age);
    }
}
public class Test{
		public static void main(String[] args) {
        Person.setschoolName("励志中学");    
		Person per1=new Person("张三",18);
		Person per2=new Person("李四",17);
        per1.getPeopleInfo();
        per2.getPeopleInfo();
	}
}

在这里插入图片描述
关于static方法的说明:

  • 所有的static方法不允许调用任何非static定义的属性或方法。
  • 所有的非static方法允许访问static方法或属性。

猜你喜欢

转载自blog.csdn.net/zhao_miao/article/details/83215435