this,static关键字

一.this关键字

我们之前使用this关键字调用本类的属性,那么除此之外this还有其他用法。 假如有一个类中有多个构造方法,要求每个构造方法都能完成某一项功能,但是这些功能都是一样的。于是就出现了重复的代码。
例子:

 class Person{ 
    int age;
    String name;
    String school;
    public Person(){ 
      System.out.println("我是一个构造方法");
    } 
    public Person(int age){ 
      this.age=age;
      System.out.println("我是一个构造方法");
    } 
    public Person(int age,String name){ 
      this.age=age;
      this.name=name;
      System.out.println("我是一个构造方法");
    } 
    public Person(int age,String name,String school){ 
      this.age=age;
      this.name=name;
      this.school=school;
      System.out.println("我是一个构造方法");
    } 
    public String getInfo(){ 
      return "名字是:"+this.name+", 年龄是:"+this.age+", 学校是:"+this.school;
    } 
 } 
 public class Demo{ 
    public static void main(String[] args){ 
      System.out.println(new Person(12,"航三","南京大学").getInfo()); 
    } 
}

上面的代码四个构造方法都完成了一个共同的功能(输出一句话),假如这项功能需要三百行代码完成,那么就会出现大量的重复代码,于是我们使用this()的形式来实现构造方法之间的互相调用,就可以解决重复的代码

范例:使用this()实现构造方法之间的调用

   class Person{ 
    int age;
    String name;
    String school;
    public Person(){ 
      System.out.println("我是一个构造方法");
    } 
    public Person(int age){ 
      this();//调用了无参数的构造方法
      this.age=age;
    } 
    public Person(int age,String name){ 
      this(age);//调用的是单参数的构造方法
      this.name=name;
    } 
    public Person(int age,String name,String school){ 
      this(age,name);//调用两个参数的构造方法
      this.school=school;
    } 
    public String getInfo(){ 
      return "名字是:"+this.name+", 年龄是:"+this.age+", 学校是:"+this.school;
    } 
 } 
 public class Demo{ 
    public static void main(String[] args){ 
      System.out.println(new Person(12,"航三").getInfo()); 
    } 
}

上面可以使用this()的方式实现构造方法之间的调用,那么在使用this()的时候需要注意哪些问题?需要注意如下两点:
· this()必须放到构造方法中的第一行
· this()实现构造方法调用的时候不能出现递归调用

范例:错误的代码1

   class Person{ 
    int age;
    String name;
    String school;
    public Person(){ 
      System.out.println("我是一个构造方法");
    } 
    public Person(int age){ 
      this();//调用了无参数的构造方法
      this.age=age;
    } 
    public Person(int age,String name){ 
        this.name=name;
//------------------------错误的地方---------------------
        this(age);//调用的是单参数的构造方法
    } 
    public Person(int age,String name,String school){ 
      this(age,name);//调用两个参数的构造方法
      this.school=school;
    } 
    public String getInfo(){ 
      return "名字是:"+this.name+", 年龄是:"+this.age+", 学校是:"+this.school;
    } 
 } 
 public class Demo{ 
    public static void main(String[] args){ 
      System.out.println(new Person(12,"航三").getInfo()); 
    } 
}

以上代码会出现“Demo.java:14: 错误: 对this的调用必须是构造器中的第一个语句
this(age);//调用的是单参数的构造方法” 的错误。

范例:错误的代码2

  class Person{ 
    int age;
    String name;
    String school;
    public Person(){ 
//--------------------------错误的地方---------------------------
      this();  //这行不要
      System.out.println("我是一个构造方法");
    } 
    public Person(int age){ 
      this();//调用了无参数的构造方法
      this.age=age;
    } 
    public Person(int age,String name){ 
          this(age);//调用的是单参数的构造方法
        this.name=name;
    } 
    public Person(int age,String name,String school){ 
      this(age,name);//调用两个参数的构造方法
      this.school=school;
    } 
    public String getInfo(){ 
      return "名字是:"+this.name+", 年龄是:"+this.age+", 学校是:"+this.school;
    } 
 } 
 public class Demo{ 
    public static void main(String[] args){ 
      System.out.println(new Person(12,"航三").getInfo()); 
    } 
}

