1、this关键字

this的本质就是“创建好的对象的地址”!  由于在构造方法调用前,对象已经创建。因此,在构造方法中也可以使用this代表“当前对象”

【用法】   1.  在程序中产生二义性之处,应使用this来指明当前对象;普通方法中,this总是指向调用该方法的对象。构造方法中,this总是指向正要初始化的对象。

             2. 使用this关键字调用重载的构造方法,避免相同的初始化代码。但只能在构造方法中用,并且必须位于构造方法的第一句。

               3. this不能用于static方法中。

【代码示例】

  1. class TestThis
  2. {
  3. int a,b,c;
  4. //在构造方法中使用this代表“当前对象” 。够造方法中,this总是指向正要初始化的对象。
  5. TestThis(int a,int b){//1、this作用1:在程序中产生二义性之处,应使用this来指明当前对象,即区分成员变量(如a,b)和局部变量(a,b)
  6. this.a=a;
  7. this.b=b;
  8. }
  9.  
  10. TestThis(int a,int b,int c){
  11. this(a,b); // 此处this(a,b)等价于 this.a=a;| 2、 this作用2:使用this关键字调用重载的构造方法,避免相同的初始化代码
  12. // this.b=b;| 【注意】 只能在构造方法中用,并且必须位于构造方法的第一句。
  13. this.c=c;
  14. }
  15. void sing(){//普通方法
  16. System.out.println("长歌一曲");
  17. }
  18.  
  19. void eat(){
  20. sing(); //调用本类中的方法 sing(),
  21. this.sing(); //this总是指向调用该方法的对象。与上句是一个意思,写不写this无所谓
  22. System.out.println("回家吃饭");
  23. }
  24.  
  25. }
  26.  
  27. public class Test_1126_01
  28. {
  29. public static void main(String[] args) // this 不能用于static方法中,原因:根据内存图,对象和方法区(静态变量,常量等都在这里)
  30. { //虽然都在堆中但是是分开的,this(指当前对象) 是找不到方法区中的字符串的,同理在static同样也找不到普通的属性。
  31. TestThis t1= new TestThis(2,3,7);
  32. System.out.printf("a=%-4d b=%-4d c=%-4d\n",t1.a,t1.b,t1.c);
  33. t1.eat();
  34. }
  35. }

2、static(静态) 关键字

在类中,用static声明的成员变量为静态成员变量,也称为类变量。 类变量的生命周期和类相同

【用法】     1. 为该类的公用变量,属于类,被该类的所有实例共享,在类被载入时被显式初始化。

                2. 对于该类的所有对象来说,static成员变量只有一份。被该类的所有对象共享!

                3. 一般用“类名.类属性/方法”来调用。(也可以通过对象引用或类名(不需要实例化)访问静态成员。)

                4. 在static方法中不可直接访问非static的成员。

【代码示例】

  1. class User
  2. {
  3. int id;//普通变量(普通属性)
  4. String name;
  5. String pwd;
  6. static String company="北京百度"; //静态变量(静态属性)
  7.  
  8. public User(int id,String name){
  9. this.id=id;
  10. this.name=name;
  11. }
  12.  
  13. public void login(){ //普通方法
  14. printCompany();// 3 示例:【非】静态方法login() (普通方法)使用静态方法 printCompany()
  15. System.out.println(company);//【非】静态方法login() (普通方法) 使用静态属性 company
  16. System.out.println("登录:"+name);
  17. }
  18.  
  19. public static void printCompany(){ //静态方法
  20. System.out.println(company);
  21. // login(); 2 示例:调用非静态方法,编译就会报错
  22. }
  23.  
  24. }
  25. // 方法区(内存图右边圈中圈,在堆中) :包含 1、代码 2、静态变量(company)【从属于类】3、静态方法( printCompany())【从属于类】
  26. // 4、字符串常量("北京百度","登录:","李白","深圳腾讯")
  27. // 对象区(对象u1,在堆中):包含:1、普通变量(属性)id=101 ;name=李白(去方法区中找);pwd=null 2、普通方法login()
  28. // |1、静态方法使用静态变量(属性)和静态方法? 可以,都在方法区
  29. // |2、静态方法使用【非】静态变量(属性)和【非】静态方法?不可以,找不到(类加载不一定有对象,有图纸不一定有汽车) 怎么用?new 一个对象
  30. // |3、【非】静态方法(普通方法)使用静态方法和静态属性?可以,有汽车必定有图纸
  31. // |4、this可以用于普通方法里边,不能用于静态方法 ? this代表当前对象,static在类中。它找不到
  32.  
  33. public class Test_1126_02
  34. {
  35. public static void main(String[] args) //主方法 (静态方法)
  36. {
  37. User u1=new User(101,"李白");
  38. u1.login();//2 示例: 静态中使用非静态的方法和属性(普通方法和普通属性) 要通过new 一个对象来实现
  39. System.out.println("-----华丽的分隔符----");
  40. User.printCompany();
  41. User.company="深圳腾讯"; //1 示例: 静态main 方法(用类User直接)使用静态变量(属性)company
  42. User.printCompany(); // 1 示例: 静态main 方法使用静态方法printCompany
  43. }
  44. }

3、静态块(及语句块)

构造方法用于对象的初始化。静态初始化块,用于类的初始化操作! 在静态初始化块中,不能直接访问非static成员。

执行顺序:

  1. 上溯到Object类,先执行Object的静态初始化块,再向下执行子类的静态初始化块,直到我们的类的静态初始化块为止。

  2. 构造方法执行顺序和上面顺序一样!

