Java中this关键字和static关键字
文章目录
1 this关键字
this关键字主要有三个方面的用途:
- this表示本类属性。
- this表示本类方法。
- 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调用构造方法时请注意:
- this调用构造方法的语句必须在构造方法的首行。
- 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方法或属性。