您的位置:首页 > 编程语言 > Java开发

Java中的this、super、static和final关键字的详解

2017-06-11 23:00 691 查看
什么是this:表示当前对象。

this主要存在两个位置:

构造器中:  
就表示当前创建的对象
方法中:      哪一个对象调用this所在的方法,那么此时this就表示哪一个对象。

当一个对象创建之后,JVM会分配一个引用自身的引用:this

使用this:

1、解决成员变量和参数(局部变量)之间的二义性,必须使用;

2、同类中实例方法间互调(此时可以省略);

3、将this作为参数传递给另一个方法;

4、将this作为方法的返回值(链式方法编程);

5、构造器重载的互调,this作为(参数)必须写在构造方法第一行;

6、static不能和this一起使用。
当字节码被加载进JVM,static成员已经存在了,但是此时对象还没有创建,没有对象就没有this。

创建对象并给对象设置初始值有两种方式:

方式一:
先通过无参数构造器创建出一个对象,再通过对象调用相应的setter方法。
方式二:直接调用带参数的构造器,创建出来的对象,就有了初始值。

通过setter方法和通过构造器都可以完成相同的功能,那么该如何选择呢:

1、
如果存在带参数的构造器,方式二比较简洁;
2、如果在构建对象的时候需要初始化多个数据,如果使用方式二,那么构造器得提供N个参数,参数过多,不直观。此时方式一,简单明了。

3、特殊情况,如果在构建对象的时候需要一个值来构建,那么这时就需要用构造器方式(比如构建一个圆对象,需要先知道半径这个值)。

super:

现在有一个需求:在子类中的某一个方法,去掉用父类被覆盖的方法,应如何调用??

此时的解决方案:使用super关键字。

什么是super:

this:
当前对象,水调用this所在的方法,this就是哪一个对象;
super:当前对象的父类对象。

子类初始化过程:创建子类对象的过程

在创建子类对象之前,会先创建父类对象。

调用子类构造器之前,在子类构造器中会先调用父类构造器,默认调用的是父类的无参构造器。

1、如果父类不存在可以被子类访问的构造器,则不能存在子类。

2、如果父类没有提供无参数构造器,此时子类必须显示通过super语句去调用父类带参数的构造器。

super关键字的使用场景:

1、可以使用super解决子类隐藏了父类的字段情况,该情况我们一般不讨论,因为破坏封装;

2、在子类方法中,调用父类覆盖的方法,引出super的例子,此时必须使用super;

3、在子类构造器中,调用父类构造器,此时必须使用super语句:super([实参])。

static不能和this、super共存。

static:

static的使用原因:

状态和行为应该有对象和类型之分:
有的状态和行为应该属于对象,不同的对象,状态和行为可以不一样;
有的状态和行为应该属于类型,不属于对象。
要解决这种情况就要使用static来解决。

static修饰符表示静态的,可修饰字段、方法、内部类,其修饰成员属于类,也就是说static修饰的资源属于类,而不是对象级别。

static的真正作用:用来区别字段、方法、内部类和初始化块代码是属于对象的,还是属于类本身的。

static修饰符特点:

1. static修饰的成员(字段和方法),随着所在类的加载而加载;

当JVM把字节码进JVM的时候,static修饰的成员已经在内存中存在了。

2. 优先于对象的存在;

对象是我们通过new关键的创建出来的

3. Static修饰的成员被该类型的所有对象所共享;

根据该类创建出来的任何对象,都可以访问static成员。

注意:表面上通过对象去访问static成员,其本质依然使用类名访问,和对象没有任何关系

4. 直接使用类名访问static成员。

因为static修饰的成员直接属于类,不属于对象,所以可以直接使用类名访问static成员。

类成员和实例成员的访问:

类中的成员:字段,方法,内部类
类成员:     使用static修饰的成员
实例成员:  没有使用static修饰的成员

类成员只能访问类成员,实例成员只能访问实例成员;

类成员:      
直接属于类,可以通过类来访问static字段和static方法;
实例成员:   只属于对象,通过对象来访问非static字段和非static方法;

(对象其实可以访问类成员,但是底层依然使用类名访问)

在static方法中,只能调用static成员。

非static方法,可以访问静态成员,也可以访问实例成员。

什么时候定义成static的字段和方法:

如果这一个状态/行为属于整个事物(类),就直接使用static修饰,被所有对象所共享。

在开发中,往往把工具类方法使用static修饰

如果不使用static修饰,则这些方法属于该类的对象,我们得先创建对象再调用方法,在开发中工具对象只需要一份即可,

可能创建N个对象,此时我们往往把该类设计为单例的,但是还是有点麻烦。

所以,一般的,在开发中设计工具方法,为了调用简单,我们使用static。

static成员的使用:

优点:
对对象的共享数据进行单独空间的存储,节省空间,没有必要每一个对象都存储一份,可以直接被类名调用。
缺点:生命周期过长,static多了占内存。

final修饰符:

为什么需要使用final修饰符:
继承关系最大的弊端就是破坏封装,子类能访问父类的实现细节,而且可以通过方法覆盖的形式修改实现细节。


final本身的含义是“最终的,不可改变的”,它可以修饰非抽象类、非抽象方法和变量。

注意:构造方法不能使用final修饰,因为构造方法是最终的,肯定不能被继承。

final修饰的类:表示最终的类,该类不能再有子类;
final修饰的方法:最终的方法,该方法不能被子类覆盖;
final修饰的变量:最终的变量,常量,该变量只能被赋值一次,不能再赋值。

建议多打代码实现一下,这样记忆更深!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  this super static final