浅谈this和static

一.this关键字

一个比较经典的使用:

输出的结果是:12

1.this关键字只能在方法的内部使用,表示对“调用方法的那个对象”的引用,this的用法和其他对象引用并无不同。注意一点:在方法的内部调用同一个类的其他方法,不必使用this,直接调用即可。

2.当需要返回当前对象的引用的时候,可以借助this。

3.当方法的形参与成员变量重名的时候,可以用this区分

 

从两次显示的结果不同可以知道,当形参和成员变量重名的时候,如果不用this加以区分,虚拟机也无法区分方法中的i到底是指向成员变量还是形参,不过这里有一个原则,当无法确定的时候,取离参数最近的声明,即就近声明原则。

4.使用this,在构造器中调用构造器

注意:除构造器之外,编译器禁止在任何其他方法中调用构造器。

二.static关键字

在java中并不存在全局变量的概念,static修饰的变量可以看做是一个伪全局的概念,static表示“全局”或者“静态”的意思,常用用法有如下三种:

1.修饰变量

static修饰的变量,通常我们称之为静态变量,未用static修饰的变量称为实例变量,两者的区别是:静态变量是类的公用变量,在类加载的是时候初始化,并且仅初始化一次,对类的所有对象来说,static成员变量只有一份,对象之间借助静态变量可进行数据共享。实例变量则伴随着对象的实例化,每创建一个对象就会产生一个实例变量,同一个类的不同对象的实例变量的值可能不同。static成员变量的初始化顺序按照定义的顺序进行初始化。

2.修饰方法

static修饰的方法,一般称为静态方法,静态方法不依赖于任何对象就能进行访问,通过类名可以直接访问静态方法和静态变量。静态方法中不能使用thi关键字,同样静态方法中不能访问非静态成员变量和非静态成员方法,但是在非静态成员方法中可以访问静态变量和静态方法。因此,如果说想在不创建对象的情况下调用某个方法,就可以将这个方法设置为static。我们最常见的static方法就是main方法,至于为什么main方法必须是static的,现在就很清楚了。因为程序在执行main方法的时候没有创建任何对象,因此只有通过类名来访问。

3.修饰代码块

static关键字还能修饰代码块,用来形成静态块以优化程序的性能。static块可以出现在类中的任何地方(除了方法内部,任何方法),类中可以有多个静态块,在类加载的时候,会按照static块的顺序来执行每个static块,并且只执行一次。

static关键字常见误区:

static关键能改变类中成员变量的访问权限?答案是不能,Java中的static关键字不会影响到变量或者方法的作用域,在Java中能够影响到访问权限的只有private、public、protected(包括包访问权限)这几个关键字

static能修饰局部变量?不能,java语法规定,static是不允许用来修饰局部变量。

static方法中能使用this?不能,很明显,在静态方法中不能使用this关键字,静态方法可以通过类访问,当通过类访问的时候,this指向的对象也许还未产生。

this能访问静态变量?是可以的,静态成员变量虽然独立于对象,但是不代表不可以通过对象去访问,所有的静态方法和静态变量都可以通过对象访问(只要访问权限足够)。

静态块可以出现在类的任何地方?答案是不能,在方法内部,在任何方法内部都不行。

原文地址:https://www.cnblogs.com/liupiao/p/9231615.html

时间: 2024-10-26 09:21:50

浅谈this和static的相关文章

浅谈游标选项 Static|Keyset|DYNAMIC|FAST_FORWARD

接好久之前太监的一篇Blog.现在补充几个选项的介绍 所用的语句都是这个 IF OBJECT_ID('T1') IS NOT NULL DROP TABLE T1 GO CREATE TABLE T1 ( ID INT PRIMARY KEY, seq INT ) DECLARE @seq INT=0 WHILE @seq < 50 BEGIN INSERT INTO dbo.T1 ( ID,seq ) VALUES ( @seq+1,@seq) SET @seq=@seq+1 END 1 DE

转载 浅谈C/C++中的static和extern关键字