上面代码证明了在使用this()实现构造之间的调用的时候不能出现递归的现象。

this关键字表示当前对象
当前对象就是内存中正在运行的对象,那么this在这里保存的是当前对象的地址引用。

范例:this保存当前对象在堆内存中的地址引用

 class Person{ 
    public void getInfo(){ 
      System.out.println(this);
    } 
 } 
 public class Demo{ 
    public static void main(String[] args){ 
       Person per1=new Person();
       System.out.println(per1);//输出的内容是对象的地址引用
       per1.getInfo();//输出的this保存的内容
    } 
}

以上代码两个输出语句的内容一致,说明了: this保存的就是当前对象地址的引用。

二、 static关键字
static 修饰的属性叫做静态属性(类变量),static 修饰的方法叫做静态方法(类方法)

当信息相同的时候,会造成资源的浪费,可将重复的信息声明为静态属性(static修饰的属性)。
范例:将重复的信息声明为static属性

    class Person{ 
    int age;
    String name;
    static String school;
    public Person(){ 
      System.out.println("我是一个构造方法");
    } 
    public Person(int age){ 
      this();//调用了无参数的构造方法
      this.age=age;
    } 
    public Person(int age,String name){ 
       this(age);//调用的是单参数的构造方法
        this.name=name;
    } 
    public Person(int age,String name,String school){ 
      this(age,name);//调用两个参数的构造方法
      this.school=school;
    } 
    public String getInfo(){ 
      return "名字是:"+this.name+", 年龄是:"+this.age+", 学校是:"+this.school;
    } 
 } 
 public class Demo{ 
    public static void main(String[] args){ 
      System.out.println(new Person(12,"航三","南京大学").getInfo()); 
      System.out.println(new Person(18,"李四","南京大学").getInfo()); 
      System.out.println(new Person(35,"王五","南京大学").getInfo()); 
    } 
}

静态属性有哪些要注意的地方呢?
·静态属性不依赖于对象的存在而存在,可以使用“类名.静态属性名”的方式访问。所以有人称静态属性叫做类变量。
范例:静态属性可以使用“类名.属性名”访问

 class Person{ 
 int age;
    String name;
//-------------------静态变量的声明---------------------
    static String school;
    public Person(){ 
      System.out.println("我是一个构造方法");
    } 
    public Person(int age){ 
      this();//调用了无参数的构造方法
      this.age=age;
    } 
    public Person(int age,String name){ 
       this(age);//调用的是单参数的构造方法
        this.name=name;
    } 
    public Person(int age,String name,String school){ 
      this(age,name);//调用两个参数的构造方法
      this.school=school;
    } 
    public String getInfo(){ 
      return "名字是:"+this.name+", 年龄是:"+this.age+", 学校是:"+this.school;
    } 
 } 
 public class Demo{ 
    public static void main(String[] args){ 
      System.out.println(Person.school);  //----------静态调用。-------------
      System.out.println(Person.name);
    } 
}

!!一个地方修改了静态属性,那么对其他对象也有影响
例子:

class Person{ 
    int age;
    String name;
    static String school;
    public Person(){ 
      System.out.println("我是一个构造方法");
    } 
    public Person(int age){ 
      this();//调用了无参数的构造方法
      this.age=age;
    } 
    public Person(int age,String name){ 
       this(age);//调用的是单参数的构造方法
        this.name=name;
    } 
    public Person(int age,String name,String school){ 
      this(age,name);//调用两个参数的构造方法
      this.school=school;
    } 
    public String getInfo(){ 
      return "名字是:"+this.name+", 年龄是:"+this.age+", 学校是:"+this.school;
    } 
 } 
 public class Demo{ 
    public static void main(String[] args){ 
      Person per1=new Person();
      per1.school="北京大学";
      System.out.println(per1.getInfo());
      Person per2=new Person();
      System.out.println(per2.getInfo());
    } 
}

