博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[18/11/26] this关键字、static关键字和静态块(及语句块)
阅读量:5009 次
发布时间:2019-06-12

本文共 4433 字,大约阅读时间需要 14 分钟。

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 27 28     public static void printCompany(){ //静态方法29 30         System.out.println(company);  31     }32 }33 34 35 public class Test_1126_03 36 {37 38     public static void main(String[] args) 39     {40 41         User u1=new User(); //加载类时,执行静态块中的内容.静态块如果写在主类里,这句不要也会打印输出,但是在此题中静态块在非主类(User)中,42         User u2=new User();           //必须new User()之后,才会打印输出43     44     }        //执行顺序:  静态块(仅执行1次,不管几个对象) 》 构造块 》构造方法 (构造块和构造方法,几个对象执行几次)          45 46 }

 

转载于:https://www.cnblogs.com/ID-qingxin/p/10017395.html

你可能感兴趣的文章
[Grunt] grunt.template
查看>>
Ubuntu最小化桌面快捷键Super+D不生效解决
查看>>
Cookie&Session会话跟踪技术
查看>>
UNIX环境高级编程 第17章 高级进程间通信
查看>>
ES的Zen发现机制
查看>>
【hibernate】1、Hibernate的一个注解 @Transient
查看>>
HihoCoder 1877 - Approximate Matching
查看>>
Elastic Search 语法总结
查看>>
py自动化之环境配置
查看>>
Winodws SNMP服务安装和配置(Windows 2003 & 2008 R2)
查看>>
红黑树-想说爱你不容易
查看>>
【题目】英文字符进行频率的统计,直方图输出
查看>>
LeetCode-Binary Tree Level Order Traversal
查看>>
COM组件开发实践
查看>>
yii2 源码分析1从入口开始
查看>>
浅谈网站推广
查看>>
Away3D基础之摄像机
查看>>
Leetcode 128. Longest Consecutive Sequence
查看>>
程序员必须知道的几个Git代码托管平台
查看>>
导电塑料入梦来
查看>>