【代码示例】

  1. //静态块(类)的初始化
  2. class User
  3. {
  4. int id;
  5. String name;
  6. String pwd;
  7. static String company;
  8. static // 静态块(语句块加个static),用于对类的初始化,用static修饰 它不是一个方法。类初始化时执行
  9. {
  10. System.out.println("执行类的初始化:静态块");
  11. company="北京百度";
  12. printCompany();
  13. System.out.println("---------");
  14.  
  15. }
  16.  
  17. public User(){ //构造方法
  18. System.out.println("构造方法");
  19.  
  20. }
  21.  
  22. { //构造块
  23. System.out.println("构造块");
  24. }
  25.  
  26. public static void printCompany(){ //静态方法
  27.  
  28. System.out.println(company);
  29. }
  30. }
  31.  
  32. public class Test_1126_03
  33. {
  34.  
  35. public static void main(String[] args)
  36. {
  37.  
  38. User u1=new User(); //加载类时,执行静态块中的内容.静态块如果写在主类里,这句不要也会打印输出,但是在此题中静态块在非主类(User)中,
  39. User u2=new User(); //必须new User()之后,才会打印输出
  40.  
  41. } //执行顺序: 静态块(仅执行1次,不管几个对象) 》 构造块 》构造方法 (构造块和构造方法,几个对象执行几次)
  42.  
  43. }

[18/11/26] this关键字、static关键字和静态块(及语句块)的更多相关文章

  1. 五、java基础-关键字this_static_super_abstract_final,finalize()方法finally语句块

    1.关键字this 含义:this 是一个引用类型,代表当前对象,引用类型里面必然保存内存地址,在堆中的每个对象中存储,保存内存地址指向自身. 用法: 1)this可以用在成员方法中,里面保存内存地址 ...

  2. 总结 接口 final关键字 abstract关键字 static 关键字

    final关键字: * final 修饰的方法能被继承 不能被重写 * final修饰的类不能被继承 * final 修饰的变量(基本类型)不能被修改 * final 修饰的成员变量必须初始化 局部变 ...

  3. 18 11 26 用多进程 多线程 携程 实现 http 服务器的创建

    下面是一个  多进程 服务器的创建 import socket import re import multiprocessing def service_client(new_socket): &qu ...

  4. this关键字、static关键字、block块、封装类以及继承、import、修饰符的初步了解

    this关键字 定义 在类的方法定义中使用this关键字代表使用该方法的引用. this即"自己",代表对象本身,谁调用代表谁.在成员方法中或构造器中隐式的传递. this的两种用 ...

  5. C/C++中static关键字详解

    静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可以改变其值. 静态变量或静态函数只有本文件内的代码才能访问它,它的名字在其它文件中不可见.用法1:函数内部声明 ...

  6. C/C++中static关键字详解-zz

    静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可以改变其值. 静态变量或静态函数只有本文件内的代码才能访问它,它的名字在其它文件中不可见.用法1:函数内部声明 ...

  7. 【转载】C++中的static关键字的总结

    本文前半部分转自:博主chao_yu 本文后半部分转自:博主VincentCZW 静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可以改变其值. 静态变量或静态 ...

  8. abstract关键字及static关键字

    抽象关键字abstract 抽象类 在类前加上关键字abstract可以将此类变成抽象类.抽象类不允许通过new关键字实例化,但是可一通过其子类向上转型为其创建实例. 抽象类可以有抽象方法,也可以没有 ...

  9. C语言static关键字

    C语言static关键字 static关键字的作用,主要从在程序的生存周期.作用域和在代码段中的位置起作用. 全局变量 静态全局变量 局部变量 静态局部量 生存周期 程序运行到结束 程序运行到结束 函 ...

随机推荐

  1. oracle 笔记---(六)__表空间

    查看表空间的大小 select tablespace_name,block_size,contents from dba_tablespaces; 查看表空间对应的数据文件 select file_n ...

  2. Oracle RAC集群搭建(二)-基础环境配置

    01,创建用户,用户组 [root@rac1 ~]# groupadd -g 501 oinstall [root@rac1 ~]# groupadd -g 502 dba [root@rac1 ~] ...

  3. Lua初探

      官方网站:http://www.lua.org/ 三方模块:https://luarocks.org/ 介绍安装luarocks语法注释标示符关键字全局变量数据类型变量赋值索引循环流程控制函数可变 ...

  4. 如何在vue && webpack 项目中的单文件组件中引入css

    引入方式很简单,就是在script下使用require()即可. 因为import 是import...from 的形式,所以是不需要的. <script> import {mapStat ...

  5. html5中新增的语义化的标签

    html5是html最新的修订版本,2014年10月由万维网联盟(W3C)完成标准制定.目标是取代1999年所制定的HTML 4.01和XHTML 1.0标准,以期能在互联网应用迅速发展的时候,使网络 ...

  6. TOJ 4393 Game

    描述 Bob always plays game with Alice.Today,they are playing a game on a tree.Alice has m1 stones,Bob ...

  7. c#字典排序

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  8. AtCoder Grand Contest 023 C - Painting Machines

    Description 一个长度为 \(n\) 的序列,初始都为 \(0\),你需要求出一个长度为 \(n-1\) 的排列 \(P\), 按照 \(1\) 到 \(n\) 的顺序,每次把 \(P_i\ ...

  9. C# url获取图片流转字符串

    //http url获取图片流转字符串 //string url = serverUrl.TrimEnd('/') + PUrl; //WebRequest request = WebRequest. ...

  10. 模糊查询-动态参数,防SQL注入

    WHERE("title like '%'+#{keyWord}+'%'"); -MS SQL WHERE("title like concat('%',#{keyWor ...