三、静态方法
静态方法:就是使用static 关键字修饰的方法。
例子:

class Person{ 
    int age;
    String name;
    static String school;
    public Person(){}
    public Person(int age,String name,String school){ 
      this.age=age;
      this.name=name;
      this.school=school;
    } 
    public  String getInfo(int age){ 
      return "名字是:"+this.name+", 年龄是:"+this.age+", 学校是:"+this.school;
    } 
    public static void  say(){ //静态方法
      System.out.println("这是一个静态方法");
    } 
 } 
     

 public class stringtest{ 
    public static void main(String[] args){ 
//-----------------------静态方法调用-------------------
        Person.say();//没有实例化对象依然可以调用

        //  Person.getInfo();//这是一个普通方法  ---------这样写会报错----------
               Person per = new  Person();
        per.getInfo(1);//这是一个普通方法
    } 
}

** 静态方法不依赖于实例化对象的存在而存在,可以使用“类名.静态方法名”访问

例子:

class Person{ 
   int age;
    String name;
    static String school;
    public Person(){}
     
    public Person(int age,String name,String school){ 
      this.age=age;
      this.name=name;
      this.school=school;
    } 
    public  String getInfo(int age){ 
      return "名字是:"+this.name+", 年龄是:"+this.age+", 学校是:"+this.school;
    } 
    public static void  say(){ //静态方法
      System.out.println("这是一个静态方法");
//------------------------------- 错误的地方 -------------------------------------
      System.out.println("名字是:"+name);//在静态方法中访问普通属性
    } 
 }  

以上的代码出现了“Demo.java:17: 错误: 无法从静态上下文中引用非静态 变量 name”的错误

**·静态方法中不能访问普通属性

例子:

 class Person{ 
    int age;
    String name;
    static String school;
    public Person(){}
     
    public Person(int age,String name,String school){ 
      this.age=age;
      this.name=name;
      this.school=school;
    } 
    public  String getInfo(int age){ //普通方法
      return "名字是:"+this.name+", 年龄是:"+this.age+", 学校是:"+this.school;
    } 
    public static void  say(){ //静态方法
//------------------------------错误的地方------------------------------------
       getInfo();//在静态方法中调用普通方法
    } 
 } 
 public class Demo{ 
    public static void main(String[] args){ 
       Person.say();//没有实例化对象依然可以调用 
    } 
}

以上代码出现了“Demo.java:16: 错误: 无法将类 Person中的方法 getInfo应用到给定类型;”的错误

**·静态方法中不能发出对普通方法的调用

例子:

class Person{ 
   int age;
    String name;
    static String school;
    public Person(){}
    public Person(int age,String name,String school){ 
      this.age=age;
      this.name=name;
      this.school=school;
    } 
    public  String getInfo(int age){ //普通方法
      return "名字是:"+this.name+", 年龄是:"+this.age+", 学校是:"+this.school;
    } 
    public static void  say(){ //静态方法
//--------------------------------错误的地方-----------------------------------
       System.out.println(this.school);//在静态方法中不能使用this关键字
    } 
 } 

以上的代码出现了“Demo.java:15: 错误: 无法从静态上下文中引用非静态 变量 this
System.out.println(this.school);”的错误,

**·证明了静态方法中不能使用this关键字

总结 :
说明静态属性(static修饰)和普通属性的区别
·静态属性不依赖于对象而存在,可以使用“类名.属性名”的方式访问,除此之外还可以使用“对象名.属性名”访问。而普通方法依赖于对象的存在,只能使用“对象名.属性名”的方式访问。
·静态属性保存在全局数据区,是在编译期进行了内存的分配,而普通属性是在运行期进行内存的分配,而且在堆内存中分配空间。
·静态属性可以在静态方法中访问,而普通属性不能在静态方法中访问。

静态方法中不能使用this关键字
静态方法中不能发出对普通方法的调用
静态方法中不能访问普通属性

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容