浅谈C/C++中的static和extern关键字 2011-04-21 16:57 海子 博客园 字号:T | T static是C++中常用的修饰符,它被用来控制变量的存贮方式和可见性.extern "C"是使C++能够调用C写作的库文件的一个手段,如果要对编译器提示使用C的方式来处理函数的话,那么就要使用extern "C"来说明.本文主要介绍C/C++中的static和extern关键字. AD: static是C++中常用的修饰符,它被用来控制变量的存贮方

.net中对象序列化技术浅谈

.net中对象序列化技术浅谈 2009-03-11 阅读2756评论2 序列化是将对象状态转换为可保持或传输的格式的过程.与序列化相对的是反序列化,它将流转换为对象.这两个过程结合起来,可以轻松地存储和传输数 据.例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象.反之,反序列化根据流重新构造对象.此外还可以将对象序列化后保存到本地,再次运行的时候可以从本地文件 中“恢复”对象到序列化之前的状态.在.net中有提供了几种序列化的方式:二进制序列化

浅谈Android多屏幕的事

浅谈Android多屏幕的事 一部手机可以同时看片.聊天,还可以腾出一支手来撸!这么吊的功能(非N版本,非第三方也能实现,你不知道吧)摆在你面前,你不享用?不关注它是怎样实现的?你来,我就满足你的欲望! 一部手机可以同时看片.聊天,还可以腾出一支手来撸==!就像这样: 是时候告别来回切换应用屏幕的酸爽了,还可以在分屏模式下两Activity间直接拖放数据! 好高大上的样子!这是怎么实现的?别急,我们一一道来: kitkat(4.4)版本对多任务分屏的实现 由于相关的代码和功能被封装及隐藏起来,所

【转】浅谈Java中的equals和==

浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str2 = new String("hello"); 3 4 System.out.println(str1==str2); 5 System.out.println(str1.equals(str2)); 为什么第4行和第5行的输出结果不一样?==和equals方法之间的区别是什么?如果在初

浅谈算法和数据结构

: 一 栈和队列 http://www.cnblogs.com/yangecnu/p/Introduction-Stack-and-Queue.html 最近晚上在家里看Algorithems,4th Edition,我买的英文版,觉得这本书写的比较浅显易懂,而且“图码并茂”,趁着这次机会打算好好学习做做笔记,这样也会印象深刻,这也是写这一系列文章的原因.另外普林斯顿大学在Coursera 上也有这本书同步的公开课,还有另外一门算法分析课,这门课程的作者也是这本书的作者,两门课都挺不错的. 计算

浅谈移动前端的最佳实践(转)

前言 这几天,第三轮全站优化结束,测试项目在2G首屏载入速度取得了一些优化成绩,对比下来有10s左右的差距: 这次优化工作结束后,已经是第三次大规模折腾公司框架了,这里将一些自己知道的移动端的建议提出来分享下,希望对各位有用 文中有误请您提出,以免误人自误 技术选型 单页or多页 spa(single page application)也就是我们常常说的web应用程序webapp,被认为是业内的发展趋势,主要有两个优点: ① 用户体验好 ② 可以更好的降低服务器压力 但是单页有几个致命的缺点:

浅谈JDK的File.equal()

我们一般比较两个文件对象是否同一个文件,一般会使用java.io.File.equal().这里所说的equal()并不是比较文件内容是否一样,而是看两个文件对象是否指向同一个文件. File的equal()方法,实际上调用了当前文件系统FileSystem的compareTo(). public boolean equals(Object obj) { if ((obj != null) && (obj instanceof File)) { return compareTo((File

java serialize 浅谈

对象的串行化(Serialization) 一.串行化的概念和目的 1.什么是串行化             对象的寿命通常随着生成该对象的程序的终止而终止.有时候,可能需要将对象的状态保存下来,在需要时再将对象恢复.我们把对象的这种能记录自己的状态以便将来再生的能力.叫作对象的持续性(persistence).对象通过写出描述自己状态的数值来记录自己 ,这个过程叫对象的串行化(Serialization) .串行化的主要任务是写出对象实例变量的数值.如果交量是另一对象的引用,则引用的对象也要串